자바/객체지향 프로그래밍(OOP)

업캐스팅(승급)

Blue_bull 2025. 1. 21. 18:13

Left dao = new Left();

  1. 동작:
    • Left 클래스의 객체가 생성됩니다.
    • 참조 변수 dao는 생성된 Left 객체의 주소를 참조합니다.
  2. 특징:
    • 참조 변수와 실제 객체의 타입이 동일합니다.
    • 모든 멤버(변수와 메서드)에 정상적으로 접근할 수 있습니다.

Left dao = new Right();

  1. 동작:
    • Right 클래스의 객체가 생성됩니다.
    • 참조 변수 daoLeft 타입으로 선언되었기 때문에, Right 객체를 업캐스팅하여 참조합니다.
  2. 특징:
    • 상속 관계에서만 가능한 구문입니다.
    • daoLeft 타입으로 제한되기 때문에, 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)의 핵심입니다.