<정처기> Java 5. 업캐스팅(부모형태, 자식 생성자)

빡찌's avatar
Oct 09, 2024
<정처기> Java 5. 업캐스팅(부모형태, 자식 생성자)

Upcasting = 부모 형태의 자식 생성자를 할당하는 것(형변환)

⇒ Parent p = new Child();
시험에 출제되기 쉽다…
 
public class Car { //자동차 생성자 public Car() { System.out.println("자동차 객체 생성됨"); } //엔진을 시동하는 메서드 public void startEngine() { System.out.println("엔진 시동 걸림"); } } public class ElectricCar extends Car { //전기 자동차 생성자 public ElectricCar() { System.out.println("전기 자동차 객체 생성"); } //배터리를 충전하는 메서드 public void chargeBattery() { System.out.println("배터리 충전 중"); } public static void main(String[] args) { System.out.println("프로그럄 시작"); //전기 자동차 객체 생성 Car myElectricCar = new ElectricCar(); //메서드 호출 myElectricCar.startEngine(); //상속받은 메서드 호출 myElectricCar.chargeBattery(); //자식 클래스의 메서드 호출 > 에러발생 System.out.println("프로그램 종료"); } }
타입을 Car로 객체를 생성했기 때문에 자식 클래스의 메서드를 호출하면
에러가 난다.
 

업캐스팅의 원칙

  • 자식에 이름이 같은 메서드가 있으면 우선 작동
  • 자식에 super()가 있으면, 부모의 그것을 호출
  • 부모에 자식과 같은 메서드가 있으면, 자식을 호출
public class MainClass { public static void main(String[] args) { A b = new B(); //1. A타입으로 B객체 생성(생성자가 없으니까 할것X) b.paint(); //2. paint 메서드가 오버라이딩 되었으므로 자식 ㄱ b.draw(); //14. 이것도 오버라이딩 되었으므로 자식 ㄱ } } class A { public void paint() { System.out.print("A"); draw(); } public void draw() { //5. 여기로 옴 System.out.print("B"); //6. B출력 draw(); // 7. 본인의 draw가 아닌 자식의 메서드 호출 } } class B extends A { public void paint() { //3. 여기로 옴 super.draw(); //4. 부모의 draw 메서드로 감 System.out.print("C"); //10. C출력 this.draw(); // 11.이 클래스의 draw 호출 } public void draw() { //8. 여기로옴 , 12. 여기 또옴 System.out.print("D"); //9. D출력 , 13. D출력 , 15. D출력 } }
출력값 :
BDCDD
 
public class MainClass { public static void main(String[] args) { A a = new A(); //업캐스팅이 아님 1. A 객체 생성 A b = new B(); //업캐스팅 4. A 타입으로 B 생성 b.paint(); //여기서부턴 위에랑 똑같음 BDCDD b.draw(); } } class A { public A() { //2. 생성자 도착 , 6. 부모 생성자 도착 System.out.println("Constructor of A"); // 3. 출력 , 7.출력 } public void paint() { System.out.print("A"); draw(); } public void draw() { System.out.print("B"); draw(); } } class B extends A { public B() { //5. B생성 전 부모 생성자 부터 감 System.out.println("Constructor of B"); //8. 출력 } public void paint() { super.draw(); System.out.print("C"); this.draw(); } public void draw() { System.out.print("D"); } }
출력값:
Constructor of A Constructor of A Constructor of B BDCDD
 
public class MainClass { public static void main(String[] args) { A b = new B(1); //1. 기본생성자가 아닌 파라미터 받는 생성자 b.paint(); //6. 마지막 재정의 한 메서드로 ㄱ b.draw(); //8. 마지막 재정의 한 메서드로 ㄱ } } class A { public A() { //3. 여기 도착 System.out.println("생성자 of A"); //4. 출력 } public A(int i) { System.out.println("생성자 of AA" + i); } public void paint() { System.out.print("A"); draw(); } public void draw() { System.out.print("B"); draw(); } } class B extends A { public B() { super.paint(); } public B(int i) { //2. 부모 생성자 부터 ㄱㄱ System.out.println("생성자 BB" + i); //5. 출력 } public void paint() { System.out.print("C"); //7. 출력 } public void draw() { System.out.print("D"); //9. 출력 } }
출력값:
생성자 of A 생성자 BB1 CD
(* 자식에게 파라미터가 있었음에도 부모는 기본 생성자가 호출됨)
⇒ 자식 생성자에 명시적으로 super(10) 라고 되어있으면
부모 생성자도 당연히 파라미터를 받는 생성자를 호출한다.
 

super()는 무조건 최상위 줄에 있어야함!!!!! 아니라면 그 줄은 오류다.

Share article

prettytree