중첩 구조체
Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 107개 중 16번째.
중첩 구조체는 필드 중 하나로 다른 이름 있는 구조체를 포함하는 구조체입니다. 이를 통해 더 작고 재사용 가능한 타입들을 조합하여 복잡한 계층형 데이터를 모델링할 수 있습니다.
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 타입을 재사용
}구조체를 여러 단계로 중첩할 수 있지만, 계층을 얕게 유지하면 가독성이 높아집니다. 중첩 구조체는 Go에서 객체 지향 데이터 모델을 구축하는 데 기본이 됩니다.
챌린지
쉬움중첩 구조체가 실제 계층 구조를 모델링하는 데 어떻게 도움이 되는지 보여 주는 직원 관리 시스템을 만들어 봅시다. 직원이 부서에 속하고 부서에 위치 정보가 있는 구조를 만들게 됩니다.
두 파일에 코드를 나누어 작성합니다.
models.go: 함께 작동하는 구조체 세 개를 정의합니다.Location구조체에는Building(string)과Floor(int) 필드가 있습니다.Department구조체에는Name(string)과 중첩된Location필드가 있습니다.Employee구조체에는ID(int),Name(string), 중첩된Department필드가 있습니다.
main.go: 입력에서 직원 정보를 읽고, 적절하게 구조체를 중첩하여 Employee를 만든 다음, 중첩 구조를 통해 필드에 접근해 직원 프로필 전체를 출력합니다.
다음 입력이 제공됩니다.
- 1행: 직원 ID(정수)
- 2행: 직원 이름
- 3행: 부서 이름
- 4행: 건물 이름
- 5행: 층 번호(정수)
출력 형식:
Employee: [Name] (ID: [ID])
Department: [DepartmentName]
Location: [Building], Floor [Floor]예를 들어, 101, Alice, Engineering, Tower, 5가 주어지면 출력은 다음과 같아야 합니다.
Employee: Alice (ID: 101)
Department: Engineering
Location: Tower, Floor 5점 표기법을 사용해 구조체 계층 구조를 따라가며 중첩된 필드에 접근합니다(예: employee.Department.Location.Building).
직접 해보기
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요약 - 파일 파서직접 연습해 보세요: 온라인 Go 컴파일러