Menu
Coddy logo textTech

인터페이스 구현하기

Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨 — 68개 중 14번째.

이제 인터페이스를 정의하는 방법을 알았으니, Go 타입이 실제로 인터페이스를 어떻게 구현하는지 배워보겠습니다. 이해해야 할 가장 중요한 점은 Go가 암시적 구현(implicit implementation)을 사용한다는 것입니다. 즉, 특별한 키워드나 선언이 필요하지 않습니다.

만약 어떤 타입이 인터페이스가 요구하는 모든 메서드를 가지고 있다면, 그 타입은 자동으로 해당 인터페이스를 충족합니다. 타입이 인터페이스를 구현한다고 명시적으로 선언할 필요가 없습니다. Go가 이를 자동으로 알아내기 때문입니다.

이전 레슨의 Shaper 인터페이스를 사용하면 다음과 같이 작동합니다:

type Circle struct {
    Radius float64
}

func (c Circle) Area() float64 {
    return 3.14159 * c.Radius * c.Radius
}

Circle 타입은 float64를 반환하는 Area() 메서드를 가지고 있으므로, 자동으로 Shaper 인터페이스를 구현합니다. 이 관계를 명시적으로 선언할 필요가 없습니다. Go는 메서드 시그니처의 일치를 바탕으로 이를 인식합니다.

이러한 암시적 접근 방식은 Go 인터페이스를 매우 유연하게 만듭니다. 필요한 메서드만 가지고 있다면, 인터페이스가 해당 타입이 작성된 이후에 만들어졌더라도 기존의 어떤 타입이든 새로운 인터페이스를 충족할 수 있습니다.

quiz icon실력 점검

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

quiz icon실력 점검

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

quiz icon실력 점검

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

challenge icon

챌린지

쉬움

이 챌린지에서는 간단한 차량 시스템을 만들면서 인터페이스를 구현하는 연습을 하게 됩니다. Go의 암시적 구현(implicit implementation)을 통해 Vehicle 인터페이스를 자동으로 구현하는 Car 구조체를 생성합니다.

두 개의 입력을 받게 됩니다:

  • 자동차 브랜드를 나타내는 문자열 (예: "Toyota")
  • 자동차의 속도(km/h)를 나타내는 문자열 (예: "120")

수행할 작업은 다음과 같습니다:

  1. 문자열을 반환하는 GetInfo()라는 하나의 메서드 시그니처를 가진 Vehicle 인터페이스를 정의합니다.
  2. Brand (string)와 Speed (int)라는 두 개의 필드를 가진 Car 구조체를 정의합니다.
  3. Car 구조체에 대해 "Brand: [brand], Speed: [speed] km/h" 형식의 문자열을 반환하는 GetInfo() 메서드를 구현합니다.
  4. 입력값을 파싱하여 Car 인스턴스를 생성합니다.
  5. GetInfo() 메서드를 호출하고 결과를 출력합니다.

Go에서는 Car 구조체가 올바른 시그니처를 가진 필수 GetInfo() 메서드를 가지고 있기 때문에 자동으로 Vehicle 인터페이스를 구현하게 된다는 점을 기억하세요. CarVehicle을 구현한다고 명시적으로 선언할 필요가 없습니다. Go는 이 관계를 암시적으로 인식합니다.

치트 시트

Go는 인터페이스에 대해 암시적 구현(implicit implementation)을 사용합니다 - 특별한 키워드나 선언이 필요하지 않습니다.

만약 어떤 타입이 인터페이스가 요구하는 모든 메서드를 가지고 있다면, 해당 인터페이스를 자동으로 충족하게 됩니다:

type Circle struct {
    Radius float64
}

func (c Circle) Area() float64 {
    return 3.14159 * c.Radius * c.Radius
}

Circlefloat64를 반환하는 Area() 메서드를 가지고 있으므로, 명시적인 선언 없이도 Shaper 인터페이스를 자동으로 구현합니다.

이러한 암시적 방식은 Go 인터페이스를 유연하게 만듭니다. 기존의 어떤 타입이라도 필요한 메서드만 가지고 있다면, 인터페이스가 타입보다 나중에 만들어졌더라도 새로운 인터페이스를 충족할 수 있습니다.

직접 해보기

package main

import (
	"fmt"
	"strconv"
)

// TODO: 1. GetInfo() string 메서드를 포함하는 Vehicle 인터페이스를 정의하세요.

// TODO: 2. Brand (string)와 Speed (int) 필드를 가진 Car 구조체를 정의하세요.

// TODO: 3. Car 구조체에 대한 GetInfo() 메서드를 구현하세요.

func main() {
	// 입력 읽기
	var brand string
	var speedStr string
	fmt.Scanln(&brand)
	fmt.Scanln(&speedStr)

	// 속도 문자열을 정수로 변환
	speed, _ := strconv.Atoi(speedStr)

	// TODO: 4. brand와 speed를 사용하여 Car 인스턴스를 생성한 다음, GetInfo()를 호출하세요.
	result := "" // 이 라인을 당신의 구현 코드로 교체하세요.
	_ = brand
	_ = speed

	// 결과 출력
	fmt.Println(result)
}
quiz icon실력 점검

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

로직 & 흐름의 모든 레슨