///////
Search

11_상속_곽철민

상속이란?

부모 클래스에 만들어진 필드와 메소드를 자식 클래스가 물려받는 것
위의 그림과 같이 클래스 간의 상속관계를 표현할 때에는 화살표를 부모 클래스의 방향으로 나타내준다.

상속 문법

상속을 표현하는 키워드는 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 클래스(부모 클래스)의 기본 디폴트 생성자가 실행되어야 하지만, 이는 부모 클래스에 존재하지 않기 때문에 오류가 발생한다.
컴파일러는 인수를 갖는 생성자를 클래스에 정의한 경우, 디폴트 생성자를 자동으로 넣어주지 않는다.