Menu
Coddy logo textTech

빈 인터페이스

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

지금까지 여러분은 특정 메서드를 요구하는 인터페이스를 다루어 왔지만, Go에는 매우 유연한 특별한 인터페이스가 있습니다. 바로 interface{}로 작성되는 빈 인터페이스(empty interface)입니다.

빈 인터페이스(empty interface)는 메서드 요구사항이 전혀 없으며, 이는 Go의 모든 타입이 자동으로 이를 충족함을 의미합니다. 모든 타입은 (최소한) 0개의 메서드를 구현하므로, 모든 타입을 interface{} 변수에 할당할 수 있습니다:

var anything interface{}
anything = 42        // int
anything = "hello"   // string
anything = true      // bool
anything = []int{1, 2, 3}  // 슬라이스

이것은 알 수 없거나 다양한 유형의 데이터를 작업해야 할 때 interface{}를 매우 유용하게 만듭니다. 설정 파일을 읽거나, 사용자 입력을 처리하거나, 상황에 따라 다른 데이터 유형을 반환하는 API로 작업할 때 이를 접할 수 있습니다.

하지만 빈 인터페이스는 어떤 타입이든 담을 수 있기 때문에, 값을 의미 있게 사용하기 전에 그 안에 실제로 어떤 타입이 저장되어 있는지 확인해야 할 때가 많습니다. 여기서 interface{} 값을 안전하게 다루기 위해 타입 단언(type assertion)과 타입 스위치(type switch)(다음 섹션에서 배울 내용입니다)가 필수적인 도구가 됩니다.

quiz icon실력 점검

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

quiz icon실력 점검

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

quiz icon실력 점검

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

challenge icon

챌린지

쉬움

이 챌린지에서는 다양한 유형의 값을 처리할 수 있는 데이터 프로세서를 만들어 보며 빈 인터페이스(empty interface)를 사용하는 연습을 하게 됩니다. interface{} 매개변수를 받아 다양한 데이터 타입을 처리하는 함수를 작성하게 됩니다.

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

  • 데이터 타입을 나타내는 문자열 (예: "int", "string", "bool", 또는 "slice")
  • 실제 값을 나타내는 문자열 (예: "42", "hello", "true", 또는 "1,2,3")

여러분의 과제는 다음과 같습니다:

  1. interface{} 매개변수를 받고 값에 대한 정보를 출력하는 processData라는 함수를 생성합니다.
  2. 입력된 데이터 타입에 따라 값 문자열을 적절한 Go 타입으로 변환합니다:
    • "int"의 경우: 정수(integer)로 변환
    • "string"의 경우: 문자열로 사용
    • "bool"의 경우: 불리언(boolean)으로 변환
    • "slice"의 경우: 쉼표로 구분된 값들을 정수 슬라이스(slice of integers)로 변환
  3. 변환된 값을 사용하여 processData 함수를 호출합니다.
  4. processData 내부에서 "Value: [value], Type: [type]" 형식으로 값과 해당 타입을 출력합니다.

슬라이스 입력의 경우, "1,2,3"과 같은 쉼표로 구분된 문자열은 []int{1, 2, 3}으로 변환되어야 합니다. 이 함수는 interface{}를 허용하므로 모든 타입에서 작동해야 하며, 이는 빈 인터페이스가 어떻게 모든 타입의 값을 보유할 수 있는지 보여줍니다. fmt.Printf%v%T 포맷 동사를 사용하여 각각 값과 타입을 표시하세요.

치트 시트

빈 인터페이스인 interface{}는 요구되는 메서드가 없으므로, Go의 모든 타입은 자동으로 이 인터페이스를 만족합니다:

var anything interface{}
anything = 42        // int
anything = "hello"   // string
anything = true      // bool
anything = []int{1, 2, 3}  // slice

빈 인터페이스는 설정 파일, 사용자 입력 또는 다양한 데이터 타입을 반환하는 API와 같이 타입을 알 수 없거나 가변적인 데이터를 다룰 때 유용합니다.

interface{} 변수의 값과 타입을 표시하려면 fmt.Printf와 함께 %v%T 포맷 플래그를 사용하세요:

fmt.Printf("Value: %v, Type: %T", value, value)

표준 라이브러리에서 제공하는 유용한 변환 헬퍼 함수들입니다:

import (
    "strconv"
    "strings"
)

// string을 int로 변환
n, err := strconv.Atoi("42")       // n = 42

// string을 bool로 변환
b, err := strconv.ParseBool("true") // b = true

// 문자열을 슬라이스로 분할
parts := strings.Split("a,b,c", ",") // ["a", "b", "c"]

직접 해보기

package main

import (
	"fmt"
)

func main() {
	// 입력 읽기
	var dataType string
	var valueStr string
	fmt.Scanln(&dataType)
	fmt.Scanln(&valueStr)
	
	// TODO: 아래에 코드를 작성하세요
	// 1. interface{}를 인자로 받는 processData 함수를 생성하세요
	// 2. dataType에 따라 valueStr을 적절한 타입으로 변환하세요
	// 3. 변환된 값으로 processData를 호출하세요
	
}
quiz icon실력 점검

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

로직 & 흐름의 모든 레슨