카테고리 없음

자바 업캐스팅, 생성자, 상속 헷갈림 (정처기 실기)

chanwoo23 2025. 4. 2. 22:19

자바 업캐스팅과 메서드 호출 오류 분석

1. 원본 코드

class A {
    public int add(int a, int b) { return a+b; }
    public int add(double a, double b) { return (int)(a*b); }
    public int add(float a, float b) { return (int)(a-b); }
}

class B extends A {
    public int add(int a, int b, int c) { return a+b+c; }
}

class Main {
    public static void main(String args[]) {
        A a = new B();
        System.out.println(a.add(100, 200, 300)); // 오류 발생
    }
}

2. 오류 원인 분석

  • A a = new B(); → 업캐스팅(Upcasting) 발생 (B 객체를 A 타입 변수로 참조)
  • 업캐스팅된 참조 변수(A a)는 A에 정의된 메서드만 호출 가능
  • A에는 add(int, int, int)가 정의되지 않음 → 컴파일 오류 발생

3. 해결 방법

방법 1: A에도 add(int, int, int) 추가

class A {
    public int add(int a, int b) { return a + b; }
    public int add(int a, int b, int c) { return a + b + c; } // 추가
}
class B extends A {
    @Override
    public int add(int a, int b, int c) { return a + b + c + 10; }
}
class Main {
    public static void main(String args[]) {
        A a = new B();
        System.out.println(a.add(100, 200, 300));  // 610 출력
    }
}

방법 2: B 타입으로 선언

B b = new B();
System.out.println(b.add(100, 200, 300));  // 정상 실행

4. 예전에는 실행됐던 이유

  • 예전에 실행되던 코드에서는 오버라이딩된 메서드가 있었을 가능성이 높음
  • 예를 들어, A에도 add(int, int, int)가 있었거나,
  • 또는 생성자에서 메서드 호출이 이루어졌을 가능성이 있음
class A {
    public A() {
        System.out.println("A 생성자 호출");
        System.out.println("add 결과: " + add(10, 20));  // B의 add()가 실행될 가능성
    }
    public int add(int a, int b) { return a + b; }
}
class B extends A {
    @Override
    public int add(int a, int b) { return a + b + 100; }
}
class Main {
    public static void main(String args[]) {
        A a = new B();  // 생성자 호출 및 메서드 실행
    }
}

실행 결과:

A 생성자 호출
add 결과: 130  // B의 add() 실행됨 (오버라이딩 적용)
B 생성자 호출

5. 결론

✔️ A 타입 변수는 A에 정의된 메서드만 호출 가능함.
✔️ B에서 새로 추가한 메서드는 A 타입 변수로 접근 불가능.
✔️ 해결하려면 A에도 해당 메서드를 추가하거나, B 타입으로 선언해야 함.
✔️ 예전 코드에서 실행됐다면, 오버라이딩 또는 생성자에서 메서드 호출이 있었을 가능성이 높음.