빈 인터페이스
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)(다음 섹션에서 배울 내용입니다)가 필수적인 도구가 됩니다.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
챌린지
쉬움이 챌린지에서는 다양한 유형의 값을 처리할 수 있는 데이터 프로세서를 만들어 보며 빈 인터페이스(empty interface)를 사용하는 연습을 하게 됩니다. interface{} 매개변수를 받아 다양한 데이터 타입을 처리하는 함수를 작성하게 됩니다.
두 개의 입력을 받게 됩니다:
- 데이터 타입을 나타내는 문자열 (예:
"int","string","bool", 또는"slice") - 실제 값을 나타내는 문자열 (예:
"42","hello","true", 또는"1,2,3")
여러분의 과제는 다음과 같습니다:
interface{}매개변수를 받고 값에 대한 정보를 출력하는processData라는 함수를 생성합니다.- 입력된 데이터 타입에 따라 값 문자열을 적절한 Go 타입으로 변환합니다:
"int"의 경우: 정수(integer)로 변환"string"의 경우: 문자열로 사용"bool"의 경우: 불리언(boolean)으로 변환"slice"의 경우: 쉼표로 구분된 값들을 정수 슬라이스(slice of integers)로 변환
- 변환된 값을 사용하여
processData함수를 호출합니다. 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를 호출하세요
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.