Menu
CoddyTech

중첩 구조체

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에서 객체 지향 데이터 모델을 구축하는 데 기본이 됩니다.

challenge icon

챌린지

쉬움

중첩 구조체가 실제 계층 구조를 모델링하는 데 어떻게 도움이 되는지 보여 주는 직원 관리 시스템을 만들어 봅시다. 직원이 부서에 속하고 부서에 위치 정보가 있는 구조를 만들게 됩니다.

두 파일에 코드를 나누어 작성합니다.

  • 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)
}
quiz icon실력 점검

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

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

직접 연습해 보세요: 온라인 Go 컴파일러