빈 인터페이스
Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨. 68개 중 16번째.
지금까지 특정 메서드가 필요한 인터페이스를 사용해 봤지만, Go에는 놀라울 정도로 유연한 특별한 인터페이스가 있습니다. 바로 빈 인터페이스이며, interface{}로 씁니다. Go 1.18부터는 정확히 interface{}를 의미하는 내장 별칭인 any로도 쓸 수 있습니다.
빈 인터페이스에는 메서드 요구 사항이 전혀 없으므로 Go의 모든 타입이 자동으로 이를 만족합니다. 모든 타입은 (최소한) 메서드를 0개 구현하므로, 모든 타입을 interface{} 변수에 할당할 수 있습니다.
var anything interface{}
anything = 42 // int
anything = "hello" // string
anything = true // bool
anything = []int{1, 2, 3} // 슬라이스이것은 알 수 없거나 달라질 수 있는 유형의 데이터를 다뤄야 할 때 interface{}를 매우 유용하게 만들어 줍니다. 구성 파일을 읽거나, 사용자 입력을 처리하거나, 상황에 따라 서로 다른 데이터 유형을 반환하는 API를 다룰 때 이러한 경우를 마주칠 수 있습니다.
하지만 빈 인터페이스는 어떤 타입이든 담을 수 있으므로, 값을 의미 있게 사용하기 전에 그 안에 실제로 어떤 타입이 저장되어 있는지 확인해야 하는 경우가 많습니다. 이때 타입 단언과 타입 스위치(다음에 배우게 됩니다)는 interface{} 값을 안전하게 다루는 데 필수적인 도구가 됩니다.
챌린지
쉬움이 챌린지에서는 다양한 유형의 값을 처리할 수 있는 데이터 처리기를 만들어 빈 인터페이스를 다루는 연습을 합니다. interface{} 매개변수를 받아 다양한 데이터 유형을 처리하는 함수를 만듭니다.
다음 두 가지 입력을 받습니다.
- 데이터 유형을 나타내는 문자열(예:
"int","string","bool"또는"slice") - 실제 값을 나타내는 문자열(예:
"42","hello","true"또는"1,2,3")
해야 할 작업은 다음과 같습니다.
interface{}매개변수를 받아 값에 대한 정보를 출력하는processData함수를 만듭니다.- 데이터 유형 입력에 따라 값 문자열을 적절한 Go 유형으로 변환합니다.
"int"인 경우: 정수로 변환합니다."string"인 경우: 문자열로 사용합니다."bool"인 경우: 불리언으로 변환합니다."slice"인 경우: 쉼표로 구분된 값을 정수 슬라이스로 변환합니다.
- 변환한 값을 사용하여
processData함수를 호출합니다. processData내부에서 다음 형식으로 값과 그 유형을 출력합니다."Value: [value], Type: [type]"
슬라이스 입력의 경우 "1,2,3"과 같은 쉼표로 구분된 문자열을 []int{1, 2, 3}으로 변환해야 합니다. 이 함수는 interface{}를 매개변수로 받으므로 모든 유형의 값으로 작동하며, 빈 인터페이스가 모든 유형의 값을 담을 수 있음을 보여 줍니다. fmt.Printf와 %v, %T 형식 지정 동사를 사용하여 각각 값과 유형을 표시합니다.
직접 해보기
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를 호출하세요
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
로직 & 흐름의 모든 레슨
직접 연습해 보세요: 온라인 Go 컴파일러