Class 이해를 위한 예제 만들어보기
객체 지향 프로그래밍이란? - OOP(Object Oriented Programming)
객체지향에 대한 이해를 제대로 다루려면 내용이 많이 길어지기 때문에,
클래스 이해를 위하여 간단하게 겉핥기 형식으로 서술하겠다.
객체 지향 프로그래밍은 우리의 현실세계와 밀접한 관련이 있으며, 현실세계를 기반으로 모델링하여
컴퓨터 프로그램으로 나타내는 것이다.
현실세계의 모든 것들은 객체로 표현할수가 있고 각각 서로 다른 객체는 유기적으로 상호작용을 한다.
예를 들어서 담배라는 객체는 라이터라는 객체로 불을 피우고, 인간이라는 객체가 그 담배를 피운다.
이것이 일련의 프로그램이 동작하는 과정인것이다.
객체 기반 프로그래밍은 클래스를 기반으로 구현 되어 있으며, 여기에서 클래스는 만들어질 객체가 가질
속성과 기능을 담고 있다(설계도).
예를 들어서 인간이라는 객체가 클래스를 기반으로 만들어졌다면,
키, 눈동자의 색, 코의 높이, 성격, 혈액형 등은 인간이라는 객체의 속성이고,
달리기, 숨쉬기, 팔의 움직임, 식사, 배변활동 등은 인간이라는 객체의 기능이다.
객체 지향 프로그래밍의 기본 개념으로 추상화, 캡슐화 등등 여러 개념이 있지만 여기서는 패스하도록 하겠다.
클래스란?
- 클래스는 자료형이다.
- 클래스는 객체를 정의해놓은 것이다.(객체가 가지는 속성과 기능을 정의)
- 객체와 클래스는 다르다.
- 객체는 클래스를 바탕으로 메모리에 만들어진 실체다.
- 클래스가 설계도라면 객체는 완성품이다.(자동차의 설계도와 생산된 자동차의 관계)
- public class의 이름은 파일의 이름과 동일하다.(필수사항)
- 하나의 파일에 하나의 클래스를 정의하는것을 권장한다.
- 객체 지향 프로그래밍은 객체들의 상호작용으로 동작한다.
클래스에는?
- 클래스는 객체가 가져야할 속성과 기능이 정의되어 있고 이것들이 member로서 구성되어있다.
- 여기서 말하는 속성은 필드(변수), 기능은 메서드(함수)이다.
문두에는 객체를 인간으로써 예를 들었지만, 왜 클래스가 설계도의 역할을 수행하는지 이해를 돕기위해,
우리가 자주보는 TV를 예로 들어보자.
클래스를 위한 예시
TV(객체)가 만들어지기 위해서는 설계도(class)가 필요할 것이고, 그 설계도에는 TV의 속성(변수)과 기능(메소드)을 담고 있을 것이다.
TV의 음량, 화면밝기, 채널, 전원, 크기, 디자인, 브랜드명 등은 TV의 속성일 것이고,
TV의 전원on/off기능, 채널 이동기능, 음량조절기능, 밝기조절기능 등은 TV가 갖고있는 기능일 것이다.
이 설계도를 기반으로 만들어진 완성품 TV는 객체이고, 한장의 설계도가 있으면 TV를 여러대 생산할 수 있다(객체생성).
이것을 간단하게 코드로 구현하면 다음과 같다.
↓↓펴보기↓↓
package classEx;
// TV 설계도 (class)
public class TV {
// 멤버 필드(변수)(속성)
// - 전원, 음량, 밝기, 포트종류, 채널, 색상, 크기...
String brand;
boolean power;
int channel;
int volume;
// 멤버 메서드(함수)(기능)
// 전원 on/off, 채널+/-, 음량+/-, 화면 출력, 설정...
void power() {
power = !power;
if(power) {
System.out.println("전원이 켜집니다.");
display();
}else {
System.out.println("전원이 꺼집니다.");
display();
}
}
void display() {
System.out.println("["+brand+"TV]");
if(power) {
System.out.println("채널 : " + channel);
System.out.println("볼륨 : " + volume);
}else {
System.out.println("꺼져있음");
}
System.out.println("-----------------------");
}
void channelUp() {
if(power) {
System.out.println(++channel);
display();
}
}
void channelDown() {
if(power) {
System.out.println(--channel);
display();
}
}
void volumeUp() {
if(power) {
System.out.println(++volume);
display();
}
}
void volumeDown() {
if(power) {
System.out.println(++volume);
display();
}
}
}
이제 위의 설계도(class)를 기반으로 TV를 생산(개체를 생성)하기 위해서는 new라는 생성자를 사용한다.
TV tv = new TV();
TV 한대를 생산해 보았으니 이 코드에 대하여 분석해 본다면,
new라는 생성자로 TV 객체를 생성하여 TV라는 클래스 자료형의 tv라는 임의의 변수에 대입한다.
이것을 tv가 객체를 참조한다고 한다.
객체는 만들어지면 Garbage Collector Heap이라는 메모리 영역에 생성이 되고
tv라고 소문자로 이루어진 변수는 stack에 생성이 된다.
그리고 tv라는 변수는 만들어진 객체의 값을 직접 갖고있는것이 아닌 Heap에 있는 객체를 참조하는 값을 갖고있다.

이렇게 생성된 tv는 TV객체를 참조하며 . (도트연산자)로 각 멤버에 접근할수 있다.
객체를 생성하였으므로 클래스에서 정의한 필드와 메소드가 사용이 가능해진다.

위에 만든 클래스의 코드를 실제로 동작시켜보기 위하여 ClassMain이라는 클래스를 새로 만든 후에
main안에 아래와 같이 코드를 작성해보자
public class ClassMain {
public static void main(String[] args) {
TV tv = new TV(); //tv 한대 생산
tv.brand = "LG";
tv.display();
tv.power();
tv.channelUp();
tv.power();
TV tv2 = new TV(); //tv 두대째 생산
tv2.brand = "GoldStar";
tv2.display();
tv2.power();
}
}

이상으로 클래스에 대한 개념에 대하여 살짝 알아봤고,
다음 편에는 리모콘이라는 클래스를 이용하여 TV를 작동하는 예제를 만들어 볼 것이다.
다음편에서 계속....
'Dev Story 💻 > Java' 카테고리의 다른 글
| [MyBatis] selectKey태그를 이용하여 insert하고 난 후 key값 리턴받기 (0) | 2023.03.08 |
|---|---|
| [Java] class(클래스) 이해를 위한 예제 - 2 (1) | 2021.12.09 |
| [Java] int를 String으로, String을 int으로 (0) | 2021.11.30 |
| [Java] 무한의 길이를 갖는 배열 만들기 (0) | 2021.11.28 |
| [Java] Self-number 알고리즘과 합 (0) | 2021.11.27 |
댓글