인터페이스 정의하기
Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨. 68개 중 13번째.
이제 인터페이스가 개념적으로 무엇인지 이해했으니, Go에서 인터페이스를 실제로 정의하는 방법을 알아봅시다. 인터페이스는 interface 키워드 뒤에 중괄호로 묶인 메서드 시그니처 집합을 사용해 정의합니다.
인터페이스를 정의하는 기본 구문은 다음과 같습니다.
type InterfaceName interface {
MethodName() ReturnType
AnotherMethod(parameter Type) ReturnType
}인터페이스에는 메서드 시그니처, 즉 메서드 이름, 매개변수, 반환 형식만 포함되고 구현은 포함되지 않는다는 점에 주목하세요. 인터페이스는 이러한 메서드가 어떻게 작동해야 하는지는 지정하지 않고, 어떤 메서드가 존재해야 하는지만 지정합니다.
예를 들어, 구현하는 모든 타입에 Area 메서드가 있어야 하는 간단한 Shaper 인터페이스를 다음과 같이 정의할 수 있습니다.
type Shaper interface {
Area() float64
}이 인터페이스는 계약을 정의합니다. Shaper로 간주되려는 모든 타입은 매개변수를 받지 않고 float64를 반환하는 Area 메서드를 가져야 합니다. 인터페이스는 타입이 무엇인지 또는 면적을 어떻게 계산하는지는 신경 쓰지 않습니다. 올바른 시그니처를 가진 메서드가 존재하는지만 확인합니다.
챌린지
쉬움이 챌린지에서는 간단한 미디어 플레이어 시스템을 만들어 Go에서 인터페이스를 정의하는 연습을 합니다. 다양한 유형의 미디어 기기에 적용되는 계약을 정의하는 인터페이스를 만듭니다.
입력은 하나입니다.
- 미디어 동작을 나타내는 문자열(예:
"play","pause"또는"stop")
해야 할 일은 다음과 같습니다.
- 세 가지 메서드 시그니처가 있는
MediaPlayer라는 인터페이스를 정의합니다.- 문자열을 반환하는
Play() - 문자열을 반환하는
Pause() - 문자열을 반환하는
Stop()
- 문자열을 반환하는
- 입력 동작에 따라
MediaPlayer인터페이스의 해당 메서드 시그니처를 다음 형식으로 출력합니다:"MediaPlayer interface requires: [MethodName]() string"
이 프로그램에서는 아직 MediaPlayer를 사용하지 않지만, 괜찮습니다. Go는 어떤 타입도 해당 인터페이스를 구현하지 않더라도 인터페이스를 컴파일합니다. 출력문은 주어진 동작에 대해 인터페이스가 요구하는 메서드 시그니처를 표시할 뿐입니다. 다음 강의에서는 MediaPlayer를 구현하는 타입을 만들고 해당 메서드를 호출합니다.
메서드 이름은 인터페이스 정의의 일부이므로 대문자로 시작해야 합니다(내보내기됨). 입력이 "play"이면 "MediaPlayer interface requires: Play() string"을 출력하고, "pause"이면 "MediaPlayer interface requires: Pause() string"을 출력하며, "stop"이면 "MediaPlayer interface requires: Stop() string"를 출력합니다.
이 챌린지에서는 메서드 시그니처로 인터페이스를 정의하고, 이를 구현하는 모든 타입이 충족해야 하는 계약을 설정하는 기본 개념에 중점을 둡니다.
직접 해보기
package main
import "fmt"
func main() {
// 입력을 읽으세요
var action string
fmt.Scanln(&action)
// TODO: 여기에 MediaPlayer 인터페이스를 정의하세요
// TODO: 아래에 action을 처리하고 필요한 출력을 인쇄하는 코드를 작성하세요
// 결과를 인쇄하세요
// "MediaPlayer interface requires: [MethodName]() string" 형식으로 인쇄하세요
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
로직 & 흐름의 모든 레슨
직접 연습해 보세요: 온라인 Go 컴파일러