익명 구조체
Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 107개 중 15번째.
익명 구조체(anonymous struct)는 이름이 지정된 타입이 없는 구조체입니다. type 키워드를 사용하지 않고 한 단계에서 구조를 정의하고 인스턴스를 생성합니다.
person := struct {
Name string
Age int
}{
Name: "Alice",
Age: 30,
}이것은 재사용 가능한 타입을 선언하지 않고 구조체 값을 직접 생성합니다. 익명 구조체는 코드의 다른 곳에서 사용되지 않을 빠르고 일회성인 데이터 구조가 필요할 때 유용합니다.
일반적인 사용 사례는 단일 함수 또는 테스트를 위해 관련 데이터를 그룹화하는 것입니다.
config := struct {
Host string
Port int
}{
Host: "localhost",
Port: 8080,
}
fmt.Println(config.Host) // localhost익명 구조체는 각 테스트 케이스가 고유한 필드를 갖는 테이블 기반 테스트에서도 널리 사용됩니다.
tests := []struct {
input int
expected int
}{
{1, 2},
{5, 10},
}익명 struct는 타입 이름이 없기 때문에 메서드를 정의하거나 해당 타입을 다른 곳에서 재사용할 수 없습니다. 일시적이고 국소적인 데이터 그룹화를 위해 사용하세요. 여러 번 참조해야 하는 경우에는 대신 이름이 있는 struct 타입을 정의하세요.
챌린지
쉬움재사용 가능한 타입이 필요 없는 일회성 데이터 그룹화에 익명 구조체(anonymous structs)가 얼마나 유용한지 보여주는 간단한 설정 시스템을 구축해 보겠습니다.
코드는 두 개의 파일로 구성됩니다:
config.go: 서버 이름(string), 포트(int), 디버그 모드(bool)를 매개변수로 받는GetServerConfig함수를 만듭니다. 이 함수는Name,Port,Debug라는 세 개의 필드를 가진 익명 구조체를 반환해야 합니다. 이 설정은 한 곳에서만 사용되므로 별도의 명명된 타입을 정의할 필요가 없습니다.main.go: 입력값으로부터 서버 설정 값을 읽고,GetServerConfig함수를 호출한 뒤 설정 세부 정보를 출력합니다.
다음과 같은 입력이 제공됩니다:
- 1행: 서버 이름
- 2행: 포트 번호
- 3행: 디버그 모드 (
true또는false)
출력 형식:
Server: [Name]
Port: [Port]
Debug: [Debug]예를 들어, api-server, 8080, true가 입력되면 출력은 다음과 같아야 합니다:
Server: api-server
Port: 8080
Debug: true익명 구조체를 사용하면 단 한 번만 사용되는 타입으로 코드베이스를 복잡하게 만들지 않고도 그룹화된 데이터를 반환할 수 있다는 점에 주목하세요.
치트 시트
익명 구조체(anonymous struct)는 이름이 지정된 타입이 없는 구조체로, type 키워드를 사용하지 않고 한 단계에서 정의와 인스턴스화가 동시에 이루어집니다:
person := struct {
Name string
Age int
}{
Name: "Alice",
Age: 30,
}익명 구조체는 코드의 다른 곳에서 재사용되지 않을 일회성 데이터 구조에 유용합니다.
일반적인 사용 사례로는 단일 함수를 위해 관련 데이터를 그룹화하는 경우가 있습니다:
config := struct {
Host string
Port int
}{
Host: "localhost",
Port: 8080,
}
fmt.Println(config.Host) // localhost그리고 테이블 기반 테스트(table-driven tests)가 있습니다:
tests := []struct {
input int
expected int
}{
{1, 2},
{5, 10},
}익명 구조체는 메서드를 정의할 수 없으며 타입으로 재사용될 수 없습니다. 임시적이고 국소적인 데이터 그룹화를 위해 사용하세요. 여러 번 참조되는 타입의 경우, 대신 이름이 있는 구조체를 정의하세요.
함수는 익명 구조체를 반환할 수 있습니다:
func GetConfig() struct {
Name string
Port int
} {
return struct {
Name string
Port int
}{
Name: "server",
Port: 8080,
}
}직접 해보기
package main
import (
"fmt"
)
func main() {
// 입력 값 읽기
var name string
var port int
var debug bool
fmt.Scanln(&name)
fmt.Scanln(&port)
fmt.Scanln(&debug)
// TODO: 입력 값을 사용하여 GetServerConfig 호출
// 그리고 반환된 익명 구조체 저장
// TODO: 필요한 형식으로 설정 출력:
// Server: [Name]
// Port: [Port]
// Debug: [Debug]
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8에러 처리와 OOP
error 인터페이스사용자 정의 에러 타입에러 래핑 (fmt.Errorf)센티넬 에러errors.Is()와 errors.As()Panic, Defer, Recover요약 - 파일 파서