카테고리 없음
자바 업캐스팅, 생성자, 상속 헷갈림 (정처기 실기)
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 타입으로 선언해야 함.
✔️ 예전 코드에서 실행됐다면, 오버라이딩 또는 생성자에서 메서드 호출이 있었을 가능성이 높음.