간단하게 객체는 실제로 존재하는 것이라고 정의하는데, 실제로 존재하는 것이라면, 속성과 기능의 집합이라고 말할 수 있다. 여기서 속성과 기능에 따라 용도가 달라진다고 정의하였다. 그렇다면 속성과 기능은 어떻게 나뉠까?
속성 | 기능 |
---|---|
크기, 길이, 높이, 색상, 볼륨, 채널 | 켜기, 끄기, 볼륨 높이기, 볼륨 낮추기, 채널 바꾸기 |
속성(property) 👉 멤버 변수(variable)
기능(function) 👉 메서드(method)
채널 👉 int channelNumber
채널 높이기 👉 channelUp() { }
객체는 인스턴스를 포함하는 일반적인 의미이다.
- 책상은 인스턴스다 👉 책상은 책상 클래스의 객체다
- 책상은 객체다 👉 책상은 책상 클래스의 인스턴스다
클래스로부터 인스턴스를 생성하는 것이자, 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고 한다.
오해하기 쉬운 부분이 맞다. Tv클래스로부터 만들어진 객체를 Tv클래스의 인스턴스라고 하듯이, 결국 인스턴스와 객체는 같은 의미이다.
BUT!!! 객체(object) 는 모든 인스턴스를 대표하는 포괄적인 의미이고, 인스턴스(instance) 는 어떤 클래스로부터 만들어진 것인지를 보다 강조하는 의미를 갖고 있다. 이 부분을 꼭 생각하자👀👀
클래스명 변수명; // 클래스의 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); // 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장
Tv tv; //Tv클래스 타입의 참조변수 tv를 선언
tv = new Tv(); //Tv인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 tv에 저장
class Main {
public static void main(String[] args) {
Tv tv; //Tv인스턴스를 참조하기 위한 변수 t선언
tv = new Tv(); //Tv인스턴스를 생성
tv.channel = 7; //Tv인스턴스의 멤버변수 channel의 값을 7로 설정
tv.channelDown(); //Tv인스턴스의 메서드 channelDonw()을 호출
System.out.println("Channel: " + tv.channel);
}
}
class Tv {
//Tv의 속성(멤버변수)
String color; //색상
boolean power; //전원상태(on/off)
int channel; //채널
//Tv의 기능(메서드)
void power() {
power = !power;
}
void channelUp() {
++channel;
}
void channelDown() {
--channel;
}
}
Tv tv;
Tv 클래스 타입의 참조변수 tv를 선언하였다. 메모리에 참조변수 tv를 위한 공간이 마련되는 것이다. 아직 인스턴스가 생성되지 않은 상태이기 때문에 이 참조변수로 할 수 있는 것은 아무 것도 없다.
tv = new Tv();
연산자 new에 의해 Tv클래스의 인스턴스가 메모리의 빈 공간에 생성된다. 주소가 0x100인 곳에 생성되었다고 가정하자. 이 때, 멤버변수는 각 자료형에 해당하는 기본값으로 초기화 된다. color는 참조형이므로 null로, power는 boolean이므로 기본값이 false로, channel은 int값이므로 0으로 초기화 된다.
그 다음에는 대입연산자(=)에 의해 생성된 객체의 주소값이 참조변수 tv에 저장된다. 이제는 참조변수 tv를 통해 Tv인스턴스에 접근할 수 있다. 인스턴스를 다루기 위해서는 참조변수가 반.드.시 필요하다.
tv.channel = 7;
참조변수 tv에 저장된 주소에 있는 인스턴스의 멤버변수 channel에 7을 저장한다. 여기서 알 수 있는 것 처럼, 인스턴스의 멤버변수(속성)를 사용하려면, '참조변수.멤버변수'와 같이 하면된다.
tv.channelDown();
참조변수 tv가 참조하고 있는 Tv인스턴스의 channelDown메서드를 호출한다. channel Down 메서드는 멤버변수 channel에 저장되어 있는 값을 1 감소시킨다.
System.out.println("Channel: " + tv.channel);
참조변수 tv가 참조하고 있는 Tv인스턴스의 멤버변수 channel에 저장되어 있는 값을 출력한다. 현재 channel의 값은 6이므로 "Channel: 6"가 화면에 출력될 것이다.
마지막으로, 인스턴스와 참조변수의 관계는 마치 우리가 일상생활에서 사용하는 TV와 TV리모콘의 관계와 같다. TV리모콘(참조변수)을 사용하여 TV(인스턴스)를 다루기 때문이다.
인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야 한다.