빈 인터페이스 (any)
Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 107개 중 28번째.
empty interface는 메서드가 0개인 interface입니다. Go의 모든 타입은 최소 0개의 메서드를 가지므로 모든 타입이 자동으로 empty interface를 충족합니다. 따라서 모든 타입의 값을 담을 수 있습니다.
var anything interface{}
anything = 42
anything = "hello"
anything = true
anything = []int{1, 2, 3}Go 1.18부터 any 키워드가 interface{}의 별칭으로 도입되었습니다. 둘은 완전히 서로 바꿔 사용할 수 있지만, any가 읽기에 더 깔끔합니다.
var value any = "Go is awesome"빈 interface는 알 수 없거나 다양한 type의 값을 처리해야 할 때 유용합니다. fmt.Println과 같은 function은 any type의 인수를 받아들이기 위해 이를 사용합니다:
func PrintAnything(v any) {
fmt.Println("Value:", v)
}
func main() {
PrintAnything(100)
PrintAnything("text")
PrintAnything(3.14)
}하지만 절충점이 있습니다. When 값이 빈 interface에 저장되면 해당 값의 구체적인 type 정보에 액세스할 수 없게 됩니다.
기반 타입을 먼저 추출하지 않고는 methods를 직접 호출하거나 field에 액세스할 수 없습니다. 다음 단원에서는 type assertion과 type switch를 사용하여 빈 interface에서 구체적인 타입을 가져오는 방법을 다룹니다.
챌린지
쉬움empty interface를 사용하여 모든 type의 값을 저장할 수 있는 유연한 저장 컨테이너를 만들어 보겠습니다. any를 사용하면 동일한 구조에 서로 다른 type을 저장할 수 있다는 것을 보여 주는 간단한 상자를 만들게 됩니다.
코드를 두 개의 파일로 구성합니다.
box.go: 단일field인Content를 가지며 type이any인Boxstruct를 Define합니다. 모든 type의 값을 accepts하고 해당 값을 containing하는 Box에 대한 pointer를 returns하는NewBoxconstructor function을 Create합니다. 상자에 저장된 내용을 보여 주는 string을 returns하는Describemethod를 추가합니다.main.go: 입력에서 서로 다른 값을 Read하고, integer, string, boolean을 containing하는 상자를 Create한 다음 각 상자의 설명을 Print하여 동일한 Box type이 완전히 다른 값을 저장할 수 있음을 보여 줍니다.
다음 입력이 제공됩니다.
- Line 1: integer 값
- Line 2: string 값
- Line 3: boolean 값 (
true또는false)
여러분의 Describe method는 다음 format의 string을 returns해야 합니다.
Box contains: [value]예를 들어 42, hello, true가 주어지면 output은 다음과 같아야 합니다.
Box contains: 42
Box contains: hello
Box contains: true여기서 핵심은 하나의 Box struct가 integer, string 또는 boolean을 저장할 수 있다는 것입니다. 이는 any type이 모든 type의 값을 accepts하기 때문입니다. 각 상자에는 서로 다른 내용이 들어 있지만, 모두 동일한 Box type입니다.
직접 해보기
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// 정수 값 읽기
line1, _ := reader.ReadString('\n')
intVal, _ := strconv.Atoi(strings.TrimSpace(line1))
// 문자열 값 읽기
line2, _ := reader.ReadString('\n')
strVal := strings.TrimSpace(line2)
// 불리언 값 읽기
line3, _ := reader.ReadString('\n')
boolVal, _ := strconv.ParseBool(strings.TrimSpace(line3))
// TODO: NewBox를 사용하여 각 값에 대한 상자 만들기
// TODO: Describe 메서드를 사용하여 각 상자의 설명 출력하기
// 컴파일 오류를 피하기 위해 변수 사용 (구현 시 이 줄들을 제거하세요)
_ = intVal
_ = strVal
_ = boolVal
// 예제 출력 형식:
// fmt.Println(box.Describe())
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8에러 처리와 OOP
error 인터페이스사용자 정의 에러 타입에러 래핑 (fmt.Errorf)센티넬 에러errors.Is()와 errors.As()Panic, Defer, Recover요약 - 파일 파서직접 연습해 보세요: 온라인 Go 컴파일러