Left dao = new Left();
- 동작:
Left
클래스의 객체가 생성됩니다.
- 참조 변수
dao
는 생성된 Left
객체의 주소를 참조합니다.
- 특징:
- 참조 변수와 실제 객체의 타입이 동일합니다.
- 모든 멤버(변수와 메서드)에 정상적으로 접근할 수 있습니다.
Left dao = new Right();
- 동작:
Right
클래스의 객체가 생성됩니다.
- 참조 변수
dao
는 Left
타입으로 선언되었기 때문에, Right
객체를 업캐스팅하여 참조합니다.
- 특징:
- 상속 관계에서만 가능한 구문입니다.
dao
는 Left
타입으로 제한되기 때문에, Left
클래스에 정의된 멤버(변수와 메서드)에만 접근할 수 있습니다.
Right
클래스에서 추가된 고유한 멤버에는 접근하려면 다운캐스팅이 필요합니다.
예제:
1. Left dao = new Left();
class Left {
public void methodLeft() {
System.out.println("Method in Left");
}
}
public class Main {
public static void main(String[] args) {
Left dao = new Left(); // Left 객체 생성
dao.methodLeft(); // 출력: Method in Left
}
}
2. Left dao = new Right();
(업캐스팅)
class Left {
public void methodLeft() {
System.out.println("Method in Left");
}
}
class Right extends Left {
public void methodRight() {
System.out.println("Method in Right");
}
}
public class Main {
public static void main(String[] args) {
Left dao = new Right(); // 업캐스팅
dao.methodLeft(); // 출력: Method in Left
// dao.methodRight(); // 컴파일 오류: Left 타입에는 methodRight가 없음
// 다운캐스팅
Right right = (Right) dao;
right.methodRight(); // 출력: Method in Right
}
}
결론:
Left dao = new Left();
: Left
클래스의 객체가 생성되고, dao
가 이를 참조합니다.
Left dao = new Right();
: 상속 관계에서만 가능한 구문이며, 업캐스팅이 발생합니다. 참조 변수는 Left
의 멤버만 사용할 수 있습니다.
- 업캐스팅 된 상황에서 오버라이딩된 메서드는 실제 객체 타입(Right)에 따라 동작합니다. 이것이 다형성(polymorphism)의 핵심입니다.