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

객체에 대한 이해.

Blue_bull 2025. 1. 21. 12:32

1. left dao = new right(); 이런 경우 dao는 left를 참조해 아니면 right을 참조해?


자세한 설명

  1. left 타입의 참조 변수 dao
    • dao의 선언 타입이 left이므로, dao를 통해 호출할 수 있는 메서드와 필드는 left 클래스(또는 인터페이스)의 멤버에 한정됩니다.
    • left에 선언되지 않은 right의 고유 멤버는 dao를 통해 직접 호출할 수 없습니다.
  2. new right()
    • right 클래스의 객체가 생성됩니다.
    • rightleft의 자식 클래스(또는 구현 클래스)여야만 이 코드가 컴파일됩니다.
  3. 참조와 실제 객체의 관계
    • 참조 변수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

정리

  • daoright 객체를 참조합니다.
  • 그러나 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 기준"은 객체 지향 프로그래밍의 다형성 개념을 설명하는 문장으로, 참조 타입은 컴파일 시간에 동작을 제한하고, 실제 객체는 실행 시간에 동작을 결정한다는 뜻입니다.