드디어 두번의 상속ㅅㅂ하지말자 를 지나 상속하자 가 나왔습니다.
쉽게말하자면 객체지향언어의 다중상속과도 관련된 항목이라 할수 있겠습니다.

C++를 하다가 자바로 넘어올때 상속이나 오버라이딩에 대해서 했갈려 하는 부분중 하나가 가상함수
 에 대한부분이 있습니다. C++에서는 기본적으로 가상함수를 지원하지 않고 virtual 키워드를 주어야 사용할수 있습니다. 게다가 순수 가상함수 라는게 있죠. virtual 함수 끝에 =0; 을 하는 특이한 코드를 본적이 있을겁니다.

자바에서는 모든 메소드가 가상함수이고 특별히 순수 가상함수를 만들수 있습니다. interface나 abstract 키워드를 이용해서 말이죠

이 이야기를 왜 헀는냐? 항목18에서는 어떤 클레스에 어떠한 기능을 구현하도록 하는 메커니즘을 소개하고있습니다.
바로 순수 가상함수 에 대한 이야기입니다.

자바에서는 위에서 말했듯이 abstract classinterface를 이용하는데 이 두가지의 공통점은 스스로 객체를 생성할수 없고 상속받은 클레스에 어떤 메소드의 구현을 강제하는겁니다. 차이점이라면 단일상속과 다중상속이 되겠습니다.
초기의 객체지향언어에서 상속이라는 개념을 만든뒤 문제가 되었던것중 하나는 다이아몬드 상속 (진짜 다이아몬드를 상속하는게 아니라..)입니다.

A라는 메소드를 상속받아서 호출했는데 부모1과 부모2에 각각 A라는 메소드가 있다면 어느것을 호출해야 하느냐? 라는 문제였습니다. 해결방법으로는 상속할때 먼저 적은쪽을 호출한다던지 가상함수를 만들던지 하는 방법이 있었습니다.
C++에서 virtual 키워드가 생긴것도 그런 이유입니다.

따라서 자바에서는 다중상속의 복잡한 문제를 없에기 위해서 다중상속을 없에버렸습니다! 우왕ㅋ굳ㅋ
근데 다중상속이라는게 좀 복잡한 문제를 일으키긴 하지만 정말 유용한 개념이기도 합니다. 개라는 클레스와 새 라는 클레스가 있는데 개새! 를 만들고 싶다. 그러면 개를 상속받은뒤에 날개를 붙일것이냐. 아니면 새를 상속받은뒤 개모양으로 만들것이냐 라는 고민할거 없이 개와 새를 모두 상속! 즉 다중상속을 하는겁니다.(물론 이걸로 해결이 되는건 아니겠지만)

근데 자바는 그런거 없잔아.. 안될거야 우린..

이라고 좌절하지 않기 위해서 interface를 만든겁니다.
interface는 XXX라는 메소드를 반드시 만들것! 이라고 명시만 해놓고 아무짓도 안합니다. 대신 implements 한 클레스에서 안만들면 빨간거 보여줍니다.
그러니까 interface를 다중상속해서 중복으로 메소드가 수십개 존재한다고 하더라도 어차피 내용물이 없으니 햇갈릴 이유도 없다. 라는거죠. 어차피 내용물은 구현하는 클레스에서 작성해야하는거라서..

근데 이것도 좀 단점은 있습니다. interface를 상속할때마다 상속받은 클레스에서는 또 새로 구현해야한다는거죠

이것에 대한 방법도 있습니다. 골격구현 추상클레스 라는건데요
interface A에 a,b,c,d 라는 메소드가 있다 라고 하면
abstract class B implements A
즉 A를 상속받은 B라는 추상클레스를 새로 만든뒤 항상 비슷한 기능을 하게되는 a,b,c 라는 메소드를 구현해주고 d는 abstract methode 추상메소드로 남겨두는겁니다.
그러면 어떤 클레스가 A를 구현할 필요없이 B를 상속받은뒤 메소드 d 만 구현하면 되는거죠.

이게 좋은 방법이긴 하지만 결국 interface를 이용한 다중상속에서 여러메소드를 각각 구현해줘야 한다는 점에 대해서는 약간의 도움 정도만 되는군요

골격구현과 비슷하지만 조금 다른 단순구현 클레스도 있습니다. 이건 그냥 일반적으로 쓰는 인터페이스 상속입니다.


인터페이스를 만들고 다른 클레스들이 상속, 구현하고 나면 인터페이스를 수정하는것은 말도 안되게 골치아픕니다.
그러니까 인터페이스는 처음부터 잘만들자. 라고 결론을 내는군요


.....역시 상속이라는 문제는 프로그래밍이에서나 드라마에서나 골치아프네요
정리가 앙대 ㅠ.ㅠ
Posted by 동적할당
: