본문 바로가기

Java/Methodology

[OOP] 객체 지향 프로그래밍이란? - 상속

  • 상속(Inheritance)

상위클래스를 확장한 하위클래스가 상위클래스의 기능을 그대로 사용 할 수도 있고 재정의 하여 사용할 수도 있다.

아래는 전혀 상속을 사용하지 않은 코드이다.

public class Avante
{

    private String manufacturer;
    private String modelName;
    private String modelSubName;

    public void run()
    {
        log.info("달린다.");
    }

    public void reverse()
    {
        log.info("후진한다.");
    }

}

public class Sonata
{

    private String manufacturer;
    private String modelName;
    private String modelSubName;

    public void run()
    {
        log.info("달린다.");
    }

    public void reverse()
    {
        log.info("후진한다.");
    }

}

public class Grandeur
{
    private String manufacturer;
    private String modelName;
    private String modelSubName;

    public void run()
    {
        log.info("달린다.");
    }

    public void reverse()
    {
        log.info("후진한다.");
    }
}

정말 치기도 힘든 코드이다.
세 클래스에서 동일하게 사용하게 있는 manufacturer, modelName, run(), reverse()가 모두 중복되어있다.

나중에 회사에서 우리 차량 정보에서 modelName 뺄게요~ 라고 말이 나온다고 생각해보자.
modelName이 정의되어 있는 모든 클래스를 찾아서 제거해야 한다. 끔찍한 일이 아닐 수 없다.

그러면 아래의 코드를 보고 어떤 식으로 상속을 사용하는지 확인해보자.

public class Car
{

    private String manufacturer;
    private String modelName;

    public void run()
    {
        log.info("달린다.");
    }

    public void reverse()
    {
        log.info("후진한다.");
    }

}

public class Avante extends Car
{
    private String modelSubName;

    @Override
    public void run()
    {
        log.info("느리게 달린다.");
    }

}

public class Sonata extends Car
{

    private String modelSubName;

}

public class Grandeur extends Car
{
    private String modelSubName;

    @Override
    public void run()
    {
        log.info("빨리 달린다.");
    }

}

이제야 마음이 조금 편해지는 듯 하다.
모든 차량이 공통으로 가지고 있던 manufacturer, modelName, run(), reverse()를 Car 클래스에 모아두었다.
그리고 Avante, Sonata, Grandeur 클래스가 Car 클래스를 상속하게 하였다.

이제 회사에서 modelName을 빼라고 한다고 더 이상 겁먹을 필요가 없다. Car 클래스의 modelName만 빼면 된다!

상속받은 메소드를 하위 클래스에 맞게 재정의 하고 싶을때가 있다.

이럴때 오버라이딩을 사용하자.

위의 코드에서 Avante, Sonata, Grandeur 모두 reverse() 메소드는 상위 클래스에 정의된 그대로 사용하고 있다.

하지만 Avante와 Grandeur의 run() 메소드를 재정의하여 클래스의 특성에 맞게 재정의하였다.