용어 설명 - 인터페이스(Interface)
이번 시간에는 인터페이스에 대해 알아보도록 하자.
객체 지향 프로그래밍(흔히 말하는 OOP)에서 중요한 개념인데, 개인적으로 가장 이해하기 쉬운 일상적인 비유로 설명하도록 하겠다.
인터페이스(Interface)
먼저 인터페이스가 무엇이냐.
여러 클래스가 따라야 하는 규칙이나 계약서를 의미한다. (클래스의 의미가 헷갈린다면 아래 포스팅을 먼저 보고 오도록)
용어 설명 - 클래스, 객체, 인스턴스 (Class, Object, Instance)
개발 공부를 하다보면 클래스, 객체, 인스턴스라는 용어에 대해 심심치 않게 듣게된다.여기저기 붕어빵 비유로 배를 채워가며 이해하려 애썼지만 쉽진 않더라.. 오늘은 이 세가지 용어에 대해
181022.tistory.com
이 계약서에는 "이런 기능들을 반드시 구현해야 한다." 라고 명시되어 있다.
인터페이스 자체는 실제 구현 내용을 포함하지 않고, 어떤 기능이 필요한지만 정의한다.
리모컨 예시
텔레비전, 에어컨, 오디오 등 여러 가전제품이 있고, 이들 모두를 제어할 수 있는 리모컨이 있다고 가정해보자(편하긴 하겠네..)
이 가상의 리모컨엔 다음과 같은 버튼들이 있다. (전원 켜기, 전원 끄기, 볼륨 올리기, 볼륨 내리기)
이 리모컨을 인터페이스라고 생각하자. 이 인터페이스를 따르는 모든 가전제품은 이 네 가지 기능을 반드시 구현해야 한다.
이제 코드로 나타내보자
인터페이스 정의 (계약서 작성)
from abc import ABC, abstractmethod
class RemoteContrl(ABC):
@abstractmethod
def turn_on(self):
pass
@abstractmethod
def turn_off(self):
pass
@abstractmethod
def volume_up(self):
pass
@abstractmethod
def volume_up(self):
pass
- RemoteControl 클래스는 인터페이스로, 네 가지 메서드(기능)를 정의하고 있다.
- @abstractmethod 데코레이터는 이 메서드들이 반드시 구현되어야 함을 나타낸다.
(※ 데코레이터란? 원래 함수나 메서드에 추가적인 기능을 덧붙이는 일종의 "포장지"라고 보면 된다. 주로 @ 기호로 시작)
- 이 클래스 자체는 실제 구현을 포함하지 않고, 계약서 역할을 한다.
ps. 이거 코드블럭 들여쓰기가 이상한데 감안하고 봐주시길..
인터페이스 구현 (계약서 따르기)
이제 이 인터페이스를 따르는 실제 가전제품 클래스를 만들어 보자!
class TV(RemoteControl):
def turn_on(self):
print("TV가 켜졌습니다.")
def turn_off(self):
print("TV가 꺼졌습니다.")
def volume_up(self):
print("TV 볼륨이 올라갑니다.")
def volume_down(self):
print("TV 볼륨이 내려갑니다.")
class AirConditioner(RemoteControl):
def turn_on(self):
print("에어컨이 켜졌습니다.")
def turn_off(self):
print("에어컨이 꺼졌습니다.")
def volume_up(self):
print("에어컨의 팬 속도가 빨라집니다.")
def volume_down(self):
print("에어컨의 팬 속도가 느려집니다.")
- TV 클래스와 AirConditioner 클래스는 RemoteControl 인터페이스를 구현한다.
- 각각의 클래스는 RemoteControl 인터페이스에 정의된 모든 메서드를 구현해야 한다.
인터페이스 사용 (계약서 기반 작업)
# TV 객체와 에어컨 객체 생성
my_tv = TV()
my_ac = AirConditioner()
# 인터페이스 메서드 호출
my_tv.turn_on() # 출력: TV가 켜졌습니다.
my_tv.volume_up() # 출력: TV 볼륨이 올라갑니다.
my_ac.turn_on() # 출력: 에어컨이 켜졌습니다.
my_ac.volume_up() # 출력: 에어컨의 팬 속도가 빨라집니다.
- my_tv와 my_ac 객체는 각각 TV와 AirConditioner 클래스의 인스턴스입니다.
- 이들은 모두 RemoteControl 인터페이스를 따르기 때문에, turn_on, turn_off, volume_up, volume_down 메서드를 호출할 수 있다.