: 부모의 기본 생성자를 호출하는 메소드
부모 클래스를 상속받은 자식 클래스를 생성할 시에 부모 객체가 먼저 생성된 다음에 자식 객체가 생성된다.
이러한 흐름이 가능한 이유는 자식 생성자가 실행될때 컴파일 과정에서 부모의 기본 생성자를 호출하는 super()이 자동으로 추가되기 때문 !
=> Super()은 부모의 "기본" 생성자를 호출하기 때문에
부모 클래스에 기본 생성자가 없고 매개변수를 갖는 생성자만 있다면 super(매개값, ...) 코드를 직접 넣어야한다.
: 상속된 메소드를 자식 클래스에서 재정의하는 것
메소드 오버라이딩 시 주의해야하는 규칙
- 부모 메소드의 선언부(리턴 타입, 메소드 이름, 매개변수)와 동일해야 한다.
- 접근 제한을 더 강하게 오버라이딩할 수 없다. (public -> private으로 변경 불가)
- 새로운 예외를 throw할 수 없다.
public class Calculator { public double areaCircle(double r) { System.out.println("Calculator 객체의 areaCircle() 실행"); return 3.14159 * r * r; } }
public class Computer extends Calculator { @Override // 컴파일 시 정확히 오버라이딩이 되었는지 체크해줌 (생략 가능) public double areaCircle(double r) { System.out.println("Computer 객체의 areaCircle() 실행"); return PI * r * r; } }
Calculator cal = new Calculator(); Computer comp = new Computer(); System.out.println(cal.areaCircle(10); System.out.println(comp.areaCircle(10); >>> Calculator 객체의 areaCircle() 실행 314.159 Computer 객체의 areaCircle() 실행 314.1592653589793
: 메소드를 재정의하면, 부모 메소드는 숨겨지고 자식 메소드만 사용되기 때문에 비록 부모 메소드의 일부만 변경된다 하더라도 중복된 내용을 자식 메소드도 가지고 있어야한다.
이러한 중복된 내용을 해결하기 방법 !
: "super.부모클래스의 메소드명()" 을 사용하면 숨겨진 부모 메소드를 호출하여 해결할 수 있다.
=> 부모 메소드를 재사용함으로써 자식 메소드의 중복된 작업 내용을 없애는 효과를 얻을 수 있음!
public class Airplane {
public void fly() { System.out.println("일반 비행합니다.");
}
public class SupersonicAirplane extends Airplane {
public static final int NORMAL = 1;
public static final int SUPERSONIC = 2;
public int flyMode = NORMAL;
@Override
public void fly() {
if(flyMode == SUPERSONIC) {
System.out.println("초음속 비행합니다.");
} else {
super.fly();
}
}
}
SupersonicAirplane sa = new SupersonicAirplane();
sa.fly();
sa.flyMode = SupersonicAirplane.SUPERSONIC;
sa.fly();
sa.flyMode = SupersonicAirplane.NORMAL;
sa.fly();
>>>
일반 비행합니다.
초음속 비행합니다.
일반 비행합니다.
final 클래스와 final 메소드는 상속과 관련이 있다.
자동 타입 변환은 다음과 같은 조건에서 일어난다.
부모타입 변수 = 자식타입객체
자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다.
따라서 아래와 같은 케이스가 가능하다.
class Animal{...}
class Cat extends Animal{...}
Cat cat = new Cat();
Animal animal = cat;
( = Animal animal = new Cat(); )
: 자식 타입은 부모 타입으로 자동 변환되지만, 반대로 부모 타입은 자식 타입으로 자동 변환되지 않는다.
대신 다음과 같이 캐스팅 연산자로 강제 타입 변환(Casting)을 할 수 있다.자식타입 변수 = (자식타입) 부모타입객체;
- 그렇다고해서 부모 타입 객체를 무조건 강제 변환할 수 있는 것은 아니다 !
자식 객체가 부모 타입으로 자동 변환된 후 다시 자식 타입으로 변환할 때 강제 타입 변환을 사용할 수 있다.
: 사용 방법은 동일하지만 실행 결과가 다양하게 나오는 성질
다형성 구현을 위해서는 자동 타입 변환과 메소드 재정의(메소드 오버라이딩)가 필요하다.
참조:
이것이 자바다 교육 현장에서 가장 많이 쓰이는 JAVA 프로그래밍의 기본서 [ 개정판 ] - 신용권, 임경균 저 | 한빛미디어