인터페이스 소개
Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 107개 중 25번째.
Go의 interface는 메서드를 구현하지 않고 메서드 시그니처 집합을 정의합니다. 이는 타입이 무엇을 할 수 있는지를 설명하며, 어떻게 하는지는 설명하지 않습니다. interface의 모든 메서드를 구현하는 모든 타입은 자동으로 해당 interface를 충족합니다.
인터페이스를 정의하는 방법은 다음과 같습니다:
type Speaker interface {
Speak() string
}이 Speaker 인터페이스는 이를 구현하는 모든 타입에 문자열을 반환하는 Speak() 메서드가 있어야 함을 요구합니다. 이제 이 메서드를 가진 모든 구조체는 Speaker가 필요한 곳에서 사용할 수 있습니다.
type Dog struct {
Name string
}
func (d Dog) Speak() string {
return d.Name + " says woof!"
}
type Cat struct {
Name string
}
func (c Cat) Speak() string {
return c.Name + " says meow!"
}Dog와 Cat은 각각 올바른 시그니처를 가진 Speak() 메서드를 갖고 있으므로 Speaker 인터페이스를 모두 충족합니다. 이제 모든 Speaker를 accepts하는 함수를 작성할 수 있습니다:
func MakeSound(s Speaker) {
fmt.Println(s.Speak())
}
func main() {
dog := Dog{Name: "Buddy"}
cat := Cat{Name: "Whiskers"}
MakeSound(dog) // Buddy가 멍멍 한다!
MakeSound(cat) // Whiskers가 야옹 한다!
}interface를 사용하면 기반 구현과 관계없이 interface의 요구 사항을 충족하는 모든 유형과 함께 작동하는 유연하고 재사용 가능한 코드를 작성할 수 있습니다.
챌린지
쉬움interface를 통해 서로 다른 타입이 공통 동작을 공유할 수 있는 방식을 보여 주는 vehicle description system을 만들어 보겠습니다. 여러 vehicle 타입이 만족할 수 있는 interface를 만든 다음, 이를 사용해 모든 vehicle을 일관된 방식으로 설명하게 됩니다.
코드를 두 파일에 나누어 구성합니다.
vehicles.go: 하나의Describe() stringmethod를 포함하는Describerinterface를 Define합니다. 그런 다음 이 interface를 만족하는 두 개의 구조체를 만듭니다.Car:Brand및Modelfields (둘 다 문자열)Bicycle:Type(문자열) 및Gears(int) fields
Describe()method가 있어야 합니다.main.go: 임의의Describer를 accepts하고 해당Describe()method를 calling한 결과를 prints하는PrintDescriptionfunction을 만듭니다. input에서 vehicle 정보를 Read하고, Car와 Bicycle을 both 만든 다음, function을 사용해 각각의 설명을 prints합니다.
다음 input이 제공됩니다.
- 1번째 줄: Car brand
- 2번째 줄: Car model
- 3번째 줄: Bicycle type
- 4번째 줄: gears의 수 (정수)
Describe() methods는 다음 형식의 문자열을 반환해야 합니다.
- Car:
[Brand] [Model] - Bicycle:
[Type] bike with [Gears] gears
예를 들어 Toyota, Camry, Mountain, 21이 주어지면 출력은 다음과 같아야 합니다.
Toyota Camry
Mountain bike with 21 gears핵심은 PrintDescription function이 Describe() method를 가진 any type과 함께 작동한다는 점입니다. 이 function은 자신이 Car, Bicycle 또는 나중에 추가할 수 있는 다른 vehicle type 중 무엇을 다루는지 알 필요가 없습니다.
직접 해보기
package main
import (
"fmt"
)
// TODO: 어떤 Describer든 받아들이는 PrintDescription 함수를 만드세요
// 그리고 그것의 Describe() 메서드를 호출한 결과를 출력합니다
func main() {
// 입력 읽기
var carBrand string
var carModel string
var bicycleType string
var gears int
fmt.Scanln(&carBrand)
fmt.Scanln(&carModel)
fmt.Scanln(&bicycleType)
fmt.Scanln(&gears)
// TODO: 입력에서 받은 brand와 model로 Car를 만드세요
// TODO: 입력에서 받은 type과 gears로 Bicycle를 만드세요
// TODO: PrintDescription을 사용해 car의 설명을 출력하세요
// TODO: PrintDescription을 사용해 bicycle의 설명을 출력하세요
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8에러 처리와 OOP
error 인터페이스사용자 정의 에러 타입에러 래핑 (fmt.Errorf)센티넬 에러errors.Is()와 errors.As()Panic, Defer, Recover요약 - 파일 파서직접 연습해 보세요: 온라인 Go 컴파일러