단일 상속, Object 클래스
단일 상속 (Single Inheritance)
- Java는 단일상속만을 허용한다. (C++은 다중상속 허용)
자바는 단일상속만 허용한다.
하나의 부모로부터만 상속받을 수 있다.
그래서 TvDVD라는 클래스를 만들 때, 2개의 조상을 상속받는 것을 허용하지 않는다.
둘중에 하나 선택을 해야한다. 하나만 가능하다.
다중 상속은 장점도 있지만 문제점이 많이 있어서 자바에서는 단일 상속만을 지원한다.
다중 상속의 문제점은 어떤 것이 있냐면,
예를 들어서 부모가 Tv, DVD 이렇게 2개일때 그 두 클래스를 상속받아서 TvDVD라는 클래스를 만들었다고 가정해보자.
만약에 Tv클래스와 DVD클래스에 각각 같은 이름의 메서드 void power() {} 가 있는데,
Tv클래스의 메서드 내용은 void power() {A}, DVD클래스의 메서드 내용은 void power() {B} 이면
TvDVD는 이 둘중에 어떤 power를 상속받아야 하는것일까?
이름이 똑같은데 내용이 다르니까 어느것을 상속받아야할지 참 애매하다.
이러한 충돌문제가 있기 때문에 다중 상속 문제가 있는 것이다.
실제로는 얼마나 충돌이 있겠느냐 라고 할 수도 있지만,
조상이 여러개고, 어떤 것을 상속받아서 자손인 것을 상속받고 그러한 경우에는 더 복잡해진다.
그러면 생각보다 충돌위험이 높고, 충돌했을 때 해결하기가 어렵다.
그래서 Java는 다중 상속을 포기하고 단일 상속만을 지원하기로 결정했다.
C++이후 자바가 이러한 결정을 했고,
자바 이후로 나오는 언어들도 대부분 단일상속만 지원하며 개발되고있다.
자바는 인터페이스를 이용하면 이러한 충돌문제를 해결하면서 다중상속과 같은 효과를 낼 수 있는 방법들을 제공한다.
아직, 인터페이스를 배우지 않은 상태이기 때문에 인터페이스를 사용하지 않고도
다중상속처럼 편리하게 작성하는 방법은,
- 비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.
어떻게 하는 것이냐면, Tv클래스가 있고, DVD클래스가 있을 때 TvDVD클래스를 만든다고 하면,
만약에 TV클래스가 비중이 높으면 Tv클래스를 상속하고, 나머지는 포함관계로 포함시키면 된다.
Tv는 상속으로 처리하고, DVD는 포함관계로 처리한다.
포함관계는 뭐냐면, TvDVD에서 DVD객체를 만들어 놓고,
DVD가 가진 메서드를 작성한다. 작성을 하는데, TvDVD클래스에서는 껍데기만 만들어 놓고,
DVD객체를 사용하도록 코드를 작성하는 것이다.
즉, 코드를 실제로 만든 것이 아니라, dvd가 가지고 있는 메서드를 호출한 것이다.
다만, 이 메서드들을껍데기 뿐이지만 각각 만들어줘야하기때문에 번거롭긴 하지만, 그래도 그 안에 메서드 코드를 작성할 필요가 없이 호출하기만 하면 된다.
이렇게 하면 쉽게 다중 상속의 효과를 낼 수 있다.
Object클래스 - 모든 클래스의 조상
- 부모가 없는 클래스는 자동적으로 Object클래스를 상속받게 된다.
- 모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받는다.(toString(), equals(object obj), hashCode(),...
object클래스는 모든 클래스의 조상이다. 이것이 무슨말이냐면,
부모가 없는 클래스, 즉 상속받지 않는 클래스는 자동적으로 Object클래스를 상속받게 된다
좌측 코드를 보면, Tv클래스는 부모가 없다. SmartTv클래스는 Tv클래스가 부모다.
이 코드를 컴파일하면 우측 코드처럼 바뀐다.
부모가 없는 경우에 컴파일러가 extends Object를 자동추가해준다.
그래서 모든 클래스는 Object클래스가 조상이기 때문에, object클래스에 정의된 11개의 메서드를 상속받는다.
ex (toString(), equals(object obj), hashCode(),...
상속 계층도를 그림으로 그려보면, 항상 제일 위에 조상으로 항상 Object클래스가 있다.
Objcet클래스는 모든 클래스의 최고 조상이다.
그래서 모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받는다.
'JAVA' 카테고리의 다른 글
참조변수 super, 생성자 super() (0) | 2022.03.31 |
---|---|
오버라이딩 (overriding) (0) | 2022.03.30 |
클래스 간의 관계, 상속과 포함 (0) | 2022.03.30 |
상속 (0) | 2022.03.30 |
변수의 초기화, 멤버 변수의 초기화 (0) | 2022.03.29 |
댓글
이 글 공유하기
다른 글
-
참조변수 super, 생성자 super()
참조변수 super, 생성자 super()
2022.03.31 -
오버라이딩 (overriding)
오버라이딩 (overriding)
2022.03.30 -
클래스 간의 관계, 상속과 포함
클래스 간의 관계, 상속과 포함
2022.03.30 -
상속
상속
2022.03.30