Menu
Coddy logo textTech

중첩 구조체

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에서 객체 지향 데이터 모델을 구축하는 데 필수적입니다.

challenge icon

챌린지

쉬움

중첩된 구조체(nested structs)가 실제 세계의 계층 구조를 모델링하는 데 어떻게 도움이 되는지 보여주는 직원 관리 시스템을 구축해 보겠습니다. 직원이 부서에 속하고, 부서가 위치 정보를 가지는 구조를 만들 것입니다.

코드는 두 개의 파일로 구성됩니다:

  • models.go: 함께 작동하는 세 개의 구조체를 정의합니다:
    • Building (string) 및 Floor (int) 필드를 가진 Location
    • Name (string) 및 중첩된 Location 필드를 가진 Department
    • ID (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)을 사용하여 중첩된 필드에 접근하세요
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨