자바 다중상속 안되는 이유 - jaba dajungsangsog andoeneun iyu

[JAVA] 다중상속, 인터페이스

Web/JAVA 2020. 2. 6. 05:55

1. 클래스 다중상속의 장점과 단점

장점: 

객체에 다형성을 원하는만큼 부여할수있다. (단순해짐)


단점: 

하나의 객체에 두명이상의 부모에서 똑같은 형태의 메소드를 두개이상 물려받을 수있다. 
이때, 자식클래스에서 오버라이드를 하지않으면, 모호함이 발생한다.(메소드를 오버라이드 하지 않아도 문제가 되지 않기때문에)


2. 자바에서 클래스 다중상속이 안되는 이유?


다중상속의 단점에 있는 모호함때문이다. 

예를들어, 다중상속을 했을때, 상속받은 메소드가 중복될 경우 문제가 생긴다.
자바에서는 개발자가 모호함때문에 생기는 문제를 애초에 다중상속을 막음으로써 차단한것이다.

(c++같은경우, 다중상속을 허용함)

3. 클래스 다중상속에서 나타날수있는 문제점을 해결할수있는방법


모호한 메소드를 오버라이드를 한다.(함수를새로만듬)

4. 인터페이스 와 클래스의 차이


>> 인터페이스는 추상클래스이다.(실체가 없는 클래스) 

5. 자바에서 왜 인터페이스의 다중상속을 허용하는지?


객체지향 프로그램에서 다형성을 중요한데, 자바는 다중상속을 막혀있기 때문에 자유로운 다형성 부여가 어려워진다.

그래서 인터페이스라는 제한되어있는 다중상속(상속의 개념이라기 보다는 public을 이용한것)을 허용했다.

인터페이스는 추상클래스(추상메소드포함)이기 때문에 무조건 오버라이드를 해야한다.

따라서 인터페이스를 다중상속해서 모호함이 발생하더라도 자식클래스에서 해당 메소드를 오버라이드를 해야하는것이

필수이기 때문에, 모호함이 존재할 수없는 구조가된다.



TMI

인터페이스는 실체가 없는 추상클래스 이기때문에 다중상속을 할때보다 모호한관계에 대한 부담을 덜 수있다. 
(interface에 선언되는 변수는 항상 "public static final(상수)"이 붙기 때문에 충분히 구분이 가능.)
인터페이스에선 함수를 정의 하거나 데이터에 해당하는 변수를 갖을 수 없다. (상수와 함수 선언만 가능하기 때문) 
추상클래스는 인스턴스화만 못할 뿐 상속을 받으면 추상클래스 안의 내용을 모두 사용할 수 잇다.

공유하기

게시글 관리

구독하기chae96

'Web > JAVA' 카테고리의 다른 글

[JAVA] 이클립스 단축키 모음  (0)2020.08.08[JAVA] I/O Stream  (0)2020.06.30[JAVA] 람다식 문법 , 익명클래스  (0)2020.05.13[JAVA] 메서드 오버로딩 & 오버 라이딩  (0)2020.04.17[JAVA] 타입변환  (0)2020.04.09

TAG

인터페이스 #다중상속 #자바는 다중상속이라는것이 없다. 인터페이스만있을뿐

관련글 관련글 더보기

  • [JAVA] I/O Stream
  • [JAVA] 람다식 문법 , 익명클래스
  • [JAVA] 메서드 오버로딩 & 오버 라이딩
  • [JAVA] 타입변환

댓글 0

댓글 접기 댓글 펼치기

이전 댓글 더보기

예전에 자바 공부를 할 때는 다중상속 이라는게 잘 이해가 되지 않아 살짝 두려운 내용이었지만, 지금 자바 공부를 다시 하고 있을 때는 이해가 되어서 글로 정리를 해보려 한다. ( 예전엔 이게 왜 어려웠었지? )

 

다중상속이 무엇인지 공부를 하기 전에 하나 알아두어야 할 것은 자바의 일반 클래스는 부모 클래스를 단 하나만 가져야 하므로 여러 부모 클래스를 갖는 다중 상속을 지원하지 않는다. 그러나 인터페이스는 추상 클래스보다 더 추상적이므로 여러 인터페이스를 상속받는 다중 상속을 지원한다. 

 

그리고 인터페이스는 클래스가 아니다. 그래서 인터페이스를 구현 하는 클래스는 implements 를 통해서 구현을 하고 인터페이스 끼리의 상속을 받을 때는 extends 를 사용한다.  

 

 

자바 다중상속 안되는 이유 - jaba dajungsangsog andoeneun iyu

예를들어 X, Y 라는 인터페이스가 존재하고 이를 상속받는 MyInterface 도 존재한다고 가정하자. MyInterface를 구현 할 클래스인 MyClass도 존재한다. 

 

1

2

3

public interface MyInterface extends  X, Y {

    

}

 

 

 

이렇게 인터페이스에서 다중 상속을 할 때는 , 로 구분을 해서 나열한다. 

 

1

2

3

public class MyClass extends PMyClass implements MyInterface {

    

}

 

 

 

 

그리고 MyClass의 부모 클래스인 PMyClass 도 있다고 가정하면 이렇게 일반 클래스 or 추상 클래스로 부터의 상속도 받고 인터페이스도 구현을 하는 클래스로 extends 와 implements를 같이 써서 사용할 수도 있다.

 

 그냥 이렇게 다중 상속의 개념만 놓고보면 진짜 단순하다. ( 그냥 부모가 2개 이상이면 다중 상속이다 )

 

 

그렇다면 다중 상속은 자바에서는 왜 지원하지 않는 것일까? 

 

https://siyoon210.tistory.com/125ㅇ

 

자바는 왜 다중상속을 지원하지 않을까? (다이아몬드 문제)

다이아몬드 문제 다중 상속을 지원하게 되면 하나의 클래스가 여러 상위 클래스를 상속 받을 수 있습니다. 이런 특징 때문에 발생하게 되는 문제가 있는데, 바로 '다이아몬드 문제' 입니다. 위의 클래스 다이어그..

siyoon210.tistory.com

제가 쓰는 글을 공부한 것을 정리하는 TIL 용도입니다. ( 위의 글에서 잘 정리 되어 있어서 참고하려 합니다! )

 

자바 다중상속 안되는 이유 - jaba dajungsangsog andoeneun iyu

 

위와 같은 구조가 있다고 가정해보자. GrandFather 에 A() 라는 메소드가 있어서 FatherA 와 FatherB 에서 오버라이딩 해서 구현 했다고 생각해보자. 이러면 Son 입장에서는 A() 메소드를 호출 했을 때 누구의 메소드를 가져다 써야 할지 정할 수 없다. 따라서 컴파일도 되지 않는다.

 

인터페이스는 기능에 대한 선언만 하기 때문에, 위와 같은 경우더라도 충돌할 여지가 없다. 생각해보면 인터페이스 안에는 추상메소드만 선언을 하기 때문에 하위 클래스들은 그 추상메소들을 오버라이딩 해서 사용한다. ( 구현을 한다 ) 

( 위의 그림의 경우를 인터페이스라고 가정한다면 다이아몬드에 보이는 4개 다 interface 이다 )

 

default method는? (자바 8 이후부터 가능)

나는 default method가 가능하다는 것을 오늘 알았다.. 책에는 이런말이 없었는데 인터페이스를 검색해보다가 알게 되었다. default method는 재정의(오버라이딩)해서 사용할 수 있다.

 

그리고 default method 는 그러면 하위 클래스에서 구현을 해야할까?  라는 점이 궁금했다.

하지만 이미 디폴트 메소드는 구현이 된 것이기 때문에 다시 구현을 할 필요가 없다는 점을 알게 되었다.

그리고 아까 위의 다이아몬드 관계에서 가장 상위 인터페이스인 GrandFather 이 default A() 메소드를 구현하고, 아래 FatherA 와 FatherB 에서 default A() 메소드를 오버라이딩을 했다면, 가장 하위 클래스인 Son에서 default A() 메소드를 사용하려 한다면 아까 일반 클래스에서 다중 상속이 안되는 이유처럼 컴파일 에러가 발생한다.