본문 바로가기
JAVA

인터페이스란?

by 꿀꿀이냐옹이 2011. 3. 25.
반응형

인터페이스란?

인터페이스는 추상클래스보다 추상화 정도가 높아서, 일반메서드 또는 멤버변수를 가질 수 없다.

오직 추상메서드와 상수만을 멤버로 가질 수 있다.

 

추상클래스가 "부분적"으로 완성된 제품설계도라면, 인터페이스는  제품의 밑그림만 그려져 있는 제품스케치이다.

 

가정하여 추상클래스로 제품을 만들었다 하면, 그 제품은 비록 완성되지 않아 작동은 안 되지만, 부분적인 기능은 구현되어서

제품의 기본적인 모습은 나올 것이다, 하지만 인터페이스는 그저 제품의 기능, 용도를 써놓은 문서이기에인터페이스를 보고

제품을 만든다는 건 어불성설이다.

 

추상클래스와 인터페이스 모두 불완전한 것이기 때문에, 둘 다 다른 클래스를 작성하는데 도움 줄 목적으로 사용된다.

 

인터페이스의 작성

인터페이스의 멤버는 무조건

public static final 타입 상수이름 =

이나

public abstract 메서드이름(매개변수목록);

으로 선언되어야 한다.

 

public static final 타입 상수이름 =

에서 public은 모든 곳에서 이 상수 값을 사용(접근)할 수 있어야 한다는 뜻이고, static은 이 인터페이스를 구현한 모든

인스턴스에서 동일한 값을 가져야 한다는 뜻이고, final은 변수가 아닌 상수로 선언한다는 뜻이다.

  

인터페이스의 상속

인터페이스는 인터페이스로부터만 상속할 수 있다. "상속"이란 확장이란 의미와 같음으로,

이미 존재하는 메서드(기능)을 그대로 가져와 참고한다거나, 메서드(기능)을 더 추가한다는 뜻이다,

고로 클래스로부터 인터페이스에 상속(확장)은 구체적으로부터 추상적으로의 상속(확정)이니, 애초에

말이 안 된다.

 

클래스 A

먹다- 물고기를

자다- 9시에

 

인터페이스 A extends 클래스 A

먹다- 물고기를

자다- 9시에

 

인터페이스에는 오로지 추상화된 개념만 포함할 수 있으므로, 개념적으로 오류다.

 

특히 중요한 것은, 클래스는 이미 기능을 구체화한 설계도이기 때문에, 다중상속이 불가능하다.,

왜냐하면, 각 각의 클래스들은 이미 자신들의 메서드(기능)을 구체적으로 구현하였기 때문에, 여러 곳에서

마구잡이로 가져다 메서드(기능)을 추가하면 설계도가 매우 복잡해진다, 하지만 인터페이스는 고도로

추상화된 개념이기 때문에, 인터페이스가 포함하는 메서드(기능) 또한 매우 추상적이다,

고로 다중상속을 하더라도 문제가 없다.

 

인터페이스 A

날다

먹다

 

인터페이스 B

날다

잠자다

 

인터페이스C extends 인터페이스 A, 인터페이스 B

날다

먹다

잠자다

 

이렇듯, 고도로 추상화된 개념은 중복되어도 문제가 없으므로 자바에서는 인터페이스의 다중상속이 가능하다.

 

클래스 A

날다- 하늘을

먹다- 고기를

 

클래스 B

날다- 바다를

잠자다- 8시에

 

클래스 C extends 클래스 A, 클래스 B

날다- 하늘을 or 바다를

먹다- 고기를

잠자다- 8시에

 

이경우엔 "날다"에서 중복으로 말미암아 문제가 생긴다. 클래스 C의 인스턴스는 과연 하늘을 나는 것인가 바다를 나는 것인가?

판단이 어렵다. 이렇듯 "모호성" 으로 인해서 자바에서는 구체화한 클래스의 다중상속을 금지한다.

 

인터페이스의 구현

추상클래스는 "확장(extends)"를 통해 인스턴스를 생성하지만, 인터페이스는 "구현(implements)"을 통해 인스턴스를 생성한다.

추상클래스는, 이미 어느 정도 틀이 잡힌 설계도에, 보충적인 부분을 집어넣고, 더 필요한 부분을 확장 설계하여 최종적으로

제품을 만드는 것이고 인터페이스는, 그저 제품을 이런 식으로 만들어야 하겠다는 추상적인 개념을, 설계도로 구현하고 나서,

최종적으로 제품을 만드는 것이다. 고로 인터페이스를 구현하는 클래스가 만약 인터페이스에 있는 모든 메서드에

대해 구현을 못 했다면 여전히 불완전한 설계도이기 때문에, 그 클래스는 반드시 추상클래스로 정의되어야 한다.

완벽한 제품 설계도가 되려면 인터페이스에 포함된 모든 기능(메서드)에 대해서 구체적으로 구현을 시켜야 한다.

 

인터페이스의 이름은 주로 '~를 할 수 있는을 표현하기 위해 뒤에 'able'을 붙이는 경우가 많은데, 이것은 인터페이스 자체가

원래 매우 추상적이라서, 그 인터페이스로부터 생성된 제품은 무엇무엇"을 할 수 있는" 제품이다 정도의 정의밖에 못 내리기 때문이다.

이것은 인터페이스의 메서드(기능정의 역할을 강조하는 것이다. 또한 인터페이스를 구현한 클래스의 이름은 주로

"를 할 수 있는"이라 칭하는데, 이유는 인터페이스에서 제공하는 메서드(기능)를 실제로 구현하였기 때문이다.

 

인터페이스는 인스턴스의 메서드(기능)을 정의하는 게 주목적이고, (제품에 대한 스케치)

클래스는 인스턴스의 메서드(기능)을 실제로 구현하는 게 주목적이다. (제품의 구체적인 설계도)

 

 

인터페이스와 추상클래스

아래 개념의 구체화 과정을 보자

 

인터페이스 A

먹다

날다

자다

 

추상클래스 B extends 인터페이스

먹다

날다 -하늘을

자다

 

클래스 C extends 추상클래스 B

먹다- 고기를

날다- 하늘을

자다- 7시에

 

이렇듯, 인터페이스는 오로지 고도로 추상화된 개념만 포함할 수 있는 유형이고, 일반 클래스는 모든 개념이 구체화한 유형이다,

중간에 추상클래스는 인터페이스->클래스 사이의 징검다리 역할을 할 수 있다.

반응형

'JAVA' 카테고리의 다른 글

JAVA  (0) 2022.08.19
스레드  (0) 2011.08.10
static 사용법  (0) 2011.03.25
다형성(polymorphism)과 참조변수의 형변환  (0) 2011.03.25
추상클래스(abstract class), 추상메서드(abstract method)  (0) 2011.03.25

댓글