[OOP] 인터페이스(Interface)

calm0_0·2023년 9월 6일
0

OOP

목록 보기
4/6

인터페이스란?


인터페이스란 어떤 대상의 의미를 구현할 때 지켜야 할 규칙과 표준을 말한다. 또한, 상호 교류하는 대상끼리 정보를 주고받는 방법에 대한 규칙이자 표준이다.

예를 들어, 스마트폰의 인터페이스는 최소한 전화 발신/수신, 문자 발신/수신, 데이터 통신, 각종 응용 프로그램 실행 등 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 이 표시는 상위 인터페이스의 메서드를 오버라이드했다는 것을 명시적으로 표시한다. 만약 인터페이스를 상속받고, 인터페이스에 명시된 메서드를 모두 구현하지 않으면 컴파일러에서 에러를 발생한다.


인터페이스의 효과


인터페이스를 사용함으로써 얻을 수 있는 효과에는 다음과 같은 것들이 있다.

  1. 다중 상속 효과가 가능하다.

Java는 extends 를 통해 하나의 부모 클래스로부터 상속받을 수 있다. 그러나 추가로 인터페이스를 implements 하여 마치 다중 상속을 하는 효과를 얻을 수 있다.

public class BomberAirplane extends Airplane implements AirplaneState
  1. 인터페이스와 로직이 명확히 분리된다. 이로 인해 부모 클래스 코드가 깔끔해지고, 보다 중요한 메서드 명세를 더 강조할 수 있다.

  2. 인터페이스와 로직이 명확히 분리되어 외부에 노출할 필요 없는 로직을 캡슐화한다.

인터페이스는 필요 없는 로직을 숨기는 점에서 '캡슐화' 효과도 있다. 그래서 다른 클라이언트가 필요 이상으로 구현 클래스를 의존하고 조작하는 것을 막을 수 있다.

  1. 나무보다 숲을, 로직보다 인터페이스 관점으로 볼 수 있다.

객체 내부의 로직, 기능 구현에 집중하기 보다 외부에 제공할 인터페이스(객체가 외부에 제공하고 응답해야 하는 작업)에 집중한다. 인터페이스를 의식하면 객체 간 협력이 좋아지고, 객체 간 협력이 좋아지면 인터페이스 설계도 좋아진다. 점(객체 하나하나) 보다 선(객체 간 협력 관계)으로 접근하게 된다.



Reference

한 번 읽으면 두 번 깨닫는 객체지향 프로그래밍

profile
공부한 내용들을 정리하는 블로그

0개의 댓글