0Pricing
Go Academy · 강의

타입 단언과 타입 스위치

안전한 타입 단언과 switch 패턴

타입 단언과 타입 스위치은(는) CoddyKit의 무료 Go Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Go Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

타입 단언

타입 단언은 인터페이스에서 구체 값을 추출합니다. 문법은 x.(T)입니다:

package main
import "fmt"

func main() {
    var i interface{} = "hello"
    s := i.(string)          // panics if wrong type
    fmt.Println(s, len(s))   // hello 5
}

안전한 두 값 단언

잘못된 타입에서 패닉이 발생하지 않도록 쉼표-확인 형식을 사용하십시오:

package main
import "fmt"

func main() {
    var i interface{} = 42
    s, ok := i.(string)
    fmt.Println(s, ok)  // "" false
    n, ok := i.(int)
    fmt.Println(n, ok)  // 42 true
}

타입 스위치

타입 스위치는 인터페이스 값의 동적 타입을 여러 타입과 비교합니다:

package main
import "fmt"

func describe(i interface{}) string {
    switch v := i.(type) {
    case int:    return fmt.Sprintf("int: %d", v)
    case string: return fmt.Sprintf("string: %q", v)
    case bool:   return fmt.Sprintf("bool: %v", v)
    default:     return fmt.Sprintf("unknown: %T", v)
    }
}

func main() {
    fmt.Println(describe(42))
    fmt.Println(describe("hi"))
    fmt.Println(describe(3.14))
}

error에 대한 타입 스위치

타입 스위치는 오류를 분류할 때 특히 유용합니다:

package main
import ("errors"; "fmt")

type NotFoundError struct{ Name string }
func (e *NotFoundError) Error() string { return e.Name + " not found" }

type PermError struct{}
func (e *PermError) Error() string { return "permission denied" }

func handle(err error) {
    switch e := err.(type) {
    case *NotFoundError: fmt.Println("missing:", e.Name)
    case *PermError:     fmt.Println("perm error")
    default:             fmt.Println("other:", e)
    }
}

func main() {
    handle(&NotFoundError{"user"})
    handle(errors.New("generic"))
}

인터페이스로 단언하기

구체 타입뿐 아니라 다른 인터페이스 타입으로도 단언할 수 있습니다. 객체가 선택적 동작을 지원하는지 확인할 때 유용합니다:

package main
import "fmt"

type Flusher interface{ Flush() }

type Writer interface{ Write(string) }

type BufferedWriter struct{ buf string }
func (b *BufferedWriter) Write(s string) { b.buf += s }
func (b *BufferedWriter) Flush()         { fmt.Println(b.buf); b.buf = "" }

func maybeFlush(w Writer) {
    if f, ok := w.(Flusher); ok { f.Flush() }
}

func main() {
    bw := &BufferedWriter{}
    bw.Write("hello")
    maybeFlush(bw)
}

nil 인터페이스 단언

nil 인터페이스에 대해 단언하면 패닉이 발생합니다. 단언하기 전에 항상 인터페이스가 nil이 아닌지 확인하십시오:

package main
import "fmt"

func safePrint(i interface{}) {
    if i == nil {
        fmt.Println("nil")
        return
    }
    fmt.Printf("%T: %v\n", i, i)
}

func main() {
    safePrint(nil)
    safePrint(42)
}

reflect.TypeOf 대안

단언하지 않고 타입을 출력하려면 fmt.Sprintf("%T", v) 또는 reflect.TypeOf(v)를 사용하십시오:

package main
import ("fmt"; "reflect")

func main() {
    v := []int{1, 2, 3}
    fmt.Printf("%T\n", v)             // []int
    fmt.Println(reflect.TypeOf(v))    // []int
}

타입 단언과 타입 변환

타입 단언: 인터페이스에서 구체 타입을 추출합니다. 타입 변환: 한 구체 타입을 호환되는 다른 타입으로 변경합니다. 두 작업은 서로 다릅니다:

package main
import "fmt"

func main() {
    var i interface{} = int32(5)
    n := i.(int32)          // assertion — OK
    big := int64(n)         // conversion — OK
    fmt.Println(n, big)
}

select에서의 콤마-오케이

콤마-오케이 패턴은 채널 수신에도 사용할 수 있으며, 닫힌 채널을 감지합니다. Go에서는 동일한 간결한 관용구를 일관되게 사용합니다.

타입 스위치를 사용하는 경우

일반적인 사용 사례는 다음과 같습니다:

  • interface{} 필드를 사용한 JSON 역직렬화
  • 오류 분류
  • 프로토콜 메시지 디스패치
  • 선택적 인터페이스 확인(Flusher, Closer 등)

빠른 확인

실패하는 안전하지 않은 타입 단언의 결과는 무엇인가요?

복습

핵심 내용:

  • x.(T)는 타입이 잘못되면 패닉을 일으키고, x, ok := x.(T)는 안전합니다
  • 타입 스위치를 사용하면 여러 타입을 깔끔하게 처리할 수 있습니다
  • 선택적 기능을 확인하려면 인터페이스로 단언합니다
  • nil 인터페이스에는 절대 단언하지 않습니다

연습 문제

타입 스위치를 사용하여 int, float64, string(문자열을 파싱)을 처리하고, 그 외의 값은 건너뛰는 sum(values []any) float64 함수를 작성해 보세요.

자주 묻는 질문

“타입 단언과 타입 스위치” 강의는 무료인가요?

네 — “타입 단언과 타입 스위치” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Go Academy 강의 전체를 잠금 해제할 수 있습니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“타입 단언과 타입 스위치”에서 뭘 배우나요?

안전한 타입 단언과 switch 패턴 브라우저에서 직접 실행하는 실습 코드로 Go Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Go Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Go Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“타입 단언과 타입 스위치” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Go Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Go Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 인터페이스 정의와 구현
  2. 표준 라이브러리의 핵심 인터페이스
  3. 타입 단언과 타입 스위치
  4. 인터페이스 조합과 모범 사례
← Go Academy(으)로 돌아가기