4. 인터페이스 (꼭 지켜야 할 약속)
규격에 딱 맞는 클래스만 만들어지도록 강제로 약속을 맺어봐요.
내용은 안 채우고 “이 클래스는 반드시 이런 기능이 있어야 해!“라고 껍데기만 약속하고 싶을 때는 규정하자를 씁니다.
그리고 클래스를 만들 때 따르는 키워드를 써주면, 이 약속을 무조건 지켜야만 실행돼요!
[날수있는것]을 규정하자:
<날기>가 있어야 한다 ()
[소리내는것]을 규정하자:
<소리내기>가 있어야 한다 ()
(참고) 두 가지 약속을 모두 지키는 새를 만들어볼까요?
[날수있는것]과 [소리내는것]을 따르는 [새]를 설계하자:
<날기>를 만들자 ():
"파닥파닥 하늘을 납니다!"를 출력하자
<소리내기>를 만들자 ():
"짹짹!"을 출력하자
'참새'를 [새]인 [새]()로 정하자
'참새'의 <소리내기>()를 실행하자
'참새'의 <날기>()를 실행하자
만약 인터페이스에 적힌 기능을 하나라도 빼먹으면, 프로그램이 시작하기도 전에 에러를 뱉으며 깐깐하게 막아선답니다! 여러 개의 인터페이스를 동시에 과/와 로 묶어서 따를 수도 있어요.
약속을 어기면 어떻게 될까요?
인터페이스를 따르겠다고 해놓고 기능을 빼먹으면 어떻게 되는지 직접 에러를 확인해 볼까요?
[움직이는것]을 규정하자:
<달리기>가 있어야 한다 ()
<멈추기>가 있어야 한다 ()
(참고) 달리기만 만들고 멈추기를 깜빡했어요!
[움직이는것]을 따르는 [고장난로봇]을 설계하자:
<달리기>를 만들자 ():
"로봇이 달려갑니다!"를 출력하자
'로봇'을 [고장난로봇]인 [고장난로봇]()로 정하자
이 코드를 실행해 보면 “InterfaceImplementationError: 클래스 ’고장난로봇’은 인터페이스 ’움직이는것’의 ‘멈추기’ 메서드를 구현해야 합니다.” 라는 에러가 뜹니다. 이렇게 인터페이스를 활용하면 실수로 필수 기능을 빼먹는 일을 완벽하게 방지할 수 있어요!