본문 바로가기

Java Programming

Interface 란 무엇인가..?

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Agile Java Chapter 5를 공부하던도중에 나의 한계에 치닫았다.
그러므로 -ㅅ- 하나씩 하나씩 포스팅하면서 공부를 하려고 한다.
틀리는 부분 잘못이해하는 부분이 있다면 꼭 리플 부탁합니다.


먼저 Interface라는 새로운 컨셉의 등장으로 머리가 혼미해졌다. Agile Java 5과 제목도 Interfaces andPolymorphism이다. 폴리모피즘(다형성)이라는 개념에 대해서는 아는 형에게 들은 바가 있어서 어느정도는 알고 있다.Override나 Overload에 관한 컨셉은 어느정도 알고 있으나 Interface는 전혀 신개념이었고 Interface와더불어 abstract라는 개념도 나오고 있어 더욱 헷갈렷고 기존에 extends 라는 inheritance와 더불어interface에서 쓰이는 implements 가 등장하니 갑자기 너무 많은 컨셉들이 생겨나는 바람에 헷갈리고 있다. 그래서일단 Interface부터 짚고 넘어 가도록 하겠다.

우선 Head First Java를 보고 정리를 해보았다. 처음에는 죽음의 다이아몬드 라는 multiple inheritance라는 개념에서 부터 Interface의 이야기가 시작이 된다.

상위클래스를 두 개 사용하는' 접근법에는 한 가지 문제점이 있습니다.
그런것을 '다중 상속(multiple inheritance)'라고 부르는데,
정말 안좋은 결과를 불러올수도 있습니다.

물론 자바는 다중 상속이 되지는 않지만 다중 상속이 된다고 가정할때는 이러한 문제점이 생긴다.
바로 아래와 같은 죽음의 다이아몬드 라고 알려진 문제가 있다고 한다.
죽음의 다이아몬드가 무엇인지 살펴보도록 합시다...




일단 위의 다이어 그램을 살펴보면,


- CDBurner와 DVDBurner 클래스는 모두 DigitalRecorder로부터 상속을 받고 burn()메소드를
   오버라이드 한다. 그리고 이 둘은 모두 "i" 라는 인스턴스 변수를 상속 받는다.

- "i" 인스턴스 변수를 CDBurner와 DVDBurner에서 모두 사용하는데, 그 값이 다른 경우를 상상해보면,
   ComboDrive에서 "i" 두 값이 모두 필요하다면 어떤 일이 일어날것인가?

-  ComboDrive에서 burn() 메소드를 호출하면 어떤 burn()메소드가 실행이 될것인가?

위와 같이 애매한 상황이 나올 가능성이 많다는것이다. 그래서 자바에서는 다중상속을 쓰지 않는다고 한다.
물론 납득이 가지만.. C++같은 경우에는 다중상속을 사용한다고 하는데, 어떻게 사용할 수 있는지 궁금하다..

그러면 상위 클래스가 두개가 필요한 경우, 자바는 어떻게 이것을 처리해야 하는것일까?
자바에서 다중상속 대신 다른 해결책을 제공한다, 그것이 바로 Interface라는 것이다.

모든 메소드를 추상메소드로 만들면 하위 클래스에서 반드시 메소드를 구현해야 하므로 실행 중에 JVM에서 상속받은 두가지 버전 중에 어떤 것을 호출해야 할지 결정하지 못하는 문제가 생길 리 없다.

아래와 같은 소스 코드로 인터페이스를 표현할수 있다.



일단 Pet 이라는 Interface에서 중괄호가 없는(본체가 없는) 추상 메소드들을 만들어주고 Dog라는 클래스를 통해서 기존의 Pet이 가지고 있던 추상 메소드를 구현해준다.