Post

Java 4, 상속

Java의 특징, 두번째.

특징 : 상속.

지난번 포스팅, ‘캡슐화’에 이어서 Java의 특징 중, ‘상속’을 정리해보겠습니다.

상속.

프로그래밍 언어의 ‘상속’에 대해 알아보기 전에,
우리가 일상생활에서 상속이란 단어를 언제 사용하는지 떠올려봅시다.
저는 가장 먼저 떠올려지는 건 부모님한테 무언가를 물려받았을 때가 떠오르네요.
부모님이 저희에게 용돈을 주시거나, 선물을 사주시는 개념이 아닌.
당신께서 가진 재산을 법적으로 저희에게 물려주실 때, 상속이란 단어를 사용하죠.

그런데 놀랍게도, Java에서의 상속도 마찬가지입니다.
부모 클래스에서 생성된 속성(변수), 기능(함수)들을 자식 클래스가 사용할 수 있다는 게 Java에서의 상속입니다.

이해하기 쉽도록 코드로 작성해보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Car {
    private String carName;
    private String makeCompany;
    private String color;
    private String price;

    void moveForward() {
        ...
    }

    void moveLeft() {
        ...
    }

    void moveBack() {
        ...
    }
}

이제는 익숙해진 Car클래스 코드입니다.
오늘의 포스팅을 위해서 Car클래스의 내용을 좀 줄여보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
public class Car {
    private String carName;
    private String makeCompany;

    void moveForward() {
        ...
    }
}

public class CarSeller {
    ...   
}

코드가 줄어진 대신 새로운 클래스가 등장했습니다.
차를 만들었으니, 타거나 팔아봐야겠죠?
차 판매원의 속성과 행동(기능)을 정의할 클래스 carSeller클래스입니다.

코드를 써내려가기 전에 차 판매원에게 필요한 것들을 정리해보겠습니다.
판매원의 회사 이름, 사번, 직장번호 이런 것들도 필요하겠지만.
팔려는 차의 정보가 필요할 겁니다.
하지만 판매원이 직접 팔려는 상품의 정보를 일일히, 하나하나 다 알아내진 않습니다.
물건을 납품한, 혹은 제조사에게서 정보를 받죠.
어쨰서냐면, 이미 ‘정보가 존재’하기 때문입니다.

이 예시를 Java코드에 적용시켜본다면.
이미 Car클래스에 차량의 속성과 기능들이 정의되어있습니다.
그런데 굳이 CarSeller클래스에서 다시 정의할 필요가 있을까요?
없습니다.
Java가 제일 싫어하는 건 ‘중복’입니다.
같은 내용을 몇 번이나 똑같이 쓰는 걸 싫어하죠.
그래서 상속이라는 방법을 씁니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Car {
    private String carName;
    private String makeCompany;

    void moveForward() {
        ...
    }
}

public class CarSeller extends Car{
    void sellCar {
        carName = "...";
        maekCompany = ....

        moveForwoard()...
    }
}

CarSeller코드에 무언가 변화가 생겼습니다.
천천히 살펴보도록 하겠습니다.

1
public class CarSeller extends Car { ... }

첫번째로 주목해야할 부분은 extends입니다.
‘extends’란 단어는 보통 ‘확장하다’라는 의미로 쓰입니다.
그럼 어렵게 생각할 것 없이 Java코드에서 그대로 적용시켜보면,
Car클래스 까지 확장하겠다. 정도로 해석할 수 있습니다.

어떤 걸 확장하냐? 바로, 앞에 쓰인 CarSeller클래스가 Car클래스까지 확장하겠다는 문장입니다.
그리고 바로 다음 부분을 보시면.

1
2
3
4
5
6
void sellCar {
        carName = "...";
        maekCompany = ....

        moveForwoard()...
    }

이 부분에서 이상한 점을 찾으셨나요?
네, 바로 CarSeller 클래스에선 정의한 적 없는 변수, 기능들이 쓰여있습니다.
이게 가능한 이유가 바로 extends입니다.
CarSeller 클래스는 이미 Car클래스까지 확장을 선언했기에,
Car클래스에 있는 변수와 기능들을 자유로이 사용할 수 있습니다.


현실에서의 상속은 상속자가 상속받을 사람을 정하지만,
Java에서는 그렇지 않습니다.
상속받을 클래스가 extends를 사용하여 어떤 걸 상속 받을지 정한다고 생각하시면 쉬우실 겁니다.

This post is licensed under CC BY 4.0 by the author.