본문 바로가기
프로그래밍/Golang

Golang Interface - 빈 인터페이스 (interface{})

by slowin 2024. 7. 27.

1. 빈 인터페이스 소개

Go 언어에서 interface{}는 "빈 인터페이스"라고 불리며, 특별한 의미를 가집니다. 이는 어떤 메서드도 정의하지 않은 인터페이스를 의미합니다.

type EmptyInterface interface{}

Go에서 모든 타입은 적어도 0개의 메서드를 구현하므로, 모든 타입은 빈 인터페이스를 만족합니다. 이는 interface{}가 어떤 타입의 값이라도 담을 수 있다는 것을 의미합니다.

2. 빈 인터페이스의 사용

2.1 모든 타입을 받는 함수 파라미터

func printAny(v interface{}) {
    fmt.Printf("값: %v, 타입: %T\n", v, v)
}

printAny(42)        // 출력: 값: 42, 타입: int
printAny("Hello")   // 출력: 값: Hello, 타입: string
printAny(true)      // 출력: 값: true, 타입: bool

2.2 다양한 타입을 저장하는 컨테이너

mixedList := []interface{}{
    42,
    "Hello",
    true,
    3.14,
}

3. 타입 단언과 타입 스위치

3.1 타입 단언 (Type Assertion)

var i interface{} = "Hello"

s := i.(string)
fmt.Println(s)  // 출력: Hello

n, ok := i.(int)
fmt.Println(n, ok)  // 출력: 0 false

3.2 타입 스위치

func describe(i interface{}) {
    switch v := i.(type) {
    case int:
        fmt.Printf("정수: %d\n", v)
    case string:
        fmt.Printf("문자열: %s\n", v)
    default:
        fmt.Printf("알 수 없는 타입\n")
    }
}

describe(42)        // 출력: 정수: 42
describe("Hello")   // 출력: 문자열: Hello
describe(true)      // 출력: 알 수 없는 타입

4. 장단점 분석

장점:

  • 유연성: 다양한 타입을 다룰 수 있음
  • 재사용성: 제네릭한 함수나 데이터 구조 구현 가능

단점:

  • 타입 안정성 감소: 컴파일 시 타입 체크를 우회
  • 런타임 에러 가능성 증가: 타입 단언 시 패닉 발생 가능
  • 성능 저하: 타입 체크와 변환에 따른 오버헤드

5. 실제 사용

import "encoding/json"

func decodeJSON(jsonStr string) (interface{}, error) {
    var result interface{}
    err := json.Unmarshal([]byte(jsonStr), &result)
    return result, err
}

jsonData := `{"name": "Alice", "age": 30}`
decoded, _ := decodeJSON(jsonData)
fmt.Printf("%+v\n", decoded)
// 출력: map[age:30 name:Alice]

6. Go 1.18+ 제네릭스와의 비교

Go 1.18부터 도입된 제네릭스는 interface{}를 대체할 수 있는 타입 안전한 방법을 제공합니다.

func printSlice[T any](s []T) {
    for _, v := range s {
        fmt.Printf("%v ", v)
    }
    fmt.Println()
}

printSlice([]int{1, 2, 3})       // 출력: 1 2 3
printSlice([]string{"a", "b", "c"}) // 출력: a b c

golang any type

정리

interface{}는 Go 언어에서 강력한 도구이지만, 신중하게 사용해야 합니다. 타입 안정성과 코드 가독성을 고려하여 적절히 사용하면, 유연하고 재사용 가능한 코드를 작성하는 데 도움이 될 수 있습니다.

관련

Golang Interface - 포인터와 값 타입의 개념 및 활용

Golang Interface - 소프트웨어 인터페이스란?

Golang Interface - OOP에서의 인터페이스 개념, 예시 및 장점

Golang Interface - 암시적 인터페이스: 코드 유연성과 재사용성

Golang Interface - 빈 인터페이스 (interface{})

Golang Interface 최적화: 인터페이스 불필요한 추상화 피하고 테스트 용이성 높이기