본문 바로가기
공부/자바

상속 & 클래스 간의 관계

by xladmt 2024. 5. 30.

상속

  기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다. 상속을 통해 클래스를 작성하면 적은 양의 코드를 작성할 수 있고 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이하다. 이러한 특징은 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생상성과 유지보수에 크게 기여한다.

class Child extends Parent{
	// ...
}

 

  자손 클래스는 조상 클래스의 모든 멤버를 상속 받으므로 항상 조상 클래스보다 같거나 많은 멤버를 갖는다. 즉, 상속에 상속을 거듭할수록 상속받는 클래스의 멤버 개수는 점점 늘어나게 된다. 그래서 상속을 받는다는 것은 조상 클래스를 확장(extend)한다는 의미로 해석할 수도 있으며 이것이 상속에 사용되는 키워드가 'extends'인 이유기도 한다.

- 생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다.
- 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.
- 자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버와 자손 클래스의 멤버가 합쳐진 하나의 인스턴스로 생성된다.
- 자바에서는 단일 상속만을 허용한다.

 

클래스 간의 관계

  • 상속
    • 기존의 클래스를 재사용해서 새로운 클래스를 작성하는 것.
  • 포함
    • 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것을 뜻한다.
    • 폴더 안에 폴더
// 포함
class Circle{
	Point c = new Point();
    int r;
}

// 상속
class Circle extends Point{
	int r;
}
원(Circle)은 점(Point)이다. - Circle is a Point. (상속)
원(Circle)은 점(Point)을 가지고 있다. - Circle has a Point. (포함)

 

 

단일 상속(single inheritance)

자바에서는 단일 상속만을 허용한다. 즉, 하나의 부모만 상속을 받을 수 있다.

 

왜 다중 상속은 안될까?

  다중 상속을 허용하면 여러 클래스로부터 상속받을 수 있기 때문에 복합적인 기능을 가진 클래스를 쉽게 작성할 수 있다는 장점이 있지만, 클래스 간의 관계가 매우 복잡해지며 서로 다른 클래스로부터 상속받은 멤버간의 이름이 같은 경우 구별할 수 있는 방법이 없다는 단점을 가지고 있다.  static 메서드라면 메서드 이름 앞에 클래스의 이름을 붙여서 구별할 수 있다지만, 인스턴스 메서드의 경우 선언부가 같은 두 메서드를 구별할 수 있는 방법이 없다.

 자바에서는 다중상속의 이러한 문제점을 해결하기 위해 다중상속의 장점을 포기하고 단일 상속만을 허용한다. 단일 상속이 하나의 조상 클래스만 가질 수 있어 다중상속에 비해 불편한 점도 있겠지만, 클래스 간의 관계가 보다 명확해지고 코드를 더욱 신뢰할 수 있게 만들어 준다는 점에서 다중상속보다 유리하다.

 

참고

Java의 정석 (남궁성 저)

'공부 > 자바' 카테고리의 다른 글

Package & import  (0) 2024.05.31
오버라이딩(overriding)  (0) 2024.05.31
변수의 초기화  (0) 2024.05.29
생성자(Constructor)  (0) 2024.05.29
오버로딩(overloading)  (0) 2024.05.29