상속이란?
•
부모 클래스에 만들어진 필드와 메소드를 자식 클래스가 물려받는 것
•
위의 그림과 같이 클래스 간의 상속관계를 표현할 때에는 화살표를 부모 클래스의 방향으로 나타내준다.
상속 문법
•
상속을 표현하는 키워드는 extends
•
위의 예제는, SportsCar 클래스가 Car 클래스를 상속받는 것을 볼 수 있다.
•
다음 코드는 위에서 생성했던 Car 클래스와 SportsCar 클래스를 활용하는 예제이다.
•
Car 클래스를 상속받은 SportsCar 클래스는 부모 클래스의 필드 (speed)와 메소드(setSpeed)를 활용할 수 있다.
상속을 사용하는 이유
•
중복되는 코드를 줄이고 재사용할 수 있다.
•
위의 그림은 3개의 클래스에서 setSpeed()와 turn() 메소드를 중복으로 가지고 있는 것을 볼 수 있다.
•
위와 같이 중복되는 코드를 Vehicle이라는 부모 클래스에 정의하고, Car, Truck, Bus를 Vehicle을 상속받는 서브 클래스로 만들어줌으로써, 상속받아 서브 클래스의 상황에 맞게 구현하도록 한다.
상속과 생성자
•
위의 코드는 메인 메소드에서 C 클래스의 객체를 생성한 경우이다.
•
new 연산자를 통해 객체가 생성되는 경우, 생성자가 실행된다.
•
이 때, 부모 클래스의 생성자가 먼저 실행된다.
부모 클래스의 생성자가 먼저 실행되는 이유
•
자식 클래스의 객체가 생성되는 경우, 부모 클래스의 멤버들을 가지고 있을 것이다.
•
따라서, 자식 클래스 안의 부모 클래스 부분을 초기화 하기 위해 부모 클래스의 생성자가 호출될 것이다.
•
부모 클래스의 생성자가 호출이 되어 실행을 마친 뒤, 서브 클래스의 생성자로 돌아와 서브 클래스의 초기화 작업이 진행되는 것을 위의 그림을 통해 볼 수 있다.
명시적인 생성자 호출 - super()
class Parent {
protected String name = "홍길동";
}
class Child extends Parent {
//서브 클래스의 생성자
public Child() {
//super(); // 입력하지 않은 경우, 자바 컴파일러가 알아서 넣어줌
name = "이름을 바꾸겠습니다";
}
}
Java
복사
•
super() 키워드를 통해, 서브 클래스의 생성자에서 슈퍼 클래스의 생성자를 호출할 수 있다.
•
protected 키워드
◦
같은 패키지에 있는 클래스, 같은 패키지든 다른 패키지이든 서브 클래스일 경우 protected로 선언된 필드나 메소드에 접근 가능
•
자바 컴파일러는, 서브 클래스의 생성자에서 명시적으로 super() 키워드를 작성하지 않은 경우, 묵시적으로 super() 키워드를 생성하여 넣어준다.
부모 클래스의 생성자 선택
class Parent {
protected String name = "홍길동";
private int age;
public Parent(){}
public Parent(String name, int age){ //서브 클래스의 생성자에서 명시적으로 호출
name = "홍길순";
this.age = age;
}
}
class Child extends Parent {
//서브 클래스의 생성자
public Child() {
super("홍길자", 16); // 매개 변수의 형태에 따라 적절한 생성자가 호출됨
}
}
Java
복사
•
서브 클래스의 생성자에서 super() 메소드를 활용함으로써, 매개변수의 형태에 따라 슈퍼 클래스의 생성자가 알맞게 호출되는 것을 볼 수 있다.
주의 사항
class Base{
public Base(int x){
System.out.println("Base 생성자()");
}
}
class Derived extends Base{
public Derived(){
System.out.println("Derived 생성자()");
}
}
public class Test{
public static void main(String args[]){
Derived Obj = new Derived();
}
}
Java
복사
•
Derived 타입의 obj 객체 생성 시, Derived 클래스의 기본 생성자가 실행된다.
•
이 때, 컴파일러가 묵시적으로 넣어준 super() 키워드에 의해 Base 클래스(부모 클래스)의 기본 디폴트 생성자가 실행되어야 하지만, 이는 부모 클래스에 존재하지 않기 때문에 오류가 발생한다.
◦
컴파일러는 인수를 갖는 생성자를 클래스에 정의한 경우, 디폴트 생성자를 자동으로 넣어주지 않는다.