본문 바로가기

프로그래밍/JAVA

[ JAVA ] 상속(inheritance)

1. 상속의 정의와 장점

- 상속이란 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.

- 상속은 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다.

- 상속을 구현하는 방법 : 새로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 키워드 'extends'와 함께 써준다.

예시1)

<클래스 Parent와 Child의 상속관계도>

◾ 조상 클래스 - 부모(parent)클래스, 상위(super)클래스, 기반(base)클래스
◾ 자손 클래스 - 자식(child)클래스, 하위(sub)클래스, 파생된(derived)클래스

예시2)

> 조상 클래스가 변경되면 자손 클래스는 자동적으로 영향을 받게 된다.
> 자손 클래스가 변경되는 것은 조상 클래스에 아무런 영향을 주지 못한다.
> 생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다.
> 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.
   그래서 상속을 받는다는 것은 조상 클래스를 확장(extend)한다는 의미로 해석할 수도 있고,
   이것이 상속에 사용되는 키워드가 'extends'인 이유이기도 하다.
> 자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버와 자손 클래스의 멤버가 합쳐진 하나의 인스턴스로 생성되어 따로 조상 클래스의 인스턴스를 생성하지 않고도 조상 클래스의 멤버들을 사용할 수 있다.

예시3)

> Parent 클래스와 Child 클래스, 그리고 Parent 클래스와 Child2 클래스는 서로 상속관계에 있다.
> 클래스 Child와 Child2 간에는 서로 아무런 관계도 성립되지 않는다.
> 클래스 간의 관계에서 형제 관계와 같은 것은 없다.
> 부모와 자식의 관계(상속관계)만 존재한다.

❗ 전체 프로그램을 구성하는 클래스들을 면밀히 설계 분석하여, 클래스간의 상속관계를 적절히 맺어 주는 것이 객체지향 프로그래밍에서 가장 중요한 부분이다.

2. 클래스간의 관계 - 포함관계

- 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것을 뜻한다.

예시)

> Car클래스의 단위구성요소인 Engine, Door와 같은 클래스를 Car클래스의 멤버변수로 선언하여 포함관계를 맺음
> 코드가 간결해져서 이해하기 쉽고, 단위클래스 별로 코드가 작게 나뉘어 작성되기 때문에 코드를 관리하는데 수월해진다.

3. 클래스간의 관계 결정하기

◾ '~은 ~이다.'라는 문장이 성립하면 서로 상속관계를 맺어 준다.
'~은 ~을 가지고 있다.'는 문장이 성립하면 포함관계를 맺어 준다.
◾ 프로그램의 모든 클래스를 분석하여 가능한 많은 관계를 맺도록 하여 코드의 재사용성을 높여야 한다.

예시)

> 도형을 의미하는 Shape클래스, 2차원 좌표에서의 점을 의미하는 Point클래스, 원을 의미하는 Circle클래스 정의
> A Circle is a Shape.  // 1. 원은 도형이다.
> A Circle is a Point.    // 2. 원은 점이다?

> A Circle has a Shape. // 3. 원은 도형을 가지고 있다?
>
A Circle has a Point.   // 4. 원은 점을 가지고 있다.

> 1번과 4번 문장이 자연스러운 것을 알 수 있다.
   그러므로 Circle을 Shape와 상속관계로, Point와는 포함관계로 정의한다.
> 조상 클래스에 정의된 메서드와 같은 메서드를 자손 클래스에 정의하는 것을 '오버라이딩'이라고 한다.
   (자세한 설명은 다음 글 참고)

 

4. 단일 상속(single inheritance)

- 다른 객체지향언어인 C++에서는 여러 조상 클래스로부터 상속받는 것이 가능한 '다중상속(multiple inheritance)'을 허용한다.
자바에서는 '단일 상속(single inheritance)'만 허용한다.
다중상속 장점 : 여러 클래스로부터 상속받을 수 있기 떄문에 복합적인 기능을 가진 클래스를 쉽게 작성할 수 있다.
다중상속 단점 : 클래스간의 관계가 매우 복잡해지고, 서로 다른 클래스로부터 상속받은 멤버간의 이름이 같은 경우 구별할 수 있는 방법이 없다.
단일 상속은 하나의 조상 클래스만 가질 수 있기 때문에 클래스 간의 관계가 명확하고 코드를 더욱 신뢰할 수 있다.

5. Object 클래스 - 모든 클래스의 조상

- Object클래스는 모든 클래스 상속계층도의 최상위에 있는 조상클래스이다.
- 다른 클래스로부터 상속 받지 않는 모든 클래스에 컴파일러가 'extends Object'를 자동으로 추가한다.
- Object클래스에는 toString(), equals()와 같은 모든 인스턴스가 가져야 할 기본적인 11개의 메서드가 정의되어 있다.

'프로그래밍 > JAVA' 카테고리의 다른 글

[ JAVA ] 인터페이스(interface)  (0) 2022.10.29
[ JAVA ] 오버라이딩(overriding)  (0) 2022.10.09
[ JAVA ] 자바의 형변환  (0) 2022.10.08
[ JAVA ] 변수와 메서드  (0) 2022.09.20
[ JAVA ] 기본형  (0) 2022.08.27