중첩 구조체
Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 107개 중 16번째.
중첩 구조체(nested struct)는 다른 이름이 지정된 구조체를 필드 중 하나로 포함하는 구조체입니다. 이를 통해 더 작고 재사용 가능한 타입들을 함께 조합하여 복잡하고 계층적인 데이터를 모델링할 수 있습니다.
type Address struct {
Street string
City string
ZIP string
}
type Person struct {
Name string
Age int
Address Address // 중첩 구조체
}중첩된 구조체의 필드에 접근하려면 필드 이름을 점(.)으로 연결합니다.
p := Person{
Name: "Alice",
Age: 30,
Address: Address{
Street: "123 Main St",
City: "Boston",
ZIP: "02101",
},
}
fmt.Println(p.Address.City) // Boston중첩은 코드 재사용을 촉진합니다. Address 타입은 필드를 중복하지 않고 Person, Company 또는 Order와 같은 여러 구조체에서 사용될 수 있습니다. 이러한 방식은 엔티티가 다른 엔티티를 포함하는 실제 세계의 관계를 반영합니다.
type Company struct {
Name string
Employees int
Address Address // 동일한 Address 타입 재사용
}구조체(structs)를 여러 단계 깊이로 중첩할 수 있지만, 계층 구조를 얕게 유지하는 것이 가독성을 높여줍니다. 중첩된 구조체(Nested structs)는 Go에서 객체 지향 데이터 모델을 구축하는 데 필수적입니다.
챌린지
쉬움중첩된 구조체(nested structs)가 실제 세계의 계층 구조를 모델링하는 데 어떻게 도움이 되는지 보여주는 직원 관리 시스템을 구축해 보겠습니다. 직원이 부서에 속하고, 부서가 위치 정보를 가지는 구조를 만들 것입니다.
코드는 두 개의 파일로 구성됩니다:
models.go: 함께 작동하는 세 개의 구조체를 정의합니다:Building(string) 및Floor(int) 필드를 가진LocationName(string) 및 중첩된Location필드를 가진DepartmentID(int),Name(string) 및 중첩된Department필드를 가진Employee
main.go: 입력으로부터 직원 정보를 읽고, 적절하게 중첩된 구조체를 사용하여 Employee를 생성한 다음, 중첩된 구조를 통해 필드에 접근하여 전체 직원 프로필을 표시합니다.
다음 입력이 제공됩니다:
- 1행: 직원 ID (정수)
- 2행: 직원 이름
- 3행: 부서 이름
- 4행: 건물 이름
- 5행: 층 번호 (정수)
출력 형식:
Employee: [Name] (ID: [ID])
Department: [DepartmentName]
Location: [Building], Floor [Floor]예를 들어, 101, Alice Chen, Engineering, Tower A, 5가 주어지면 출력은 다음과 같아야 합니다:
Employee: Alice Chen (ID: 101)
Department: Engineering
Location: Tower A, Floor 5구조체 계층 구조를 따라 점 표기법(dot notation)을 사용하여 중첩된 필드에 접근하세요 (예: employee.Department.Location.Building).
치트 시트
중첩 구조체(nested struct)는 다른 이름이 있는 구조체를 필드 중 하나로 포함하는 구조체로, 더 작고 재사용 가능한 타입들을 구성하여 계층적 데이터를 모델링할 수 있게 해줍니다.
중첩 구조체 정의하기
type Address struct {
Street string
City string
ZIP string
}
type Person struct {
Name string
Age int
Address Address // 중첩 구조체
}중첩 필드에 접근하기
점 표기법(dot notation)을 사용하여 구조체 계층을 따라 체이닝합니다:
p := Person{
Name: "Alice",
Age: 30,
Address: Address{
Street: "123 Main St",
City: "Boston",
ZIP: "02101",
},
}
fmt.Println(p.Address.City) // Boston중첩 구조체 재사용하기
동일한 중첩 구조체 타입을 여러 부모 구조체에서 재사용할 수 있습니다:
type Company struct {
Name string
Employees int
Address Address // 동일한 Address 타입 재사용
}중첩 구조체는 코드 재사용을 촉진하고 엔티티가 다른 엔티티를 포함하는 실제 세계의 관계를 반영합니다. 구조체를 여러 단계 깊이로 중첩할 수 있지만, 계층 구조를 얕게 유지하는 것이 가독성을 높여줍니다.
직접 해보기
package main
import "fmt"
func main() {
// 직원 정보를 읽습니다
var id int
var name string
var deptName string
var building string
var floor int
fmt.Scanln(&id)
fmt.Scanln(&name)
fmt.Scanln(&deptName)
fmt.Scanln(&building)
fmt.Scanln(&floor)
// TODO: 적절하게 중첩된 구조체를 사용하여 Employee를 생성하세요
// models.go의 Location, Department, Employee 구조체를 사용하세요
// 입력된 값으로 모든 중첩된 필드를 초기화하세요
// TODO: 다음 형식을 사용하여 직원 프로필을 출력하세요:
// Employee: [Name] (ID: [ID])
// Department: [DepartmentName]
// Location: [Building], Floor [Floor]
// 점 표기법(예: employee.Department.Location.Building)을 사용하여 중첩된 필드에 접근하세요
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8에러 처리와 OOP
error 인터페이스사용자 정의 에러 타입에러 래핑 (fmt.Errorf)센티넬 에러errors.Is()와 errors.As()Panic, Defer, Recover요약 - 파일 파서