인스턴스
처음에 객체와 인스턴스에 사이에서 혼란을 겪은 적이 있다.
객체는 인스턴스를 포함하며 객체지향 프로그래밍에서는 비슷한 의미로 사용되지만 두 단어는 분명 차이가 있다.
우선 클래스 타입으로 선언되었을 때를 객체라고 하며, 클래스가 실체화되었을 때 인스턴스라고 말한다.
내 생각에 객체와 인스턴스의 가장 큰 차이는 메모리에 할당 되느냐 안되느냐의 차이인 것 같다.
코드를 보자.
먼저 Cafe 클래스에는 두 변수와 메소드가 정의되어 있다.
1
2
3
4
5
6
7
8
9
10
11
12
|
package biz.test;
public class Cafe{
String drink; // 음료
int pay; // 가격
public void Americano(){
drink = "Americano";
System.out.println(drink);
}
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
|
package biz.test;
public class CafeGo{
public static void main(String args[]) {
Cafe mydrink;
mydrink = new Cafe();
mydrink.Americano();
}
}
|
cs |
7번째 라인에서 Cafe라는 클래스 타입의 객체를 생성했다.(메모리 할당 X)
☞ mydrink는 객체
8번째 라인에서 mydrink는 인스턴스화되어 객체에 저장될 메모리 공간을 할당한다.(인스턴스화)
☞ mydrink는 Cafe라는 클래스의 인스턴스
☞ 인스턴스가 생성되면(=클래스가 new 연산자에 의해 실체화 될 때) 생성된 인스턴스는 힙 영역(Heap Area)에 저장된다.
※힙 영역을 알기 위해서는 자바(JVM)의 메모리 구조를 이해해야 한다. ☞ 자바 메모리 구조 보러 가기
☞ Cafe 클래스의 인스턴스가 생성되면서 생성된 인스턴스를 가리키는 참조 변수(=레퍼런스 변수) mydrink를 반환한다.
참조 변수는 인스턴스라고 할 수 없고 인스턴스를 가리키기 위한 변수이다.
인스턴스의 생성 후 참조 변수를 통해 아래처럼 객체의 메소드 또는 변수를 사용할 수 있게 된다.
1
2
3
4
5
6
7
8
9
10
11
12
|
package biz.test;
public class CafeGo{
public static void main(String args[]) {
Cafe mydrink;
mydrink = new Cafe();
mydrink.Americano();
}
}
|
cs |
처음 접할 때면 많이 헷갈릴 수 있는 개념이므로 자주 봐주는 것이 도움이 될 것이다.
+ 피드백은 언제나 환영입니다 :)