Menu
Coddy logo textTech

인터페이스 소개

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!"
}

DogCat은 각각 올바른 시그니처를 가진 Speak() 메서드를 갖고 있으므로 Speaker 인터페이스를 모두 충족합니다. 이제 모든 Speakeraccepts하는 함수를 작성할 수 있습니다:

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의 요구 사항을 충족하는 모든 유형과 함께 작동하는 유연하고 재사용 가능한 코드를 작성할 수 있습니다.

challenge icon

챌린지

쉬움

interface를 통해 서로 다른 타입이 공통 동작을 공유할 수 있는 방식을 보여 주는 vehicle description system을 만들어 보겠습니다. 여러 vehicle 타입이 만족할 수 있는 interface를 만든 다음, 이를 사용해 모든 vehicle을 일관된 방식으로 설명하게 됩니다.

코드를 두 파일에 나누어 구성합니다.

  • vehicles.go: 하나의 Describe() string method를 포함하는 Describer interface를 Define합니다. 그런 다음 이 interface를 만족하는 두 개의 구조체를 만듭니다.
    • Car: BrandModel fields (둘 다 문자열)
    • Bicycle: Type(문자열) 및 Gears(int) fields
    각 구조체에는 vehicle에 대한 설명 문자열을 반환하는 Describe() method가 있어야 합니다.
  • main.go: 임의의 Describer를 accepts하고 해당 Describe() method를 calling한 결과를 prints하는 PrintDescription function을 만듭니다. 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의 설명을 출력하세요
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 Go 컴파일러