본문 바로가기

Programming/JAVA

인터페이스(2) - 인터페이스의 선언과 구성 멤버의 특성

java logo image

 

 

 

인터페이스는 앞서 언급했다시피, 클래스와 물리적으로 같은 레벨로 생각해 주시면 됩니다. 그래서 인터페이스 이름 자체의 작명 원칙도 클래스와 동일하게 처리해 주면 됩니다. 이클립스 등에서 인터페이스를 생성해 주면, 클래스 형태로 다음과 같이 생성됩니다.

 

[public] interface 인터페이스명칭 { ... }

// 예시
public interface RemoteControl {

}

 

 


 

 

 

○ 인터페이스의 구성 멤버

 

- 기본적으로 인터페이스는 객체로 생성할 수 없는 개념이기 때문에, 생성자를 갖지 않습니다.

- 인터페이스는 상수(필드) / 메서드을 구성 멤버로 갖습니다.

 

이 두 개의 원칙을 잘 기억해야 합니다. 그럼 구성 멤버는 구체적으로 어떤식으로 선언 및 사용할 수 있을지 하나씩 짚어보도록 하겠습니다. 

 

 

● 상수 필드(Constant Field)

인터페이스는 위에서도 말했듯이 인스턴스를 갖지 못하는 존재입니다. 정확히는 다른 인스턴스 객체를 어떻게 사용할지 가이드를 주는 설명서와 같은 존재이지요. 그래서 일반적인 런타임 시점에 데이터를 저장하는 필드 값을 선언할 수 없습니다. 하지만, 유일하게 가질 수 있는 필드 값은 바로 [상수 필드] 입니다. 상수라 함은, 우리가 클래스 개념을 배울 때와 마찬가지로 static final 형태의 필드를 의미합니다. 이것은 인터페이스 자체에 고정된 값이기 때문에 반드시 초기값을 선언해줘야 합니다.

 

● 추상 메서드(Abstract Method)

우리가 익히 배운 추상 메서드입니다. 객체가 가져야하는 메서드를 정의한 것입니다. 호출 시 필요한 파라미터, 리턴 타입, 메서드 이름만을 갖고 있으며 실제 실행 코드는 구현 객체가 갖습니다. 

 

● 디폴트 메서드(Default Method)

기본적으로 인터페이스는 '사용 설명서, 가이드라인'이라고 했습니다. 그래서 위의 추상 메서드를 제공한다고 설명했죠. 그런데 디폴트 메서드는 이 개념에서 살짝 벗어납니다. 자바 8에서부터 허용한 개념인데, 우리가 위에서 설명한 것과 다르게(!) 인터페이스 안에서 구현 코드까지 모두 작성되어 있는 메서드입니다(??) 

 

'그럼, 인터페이스가 이 메서드를 갖는 구조인가?' 라고 물어보면, 그것은 아닙니다. 즉, 인터페이스 내에 실행 코드까지 구현되어 있지만, "실제로 이 디폴트 메서드는 인터페이스를 구현하는 객체가 갖게 되는" 독특한 구조입니다. 인터페이스는 기본적으로 객체를 생성하지 못한다고 했기 때문에, 이 디폴트 메서드는 해당 인터페이스를 구현(상속과 비슷한 개념)하는 경우에만 사용할 수 있습니다. 

 

이 디폴트 메서드는 인터페이스의 기능을 확장하기 위해 허용된 새로운 개념입니다. 

 

● 정적 메서드(Static Method)

자, 정적 메서드 역시 인터페이스에서 실행 코드까지 선언하는 메서드입니다. 그런데 정적(static)이라는 이름이 있기 때문에 디폴트 메서드와 근본적인 차이가 발생합니다... 바로 그것은 눈치채셨겠지만, 구현 객체가 있어야만 사용 가능한 디폴트 메서드와 달리 인터페이스만으로 바로 호출이 가능한 메서드입니다. 이 정적 메서드 역시 디폴트 메서드처럼 실행 코드가 포함되어 있습니다. 

 

 

이제 다음 아티클부터 각각의 구성 멤버들의 사용 방법을 자세히 살펴보겠습니다.