본문 바로가기

JAVA

인터페이스 정의(추상클래스)

[출처: castello]

"인터페이스를 쓰는 가장 큰 이유는 다중상속을 지원하지 않는 자바에서 다중상속의 장점을 가져오기 위해서입니다." 가 아니라. 선언과 구현의 분리를 통한 RTTI(Run Time Type Info)를 구현하기 위해서입니다.

자바 설계자들은 다중상속은 그리 중요한 요소가 아니라고 판단했습니다. 실제로 자바클래스중에서 인터페이스를 이용한 다중상속을 구현한 경우는 굉장히 드뭅니다.

 

[출처: tkandrea92]
인터페이스는 다중상속과는 관계가 큰 관계가 없습니다. 사실 인터페이스를 구현한다고 해서, 인터페이스에 있는 것을 상속받는다는 그런 개념이 아닙니다. 인터페이스는 다른 말로 '프로토콜'이라고 하는데, 이것은 '객체가 이해할 수 있는 메시지의 집합'입니다.

사실 동적 자료형 - 실행시간에 자료형을 검사하는 - 언어인 Smalltalk와 같은 경우는 명시적으로 이 프로토콜을 드러내지는 않습니다. (물론 최근 ANSI에서 Smalltlak를 표준화할 때 프로토콜도 표준화 헀으므로 대부분의 Smalltlak는 프로토콜을 지원합니다.)

그런데 Java와 같이 정적인 자료형 검사 - 번역시간에 자료형을 검사 - 하는 언어의 경우는 서로 상속관계가 아닌 클래스의 경우는 다형성을 구현하지 못합니다. 그래서 결국 객체들이 알아들을 수 있는 공통된 메시지의 집합을 정의하게 되었는데, 이것이 바로 프로토콜, 즉 인터페이스입니다.

이런 개념에서 출발한 인터페이스는 castello 님의 말씀대로, 현재에는 선언과 구현을 분리하는 용도로 자주 사용되고 있습니다. 인터페이스의 키포인트는 이것입니다. 서로 다른 클래스 계층에 있는 객체라 하더라도, 같은 인터페이스로 구현되어 있으면, 메시지를 자유롭게 보낼 수 있다는 겁니다.

[출처: neolha]
윗분들이 지적하셨듯이 '인터페이스가 다중상속의 보안 도구'라고 생각하는 것이 가장 흔하면서 큰 잘못된 상식이라고 생각합니다.

인터페이스의 용도를 정확히 이해하려면 우선 상속과 구현의 차이를 이해하셔야 합니다. 이미 상속/구현이라는 말 속에 핵심 내용이 다 들어가 있습니다. : 상속은 물려받는다란 뜻이에요. 이른바 부모로부터 무언가를 물려받아 거저 먹겠다는 것이죠. 구현:구현은 규칙이나 규격에 따라 실제를 만든다는 말입니다. 상속과는 정 반대로 의무가 따릅니다. 그래서 상속은 주로 새로 개발할 클래스를 쉽게 만들 수 있도록 해 줍니다. 결국 이미 구축된 개발환경(부모 클래스들)이 자식들을 돕는 것이죠. 반면에 구현(특히 인터페이스를 구현)할때는 인터페이스가 제시하는 요건을 충족시켜야 합니다. 즉 부모가 제시하는 엄격한 규칙에 맞도록 무엇인가를 만들어줘야 하는 것으로. 자식보다는 부모(이미 구축된 프래임워크)가 할 일이 편해집니다. 즉 자식들의 다양성 때문에 부모들도 그때 그때 새롭게 개발을 하거나 할 필요가 없어지기 때문에 보다 추상화되고 규격화 된(그래서 간단한) 프레임워크를 구축할 수가 있습니다.

(maul5: 상속은 Class, Abstract Class / 구현은 Interface로 생각하시면 됩니다.)

 

'JAVA' 카테고리의 다른 글

추상클래스와 인터페이스 차이  (0) 2011.04.11
힙과 스택의 개념  (0) 2011.04.05