반응형
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck() {}
public abstract void display();
public void performFly() {
flyBehavior.fly();
}
public void performQuack() {
quackBehavior.quack();
}
public void swim() {
System.out.println("모든 오리는 물에 떠요.");
}
}
https://solution-is-here.tistory.com/191
위 링크에 들어가면 전체 코드를 볼 수 있습니다.
Duck 추상클래스에서 생성한 FlyBehavior과 QuackBehavior은 인스턴스 변수일까? 레퍼런스 변수일까?
CS스터디를 진행하던 중 나온 질문이다.
명확하게 답이 나오지 않아서 공부를 할 겸 블로그에 두 변수의 차이를 작성하려고 한다.
인스턴스 변수와 레퍼런스 변수란❓
인스턴스 변수란?
- 인스턴스가 생성될 때 힙 메모리에 할당되는 변수입니다.
- 각 객체가 독립적으로 가지고 있는 값으로, 객체들마다 다른 값을 가질 수 있습니다.
public class MyObject {
int instanceVariable; // 인스턴스 변수 입니다.
}
레퍼런스 변수란?
- 레퍼런스 변수는 메모리에 저장된 데이터나 객체의 주소값을 참조하는 데 사용하는 변수입니다.
- 인스턴스 변수는 레퍼런스 변수를 통해 사용이 가능합니다. (. 을 통해서 사용할 수 있습니다)
MyObject myObject = new MyObject(); //레퍼런스 변수 입니다.
그러면 FlyBehavior, QuackBehavior은 레퍼런스 변수야? 인스턴스 변수야?
정답은 둘 다입니다. (정답이 둘다여서 스터디를 할 때 의견이 갈렸던 것 같네요...)
1. 인스턴스 변수일 때
- FlyBehavior, QuackBehavior은 Duck 클래스가 생성될 때마다 객체의 FlyBehavior, QuackBehavior이 생성됩니다.
- 각 객체는 각각의 FlyBehavior, QuackBehavior을 가지고 각 변수는 다른 구현체를 할당 받을 수 있습니다.
2. 레퍼런스 변수일 때
FlyBehavior, QuackBehavior은 인스턴스로써 구현 객체를 할당받을 수 있습니다.
- FlyBehavior, QuackBehavior의 구현 객체를 참조할 수 있습니다.
- 두 개의 레퍼런스 변수를 통해 구현체의 메소드(Fly, Quack)에 접근할 수 있습니다.
✅정리
간단히 정리를 하자면 Duck 클래스를 객체로 생성하는 클래스의 입장에서 보면 객체를 생성할 때마다 생성 되기 때문에 인스턴스 변수이고, Duck 클래스 내부에서 보면 구현체를 할당 받을 수 있기 때문에 레퍼런스 변수 입니다.
반응형