타입 스위치
Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨 — 68개 중 18번째.
타입 단언(type assertions)은 단일 타입을 확인하는 데 잘 작동하지만, 인터페이스 변수에 대해 여러 가능한 타입을 처리해야 하는 경우가 많습니다. 이럴 때 타입 스위치(type switch)가 매우 유용합니다. 이는 구체적인 타입(concrete type)에 따라 서로 다른 동작을 수행할 수 있는 깔끔한 방법을 제공합니다.
타입 스위치(type switch)는 다음과 같은 특수한 구문을 사용합니다: switch v := i.(type). 특정 타입 대신 (type) 키워드를 사용한 점에 주목하십시오. 변수 v는 각 케이스에서 해당 구체적인 타입의 실제 값을 갖게 됩니다:
func describe(data interface{}) {
switch v := data.(type) {
case int:
fmt.Printf("Integer: %d\n", v)
case string:
fmt.Printf("String: %s\n", v)
case bool:
fmt.Printf("Boolean: %t\n", v)
default:
fmt.Printf("Unknown type: %T\n", v)
}
}각 경우에 v는 자동으로 올바른 타입을 갖게 되며, 추가적인 타입 단언(type assertion)이 필요하지 않습니다. 이는 특히 한 곳에서 여러 다른 타입을 처리해야 할 때, if-else 문으로 여러 타입 단언을 연결하는 것보다 타입 스위치를 훨씬 더 깔끔하게 만들어 줍니다.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
챌린지
쉬움이 챌린지에서는 알림 시스템에서 여러 데이터 타입을 처리하기 위해 타입 스위치(type switches)를 사용하는 연습을 합니다. 다양한 유형의 알림을 처리하고 구체적인 타입에 따라 적절하게 형식을 지정하는 함수를 만들게 됩니다.
두 개의 입력을 받게 됩니다:
- 알림 유형을 나타내는 문자열 (예:
"email","sms","push", 또는"alert") - 알림 내용 또는 값을 나타내는 문자열
여러분의 과제는 다음과 같습니다:
interface{}매개변수를 받는processNotification이라는 함수를 생성합니다.- 입력된 알림 유형에 따라 내용을 적절한 Go 타입으로 변환하고
interface{}변수에 저장합니다:"email"의 경우: 내용을 문자열(string)로 사용합니다."sms"의 경우: 내용을 정수(int, 글자 수를 나타냄)로 변환합니다."push"의 경우: 내용을 불리언(bool, "enabled"인 경우 true, 그 외에는 false)으로 변환합니다."alert"의 경우: 내용을 float64(우선순위 레벨을 나타냄)로 변환합니다.
- 변환된 값을 사용하여
processNotification함수를 호출합니다. processNotification내부에서 타입 스위치를 사용하여 각 타입을 처리하고 적절한 메시지를 출력합니다:string의 경우:"Email notification: [value]"int의 경우:"SMS notification with [value] characters"bool의 경우:"Push notifications: [value]"float64의 경우:"Alert with priority: [value]"- 그 외의 다른 타입의 경우:
"Unknown notification type"
문자열 변환을 위해 strconv 패키지를 사용하세요. 불리언 변환의 경우, "enabled"인 경우에만 true가 되어야 합니다. 이 챌린지는 타입 스위치가 단일 제어 구조에서 여러 타입을 처리하는 깔끔한 방법을 제공하며, 각 케이스에서 올바른 타입의 값을 자동으로 제공하는 방법을 보여줍니다.
치트 시트
타입 스위치(type switch)는 switch v := i.(type) 구문을 사용하여 인터페이스 변수에 대해 가능한 여러 타입을 깔끔하게 처리하는 방법을 제공합니다:
func describe(data interface{}) {
switch v := data.(type) {
case int:
fmt.Printf("Integer: %d\n", v)
case string:
fmt.Printf("String: %s\n", v)
case bool:
fmt.Printf("Boolean: %t\n", v)
default:
fmt.Printf("Unknown type: %T\n", v)
}
}각 케이스에서 변수 v는 자동으로 올바른 구체 타입(concrete type)을 가지게 되므로, 추가적인 타입 단언(type assertion)이 필요하지 않습니다.
직접 해보기
package main
import (
"fmt"
"strconv"
)
func main() {
// 입력 읽기
var notificationType string
var content string
fmt.Scanln(¬ificationType)
fmt.Scanln(&content)
// TODO: 아래에 코드를 작성하세요
// 1. interface{} 매개변수를 받는 processNotification 함수 생성
// 2. notificationType에 따라 content를 적절한 타입으로 변환
// 3. 변환된 값으로 processNotification 호출
// 4. processNotification 내부에서 타입 스위치를 사용하여 다양한 타입 처리
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.