클래스 정의: 클래스란 객체를 정의해 놓은 것이다.
클래스의 용도: 클래스는 객체를 생성하는데 사용된다.
클래스란 '객체를 정의해놓은 것.' 또는 '객체의 설계도'라 정의할 수 있다.
객체의 정의 : 실제로 존재하는 것. 사물 또는 개념
객체의 용도: 객체가 가지고 있는 기능과 속성에 따라 다름
유형의 객체 : 책상, 의자, 자동차, TV와 같은 사물
무형의 객체 : 수학공식, 프로그램 에러와 같은 논리나 개념
객체란 사전적 정의로 '실제로 존재하는 것'이다. 책상, 의자 같은 사물들이 곧 객체이다.
프로그래밍에서의 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻한다.
클래스와 객체의 관계는 마치 '붕어빵 기계(클래스)'와 '붕어빵(객체)'라고 볼 수 있다.
클래스는 객체를 만드는데 사용되는 것으로 객체 그 자체는 아니다.
프로그래밍에서는 먼저 클래스를 작성한 다음, 클래스로부터 객체를 생성하여 사용한다.
JDK에서는 프로그래밍을 위해 많은 수의 유용한 클래스를 기본적으로 제공하고 있다.
클래스의 인스턴스화(instantiate): 클래스로부터 객체를 만드는 과정
클래스의 인스턴스(instance): 클래스로부터 만들어진 객체
예를 들면, 붕어빵 클래스로부터 만들어진 객체를 붕어빵클래스의 인스턴스라고 한다. 결국 인스턴스는 객체와 같은 의미이지만, 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖고 있다. 인스턴스는 어떤 클래스로부터 만들어진 것인지를 강조하는 보다 구체적인 의미를 갖고 있다.
'책상은 인스턴스다.' 라고 하기 보다는 '책상은 객체다.' 라는 쪽이, '책상은 책상클래스의 객체이다.'라고 하기 보다는 '책상은 책상클래스의 인스턴스이다.'라고 하는 것이 자연스럽다.
속성(property) : 멤버변수(member variable), 특성(attribute), 필드(field), 상태(state)
기능(function) : 메서드(method), 함수(function), 행위(behavior)
객체는 두 종류의 구성요소(속성, 기능)로 이루어져 있으며, 일반적으로 객체는 다수의 속성과 다수의 기능을 갖는다. 즉, 객체는 속성과 기능의 집합이라고 할 수 있다. 클래스로부터 객체를 생성하면, 클래스에 정의된 속성과 기능을 가진 객체가 만들어지는 것이다.
속성과 기능은 위와 같이 같은 뜻의 여러가지 용어가 있다. 주로 '멤버변수'와 '메서드' 단어를 사용한다.
TV를 예로 들어보자.
Class TV {
// 속성 -> 변수
String color; // 색깔
boolean power; // 전원상태
int channel; // 채널
// 기능 -> 메서드
void power() {power = !power;}
void channelUp() {channel++;}
void channelDown() {channel--;}
일반적으로 메서드보다는 멤버변수를 먼저 선언하고, 멤버변수는 멤버변수끼리 메서드는 메서드끼리 모아 놓는 것이 일반적이다.
위에서 TV클래스를 선언한 것은 TV설계도를 작성한 것에 불과하므로, TV 인스턴스를 생성해야 제품(TV)을 사용할 수 있다. 클래스로부터 인스턴스를 생성하는 방법은 여러 가지가 있지만 일반적으로 다음과 같이 한다.
클래스명 변수명; // 클래스의 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); // 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장TV t; t = new TV();
class TV {
// TV의 속성(멤버변수)
String color; // 색상
boolean power; // 전원상태(on/off)
int channel; // 채널
// Tv의 기능(메서드)
void power() { power = !power; } // TV를 켜거나 끄는 기능을 하는 메서드
void channelUp() { ++channel; } // TV의 채널을 높이는 기능을 하는 메서드
void channelDown() { --channel;} // TV의 채널을 낮추는 기능을 하는 메서드
}
class TEST {
public static void main(String[] args) {
// TODO Auto-generated method stub
TV t; // TV 인스턴스를 참조하기 위한 변수 t를 선언
t = new TV(); // TV 인스턴스를 생성한다.
t.channel = 7; // TV 인스턴스의 멤버변수 channel 값을 7로 한다.
t.channelDown(); // TV 인스턴스의 메서드 channelDown()을 호출한다.
System.out.println("현재 채널은 "+t.channel + " 입니다.");
}
}
1. TV t;
TV클래스 타입의 참조변수 t를 선언한다. 메모리에 참조변수 t를 위한 공간이 마련된다. 아직 인스턴스가 생성되지 않았으므로 참조변수로 아무것도 할 수 없다.
2. t = new TV();
연산자 new에 의해 TV클래스의 인스턴스가 메모리의 빈 공간에 생성된다. 그 다음에는 대입연산자(=)에 의해서 생성된 객체의 주소값이 참조변수 t에 저장된다. 이제는 참조변수 t를 통해 TV 인스턴스에 접근할 수 있다. 인스턴스를 다루기 위해서는 참조변수가 반드시 필요하다.
3. t.channel = 7;
참조변수 t에 저장된 주소에 있는 인스턴스의 멤버변수channel에 7을 저장한다. 여기서 알 수 있는 것처럼, 인스턴스의 멤버변수(속성)를 사용하려면 '참조변수.멤버변수'와 같이 하면 된다.
4. t.channelDown();
참조변수 t가 참조하고 있는 TV인스턴스의 channelDown메서드를 호출한다. channelDown 메서드는 멤버변수 channel에 저장되어 있는 값을 1 감소시킨다.
인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야 한다.
많은 수의 객체를 다뤄야할 때, 배열로 다루면 편리할 것이다. 객체 역시 배열로 다루는 것이 가능하며, 이를 '객체 배열'이라 한다.
TV tv1, tv2, tv3; -> TV[] tvArr = new TV[3] // 참조변수 배열(객체 배열) 생성 // 객체를 생성해서 배열의 각 요소에 저장 tvArr[0] = new TV(); tvArr[1] = new TV(); tvArr[2] = new TV(); // 배열의 초기화 블럭을 사용하면 위의 코드를 한 줄로 나타낼 수 있다. TV[] tvArr = {new TV(), new TV(), new TV()};
public class TvTest4 {
public static void main(String[] args) {
TV[] TVArr = new TV[3];
// TV객체를 생성해서 TV객체 배열의 각 요소에 저장
for(int i=0; i < TVArr.length; i++) {
TVArr[i] = new TV();
TVArr[i].channel = i+10; // TVArr[i]의 channel에 i+10을 저장
}
for (int i=0; i <TVArr.length; i++) {
TVArr[i].channelUp(); // TVArr[i]의 메서드를 호출. 채널이 1증가
System.out.printf("TVArr[%d].channel=%d%n",i,TVArr[i].channel);
}
}
}
class TV{
String color;
boolean power;
int channel;
void power() { power = !power; } // TV를 켜거나 끄는 기능을 하는 메서드
void channelUp() { ++channel; } // TV의 채널을 높이는 기능을 하는 메서드
void channelDown() { --channel;} // TV의 채널을 낮추는 기능을 하는 메서드
}
1. 클래스- 데이터와 함수의 결합
변수 -> 배열 -> 구조체 -> 클래스
1. 변수 : 하나의 데이터를 저장할 수 있는 공간
2. 배열 : 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
3. 구조체 : 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
4. 클래스 : 데이터와 함수의 결합(구조체+함수)
자바와 같은 객체지향언어에서는 변수(데이터)와 함수를 하나의 클래스에 정의하여 서로 관계가 깊은 변수와 함수들을 함께 다룰 수 있게 했다.
2. 클래스 - 사용자정의 타입(user-defined type)
프로그래밍언어에서 제공하는 자료형(primitive type)외에 프로그래머가 서로 관련된 변수들을 묶어서 하나의 타입으로 새로 추가하는 것을 사용자 정의 타입이라고 한다.
다른 프로그래밍언어에서도 사용자정의 타입을 정의할 수 있는 방법을 제공하고 있으며, 자바와 같은 객체지향언어에서는 클래스가 곧 사용자 정의 타입이다.
참고
자바의 정석(저자: 남궁성)
드디어 객체가 무엇인지, 클래스가 무엇인지에 대해 자세한 개념을 배웠다. 클래스는 붕어빵 모양, 무늬 등을 결정하는 붕어빵 틀이고, 이 클래스로 만든 제품 붕어빵이 곧 객체다.
객체지향언어가 무엇인가에 대해 감이 잘 안잡혔는데 자바를 공부할수록 점점 이해되는게 재밌고 뿌듯하다.
다음엔 변수와 메서드를 공부해보겠다.