1. left dao = new right(); 이런 경우 dao는 left를 참조해 아니면 right을 참조해?
자세한 설명
left
타입의 참조 변수dao
dao
의 선언 타입이left
이므로,dao
를 통해 호출할 수 있는 메서드와 필드는left
클래스(또는 인터페이스)의 멤버에 한정됩니다.left
에 선언되지 않은right
의 고유 멤버는dao
를 통해 직접 호출할 수 없습니다.
new right()
right
클래스의 객체가 생성됩니다.right
는left
의 자식 클래스(또는 구현 클래스)여야만 이 코드가 컴파일됩니다.
- 참조와 실제 객체의 관계
- 참조 변수는
left
타입이고, 실제 생성된 객체는right
입니다. - 다형성에 의해 참조 변수(
dao
)는left
타입의 메서드와 필드만 호출할 수 있지만, 실행 시에는 실제 객체(right
)의 메서드가 호출됩니다.
이를 "동적 바인딩"이라고 합니다.
- 참조 변수는
예시 코드
class left {
public void methodA() {
System.out.println("left: methodA");
}
}
class right extends left {
public void methodA() {
System.out.println("right: methodA");
}
public void methodB() {
System.out.println("right: methodB");
}
}
public class Main {
public static void main(String[] args) {
left dao = new right(); // dao는 left 타입으로 선언되었으나, right 객체를 참조
dao.methodA(); // 실행 시 실제 객체 right의 methodA가 호출됨
// dao.methodB(); // 컴파일 오류: left 타입에는 methodB가 없음
}
}
출력
right: methodA
정리
dao
는right
객체를 참조합니다.- 그러나
dao
의 참조 변수 타입이left
이므로,left
에 정의된 멤버만 호출할 수 있습니다. - 실행 시점에서는 실제 객체 타입(
right
)의 메서드가 호출됩니다.
따라서, "참조는left
기준", 실행은right
기준입니다.
2. "참조는 left 기준", 실행은 right 기준입니다. 이게 무슨말이야?
"참조는 left
기준, 실행은 right
기준"이라는 말은 다형성(polymorphism)과 관련된 동작을 간단히 요약한 표현입니다. 이를 이해하기 위해, 컴파일 시간과 실행 시간에서의 동작을 구분해야 합니다.
1. 참조는 left
기준
left dao = new right();
에서dao
의 참조 변수 타입은left
입니다.- 따라서 컴파일 시점에,
dao
를 통해 호출할 수 있는 메서드와 필드는left
클래스에 정의된 멤버에 한정됩니다. right
클래스에만 정의된 멤버는dao
를 통해 직접 호출할 수 없습니다.
예시
class left {
public void methodA() {
System.out.println("left: methodA");
}
}
class right extends left {
public void methodB() {
System.out.println("right: methodB");
}
}
public class Main {
public static void main(String[] args) {
left dao = new right();
dao.methodA(); // 가능: left에 정의된 메서드
// dao.methodB(); // 컴파일 오류: left에 methodB()가 없음
}
}
2. 실행은 right
기준
- 실제로
dao
가 참조하는 객체는right
입니다. - 따라서 실행 시점에는, 호출된 메서드가 실제 객체(
right
)에서 오버라이드된 메서드일 경우,right
의 구현이 호출됩니다. - 이를 동적 바인딩(dynamic binding)이라고 합니다.
예시
class left {
public void methodA() {
System.out.println("left: methodA");
}
}
class right extends left {
@Override
public void methodA() {
System.out.println("right: methodA");
}
}
public class Main {
public static void main(String[] args) {
left dao = new right();
dao.methodA(); // 실행 시점에 right의 methodA()가 호출됨
}
}
출력:
right: methodA
왜 그런가?
dao.methodA()
호출 시, 실행 시점에는dao
가 참조하는 객체 타입인right
에서methodA()
를 찾아 실행합니다.- 오버라이드된 메서드는 객체의 실제 타입 기준으로 동작합니다.
3. 요약
구분 | 설명 |
---|---|
참조는 left 기준 |
참조 변수(dao )의 선언 타입인 left 에 정의된 멤버만 접근 가능. |
실행은 right 기준 |
실제 객체(right )에서 구현된 메서드가 실행 시 호출됨 (오버라이딩). |
4. 직관적인 비유
- 참조는
left
기준:dao
는 "나는left
타입으로 동작할 거야"라고 선언한 것과 같음. - 실행은
right
기준: 그러나 실제로dao
가 가리키고 있는 객체는right
이므로, "실제로 행동할 때는right
처럼 행동할게"라는 의미입니다.
5. 결론
"참조는 left
기준, 실행은 right
기준"은 객체 지향 프로그래밍의 다형성 개념을 설명하는 문장으로, 참조 타입은 컴파일 시간에 동작을 제한하고, 실제 객체는 실행 시간에 동작을 결정한다는 뜻입니다.
'자바 > 객체지향 프로그래밍(OOP)' 카테고리의 다른 글
toString()오버라이딩 (0) | 2025.01.21 |
---|---|
super() 정리1 (0) | 2025.01.21 |
기본생성자와 암시적 생성자 (0) | 2025.01.15 |
실체(Instance)와 객체(Object), 정의(metadata)에 대한 이해 (1) | 2025.01.03 |
접근제어자 (0) | 2025.01.02 |