본문 바로가기

프로그래밍언어/Java

[Java 기본] 상속

상속


예제


 

ElectricCar.java

public class ElectricCar {

    public void move() {
        System.out.println("차를 이동합니다. ");
    }

    public void charge() {
        System.out.println("충전합니다. ");
    }
}

 

 

GasCar.java

public class GasCar {

    public void move() {
        System.out.println("차를 이동합니다. ");
    }

    public void fillUp() {
        System.out.println("기름을 주유합니다. ");
    }
}

 

 

MainCar.java

public class CarMain {
    public static void main(String[] args) {
        ElectricCar electricCar = new ElectricCar();
        electricCar.move();
        electricCar.charge();

        GasCar gasCar = new GasCar();
        gasCar.move();
        gasCar.fillUp();

    }
}

 

실행결과

 

전기차(ElectricCar)와 가솔린차(GasCar)를 만들었다. 전기차는 이동, 충전 기능이 있고, 가솔린차는 이동, 주유 기능이 있다. 

 

전기차와 가솔린차는 자동차의 구체적인 개념이다. 반대로 자동차는 전기차와 가솔린차를 포함하는 추상적인 개념이다. 전기차와 가솔린차를 살펴보면 공통적으로 이동(move) 기능이 있다. 이런 경우 상속 관계를 사용하는 것이 효과적이다 .

 

 

상속관계


상속은 객체지향 프로그램의 핵심 요소 중 하나이다. 기존 클래스의 필드와 메서드를 새로운 클래스에서 재사용하게 해준다. 

상속을 사용하려면 extends 키워드를 사용하면 된다. extends 대상은 하나만 선택할 수 있다. 

 

  • 부모 클래스(슈퍼 클래스) : 상속을 통해 자신의 필드와 메서드를 다른 클래스에 제공하는 클래스
  • 자식 클래스(서브 클래스) : 부모 클래스로부터 필드와 메서드를 상속받는 클래스

위에서 만들었던 코드를 상속을 이용해 변경해보자. 

 

Car.java

public class Car {

    public void move(){
        System.out.println("차를 이동합니다. ");
    }

}

 

ElectricCar.java

public class ElectricCar extends Car{

    public void charge() {
        System.out.println("충전합니다. ");
    }
}

 

GasCar.java

public class GasCar extends Car {

    public void fillUp() {
        System.out.println("기름을 주유합니다. ");
    }
}

 

Main 메서드를 실행해보면 기존과 동일하게 동작한다. 

 

상속 구조도는 아래와 같다. 

 

 

단일상속


자바는 다중 상속을 지원하지 않는다. 따라서 extends 대상은 하나만 선택할 수 있다. 만약 비행기와 자동차를 상속 받아서 하늘을 나는 자동차를 만든다고 가정해보자. 자식 클래스에서 어떤 부모클래스의 move()를 사용할 지 애매한 문제가 발생한다. 이것을 다이아몬드 문제라 한다. 그리고 다중 상속을 사용하면 클래스 계층 구조가 매우 복잡해질 수 있다. 때문에 자바는 다중 상속을 허용하지 않는다. 

 

 

 

* 인프런 '김영한의 실전 자바 - 기본편'을 참고하여 작성하였습니다.