본문 바로가기

프로그래밍언어/JAVA

[JAVA] 상속 (Inheritance)

반응형

1. 상속

상속은 기존 클래스를 재사용하여 새로운 클래스를 작성하는 것이다. 상속을 이용하면 기존에 작성한 클래스를 사용할 수 있기 때문에 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 유리하다.

자바에서 상속을 구현하기 위해서는 'extends' 키워드를 사용하면 된다. 클래스 선언 시에 클래스 이름 뒤에 extends 와 상속하려는 클래스의 이름을 적어주면 된다.

// Child 클래스가 Parent 클래스를 상속
class Child extends Parent {
	...
}


상속 관계에 있는 두 클래스는 다음과 같은 용어로 표현한다.

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

상속 관계에서 자손 클래스는 부모 클래스의 모든 멤버를 상속받기 때문에 Child 클래스는 Parent 클래스에 선언된 모든 멤버들, 변수와 함수 들을 모두 포함하고, 이를 사용할 수 있다.

자손 클래스는 부모 클래스의 모든 멤버를 상속받는데, 다음의 예외가 있다.
- 생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다.
- 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.


2. 클래스 포함 관계

앞서 설명한 것과 같이 상속을 사용하면 클래스 간의 관계를 맺어주고 클래스를 재사용할 수 있다. 이 외에도 클래스를 재사용하는 방법이 또 있는데, 바로 클래스를 포함 관계를 맺어주는 것이다. 클래스 간의 포함 관계를 맺어준다는 것은 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것을 의미한다.

 

class Point {
	int x;
	int y;
}

class Circle {
	int a;
	int b;
	Point p = new Point();
}

 

위의 예시에서 Circle 클래스는 Point 타입의 멤버 변수 p 를 가진다. 이처럼 Circle 클래스가 Point 클래스를 포함하는 방식으로 다른 클래스를 재사용 할 수 있다.


3. 클래스 간의 관계 결정

그렇다면 상속과 포함 관계를 어떤 경우에 사용해야할까?

 

상속 : is-a 관계로 Circle 클래스는 Point 이다.
포함: has-a 관계로 Circle 클래스는 Point를 가지고 있다.


상속은 is-a, 포함은 has-a 관계로 관계를 맺으려는 두 클래스 간의 상황과 관계를 고려하여 알맞은 관계를 정의해주면 된다.

 


4. 단일 상속 (single inheritance)

다른 객체지향언어인 C++ 에서는 여러 조상 클래스로부터 상속을 받을 수 있는 다중 상속을 지워하지만 자바에서는 단일 상속만들 허용한다. 그렇기 때문에 자바에서는 extends 뒤에 하나의 조상 클래스만 작성할 수 있다.

다중 상속을 사용하면 여러 클래스의 멤버를 사용할 수 있지만 그만큼 클래스 관계가 복잡해진다는 단점이 있다. 또한 다중상속을 한 조상 클래스들이 동일한 이름의 멤버를 가지고 있는 경우 자손 클래스에서 어떤 멤버를 사용하는지 알 수 없다는 단점이 있다. 이러한 문제점을 해결하기 위해 자바는 단일 상속을 채택했다.


5. Object 클래스

Object 클래스는 자바에서 모든 클래스의 상속계층도 최상위에 위치하는 조상 클래스이다. 따로 상속으로 조상 클래스를 명시하지 않은 클래스들도 Object 클래스를 상속받게 된다.

Object 클래스는 toString 이나 equals 메서드를 가지고 있기 때문에 따로 상속이나 해당 메서드를 정의하지 않고도 사용할 수 있다.

반응형

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

[JAVA] 자바 패키지  (0) 2021.11.08
[JAVA] 오버라이딩 (Overriding)  (0) 2021.11.08
[JAVA] HashMap vs HashTable  (0) 2021.10.29
[JAVA] 변수의 초기화  (0) 2021.09.04
[JAVA] 생성자 (Constructor)  (1) 2021.09.02