Menu
CoddyTech

타입 스위치

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

타입 어설션은 단일 타입을 확인할 때 유용하지만, 인터페이스 변수에 여러 가지 가능한 타입을 처리해야 하는 경우가 많습니다. 이때 타입 스위치가 매우 유용합니다. 구체적인 타입에 따라 서로 다른 작업을 깔끔하게 수행할 수 있는 방법을 제공합니다.

타입 스위치에는 다음과 같은 특수 구문을 사용합니다: switch v := i.(type). 특정 타입 대신 (type) 키워드를 사용하는 점에 주목하세요. 변수 v에는 각 case에서 구체적인 타입의 실제 값이 들어갑니다:

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는 자동으로 올바른 타입을 가지므로 추가적인 타입 단언이 필요하지 않습니다. 따라서 여러 타입 단언을 if-else 문으로 연결하는 것보다 타입 스위치가 훨씬 깔끔하며, 특히 한곳에서 여러 가지 타입을 처리해야 할 때 유용합니다.

challenge icon

챌린지

쉬움

이 챌린지에서는 알림 시스템에서 여러 데이터 유형을 처리하기 위해 타입 스위치를 사용하는 연습을 합니다. 서로 다른 유형의 알림을 처리하고 구체적인 유형에 따라 적절한 형식으로 출력하는 함수를 만듭니다.

다음 두 가지 입력을 받습니다.

  • 알림 유형을 나타내는 문자열(예: "email", "sms", "push" 또는 "alert")
  • 알림 내용이나 값을 나타내는 문자열

해야 할 일은 다음과 같습니다.

  1. interface{} 매개변수를 받는 processNotification 함수를 만듭니다.
  2. 알림 유형 입력에 따라 내용을 적절한 Go 유형으로 변환하여 interface{} 변수에 저장합니다.
    • "email"의 경우: 내용을 문자열로 사용합니다.
    • "sms"의 경우: 내용을 정수로 변환합니다(문자 수를 나타냄).
    • "push"의 경우: 내용을 불리언으로 변환합니다("enabled"이면 참, 그 외의 경우 거짓).
    • "alert"의 경우: 내용을 float64로 변환합니다(우선순위를 나타냄).
  3. 변환한 값을 전달하여 processNotification 함수를 호출합니다.
  4. 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가 됩니다. 이 챌린지를 통해 타입 스위치를 사용하면 하나의 제어 구조 안에서 여러 유형을 깔끔하게 처리할 수 있고, 각 경우에 올바른 유형의 값을 자동으로 얻을 수 있다는 점을 배웁니다.

float64는 fmt.Println이나 %v / %g 동사처럼 가장 짧은 형식으로 출력합니다. 즉, 3.5는 3.5로, 1.0은 1로 출력됩니다(%f 동사는 1.000000으로 출력합니다).

직접 해보기

package main

import (
	"fmt"
	"strconv"
)

func main() {
	// 입력 읽기
	var notificationType string
	var content string
	fmt.Scanln(&notificationType)
	fmt.Scanln(&content)
	
	// TODO: 아래에 코드를 작성하세요
	// 1. interface{} 매개변수를 받는 processNotification 함수를 만드세요
	// 2. notificationType에 따라 content를 적절한 타입으로 변환하세요
	// 3. 변환된 값으로 processNotification을 호출하세요
	// 4. processNotification 내에서 type switch를 사용해 서로 다른 타입을 처리하세요
	
}
quiz icon실력 점검

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

로직 & 흐름의 모든 레슨

직접 연습해 보세요: 온라인 Go 컴파일러