인터페이스란 어떤 대상의 의미를 구현할 때 지켜야 할 규칙과 표준을 말한다. 또한, 상호 교류하는 대상끼리 정보를 주고받는 방법에 대한 규칙이자 표준이다.
예를 들어, 스마트폰의 인터페이스는 최소한 전화 발신/수신, 문자 발신/수신, 데이터 통신, 각종 응용 프로그램 실행 등 4가지로 정의한다고 했다면, 앞으로 생산하는 모든 스마트폰은 반드시 4가지 인터페이스를 구현해야만 표준을 지키는 스마트폰이라고 할 수 있는 것이다.
다음은 인터페이스의 예시이다.
public interface AirplaneState {
// 바퀴 상태 체크
public String checkWheelStatus();
// 엔진 상태 체크
public String checkEngineStatus();
// 통신 장비 상태 체크
public String checkElectronicStatus();
// 날개 상태 체크
public String checkWingStatus();
// 기관총 상태 체크
public String checkMachinegunStatus();
// 현재 상태 클래스 정보
public String currentStatusExplanation();
}
코드를 보면 인터페이스 내부에 메서드 정의만 작성되어 있고 나머지 속성이나 메서드 내부 로직은 없다. 제거된 속성이나 로직은 이 인터페이스를 상속받을 클래스에서 구현해야 한다.
다음은 인터페이스를 구현한 클래스의 예시이다.
public class CruiseAirplaneState implements AirplaneState {
@Override
public String checkWheelStatus() {
String result = "바퀴 닫혀 있는 상태 구현, 실제로는 관련 그래픽/효과 처리 로직이 구현됨..";
return result;
}
@Override
public String checkEngineStatus() {
String result = "엔진 켜 있는 상태 구현, 실제로는 관련 그래픽/효과 처리 로직이 구현됨..";
return result;
}
@Override
public String checkElectronicStatus() {
String result = "통신 장비 켜 있는 상태 구현, 실제로는 관련 그래픽/효과 처리 로직이 구현됨..";
return result;
}
@Override
public String checkWingStatus() {
String result = "날개 펴 있는 상태 구현, 실제로는 관련 그래픽/효과 처리 로직이 구현됨..";
return result;
}
@Override
public String checkMachinegunStatus() {
String result = "기관총 OFF 상태 구현, 실제로는 관련 그래픽/효과 처리 로직이 구현됨..";
return result;
}
@Override
public String currentStatusExplanation() {
return "비행기가 순항 상태 입니다.";
}
}
CruiseAirplaneState 클래스는 AirplaneState를 상속받아 실제로 순항 상태인 비행기를 구체적으로 구현했다.
public class CruiseAirplaneState implements AirplaneState
클래스가 인터페이스를 구현할 경우 implements 라는 예약어를 사용한다.
@Override
public String currentStatusExplanation() {
return "비행기가 순항 상태 입니다.";
}
@Override 이 표시는 상위 인터페이스의 메서드를 오버라이드했다는 것을 명시적으로 표시한다. 만약 인터페이스를 상속받고, 인터페이스에 명시된 메서드를 모두 구현하지 않으면 컴파일러에서 에러를 발생한다.
인터페이스를 사용함으로써 얻을 수 있는 효과에는 다음과 같은 것들이 있다.
Java는 extends 를 통해 하나의 부모 클래스로부터 상속받을 수 있다. 그러나 추가로 인터페이스를 implements 하여 마치 다중 상속을 하는 효과를 얻을 수 있다.
public class BomberAirplane extends Airplane implements AirplaneState
인터페이스와 로직이 명확히 분리된다. 이로 인해 부모 클래스 코드가 깔끔해지고, 보다 중요한 메서드 명세를 더 강조할 수 있다.
인터페이스와 로직이 명확히 분리되어 외부에 노출할 필요 없는 로직을 캡슐화한다.
인터페이스는 필요 없는 로직을 숨기는 점에서 '캡슐화' 효과도 있다. 그래서 다른 클라이언트가 필요 이상으로 구현 클래스를 의존하고 조작하는 것을 막을 수 있다.
객체 내부의 로직, 기능 구현에 집중하기 보다 외부에 제공할 인터페이스(객체가 외부에 제공하고 응답해야 하는 작업)에 집중한다. 인터페이스를 의식하면 객체 간 협력이 좋아지고, 객체 간 협력이 좋아지면 인터페이스 설계도 좋아진다. 점(객체 하나하나) 보다 선(객체 간 협력 관계)으로 접근하게 된다.
Reference