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
정리
interface{}는 Go 언어에서 강력한 도구이지만, 신중하게 사용해야 합니다. 타입 안정성과 코드 가독성을 고려하여 적절히 사용하면, 유연하고 재사용 가능한 코드를 작성하는 데 도움이 될 수 있습니다.
관련
Golang Interface - 포인터와 값 타입의 개념 및 활용
Golang Interface - 소프트웨어 인터페이스란?
Golang Interface - OOP에서의 인터페이스 개념, 예시 및 장점
Golang Interface - 암시적 인터페이스: 코드 유연성과 재사용성
'프로그래밍 > Golang' 카테고리의 다른 글
Golang Slice(슬라이스) : make, copy, append (0) | 2024.07.31 |
---|---|
Golang Arrays(배열), Slice(슬라이스) - 선언, 초기화 방법 (0) | 2024.07.31 |
Golang Interface - 암시적 인터페이스: 코드 유연성과 재사용성 (0) | 2024.07.27 |
Golang Interface 최적화: 인터페이스 불필요한 추상화 피하고 테스트 용이성 높이기 (0) | 2024.07.27 |
Golang Interface - OOP에서의 인터페이스 개념, 예시 및 장점 (0) | 2024.07.26 |