본문 바로가기

Java Programming

Interface 와 Abstract class

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
자바에서의 인터페이스와 추상 클래스와의 차이를 공부하던 도중에 좋은 글을 찾았습니다-
네이버 지식인을 통해서 찾았는데요 ㅎㅎ 출처를 남기도록 하겠습니다.

아래글을 참조해주세용.

<자바 인터페이스와 추상클래스의 공통점과 차이점>

클래스는 크게 일반클래스와 추상클래스로 나뉘는데 추상클래스는 본문중에 '추상메소드'가 하나 이상 포함되는 경우를 말합니다. 인터페이스는 모든 메소드가 추상메소드인 경우 선언하는 경우가 많습니다.

추상메소드라 함은 메소드의 선언부만 있고 본문이 없는 것을 말합니다. 여기서 본문은 중괄호({})로 묶여진 몸체(body)부분을 말하는데 중괄호 안이 비어있더라도 이것이 존재한다면 그것은 추상메소드가 아닙니다. 추상메소드의 선언의 예는 다음과 같습니다.

abstract public void test( int a );

즉, 메소드의 선언 후에 세미콜른(;)만을 찍어 이를 선언만 하고 구현은 자식클래스에서 하게 하는 방법입니다. 일반 클래스의 경우 상속받은 자식클래스가 반드시 부모클래스의 메소드를 '오버라이딩(overriding)'할 필요가 없지만 추상클래스를 상속받은 자식클래스는 반드시 추상메소드를 오버라이딩하여야 하기에 메소드를 강제로 구현하게 할 때 많이 쓰입니다.

추상클래스와 인터페이스의 가장 큰 차이점은 바로 '클래스'냐 아니냐의 차이입니다. 추상클래스는 엄연한 클래스로 이를 구현하는 것은 '상속(extends)'입니다. 그러나 인터페이스는 '포함(implements)'라는 키워드를 통해 구현하게 되는데 이는 자바에서 매우 중요한 차이를 가집니다.

자바는 오로지 '단일 상속'만을 지원하기 때문에 추상클래스를 상속받는 클래스는 다른 클래스를 상속받을 수 없습니다. 그러나 인터페이스를 포함하는 클래스는 다른 클래스를 상속받을 수 있습니다.

추상클래스는 일반클래스와 달리 그 자신을 new 명령어를 통해 객체를 생성할 수 없습니다. 그러나 '다형성(polymorlphism)'을 통해 자식 클래스의 객체를 생성할 수는 있습니다.

인터페이스를 쓰는 가장 큰 이유는 다중상속을 지원하지 않는 자바에서 다중상속의 장점을 가져오기 위해서입니다. 다중상속이 가지는 단점은 배제하고 오직 장점만을 취하기 위해 인터페이스를 쓰는 것입니다.

상속이란 개념은 부모클래스의 속성과 메소드를 자식클래스가 물려받는다는 것인데 쉽게 예를 들면 '자동차'라는 클래스는 '색깔', '배기량' 등의 속성과 '기름을 넣는다', '달린다' 등의 메소드를 가질 수 있습니다. 이 클래스를 상속하는 '승용차' 클래스는 별도로 선언하지 않아도 부모클래스의 '색깔', '배기량'이라는 속성과 '기름을 넣는다', '달린다'라는 메소드를 가지게 되죠.

추상클래스는 이 부모클래스가 단순히 관념적인 성격이 강할 때 많이 쓰이는데 예컨데 '새'라는 클래스는 그냥 '난다'라는 메소드를 가지지만 새의 종류에 따라 나는 방법이 조금씩 틀려 자식클래스에서 어차피 구현해야 될 부분이므로 굳이 부모클래스에서 그 내용을 구현할 필요가 없기 때문에 사용합니다.

요사이 추세는 굳이 클래스간의 조직을 표현할 필요가 없을 경우는 추상클래스를 쓰는 대신 인터페이스를 쓰는 경우가 많습니다. 인터페이스는 위에서 말씀드린바와 같이 모든 메소드가 추상메소드라서 이를 포함하는 클래스는 이들을 모두 구현해야 합니다.

추상메소드는 멤버변수(어트리뷰트)를 가지지만 인터페이스는 오직 '상수'만을 가질 수 있습니다.


-네이버 지식in 집필자 : gaorun



여기서는 추상클래스와 인터페이스와의 차이를 알게 되어서 괜찮은 글이라고 생각하고 그냥 넘어갈라고 했는데..
문제점이 생겼습니다. - -;;

리플을 보니까.. 이런 리플들이 달려 있더군요..

사용자 삽입 이미지

인터페이스를 쓰는 가장 큰 이유가 다중상속을 지원하지 않는 자바에서 다중상속을 사용하기 위해서 사용한다고 그렇게 배웠습니다만.. - -;; 그게 아니라니요..

'인터페이스는 다중 상속과는 큰 관계가 없습니다.'

선언과 구현의 분리를 통한 RTTI를 구현을 위해서랍니다. (RTTI에 대한 정보 : http://beforu.egloos.com/1444994)
RTTI는 간단하게 Runtime Type Information 의 약자인데요. 특정 개체Object로부터 실시간Runtime으로 얻을 수 있는 타입Type 정보 혹은 그 정보를 얻을 수 있는 프로그래밍 언어의 기능을 의미한다고 합니다.  이 정보에는 통상 타입의 이름, 개체 사이의 계승Inheritance 관계에 관한 정보, 멤버 함수/변수의 타입 정보가 포함된다네요.

따라서 인터페이스를 사용하는 이유를 한문장으로 정리를 해보자면

'서로 다른 클래스 계층에 있는 객체라 하더라도,
같은 인터페이스로 구현되어 있으면, 메시지를 자유롭게 보낼 수 있다'

추상클래스와 인터페이스의 차이를 알아보다가 보니까 굉장한 결과를 얻었습니다 -ㅅ-/
물론 두 개념의 차이도 알았지만 기존에 인터페이스에 대한 맹목적인 생각들을.. 다시 갱신하게 해줬구요..
인터페이스를 '프로토콜' 이라고도 불른다는 사실도 알았네요 ㅎㅎ