무지개곰
article thumbnail
반응형

목차

구조체 정의

구조체 생성

임베디드 구조체 (embedded struct)


구조체 정의

서로 다른 타입을 가지지만 관련된 데이터를 하나의 타입으로 묶을 수 있게 하는 것을 구조체라고 합니다.

구조체는 type 예약어를 사용하여 정의합니다.

예를 들어 게임 캐릭터는 이름과 레벨 경험치를 포함하여야 합니다. 캐릭터마다 필요한 변수를 선언하게 된다면 변수 선언을 3번씩 하여야 합니다.

type Character struct {
    Name  string
    Level uint
    Exe   float64
}

구조체를 사용하는 경우 Character라는 type을 활용하여 변수들을 묶어서 관리하기 때문에 변수들을 따로 선언하지 않고 사용할 수 있습니다.


구조체 생성

정의한 구조체를 생성하는 방법은 여러 가지가 있습니다.

package main

import "fmt"

type Character struct {
    Name  string
    Level uint
    Exe   float64
}

func main() {
    var character1 Character = Character{"무지개곰1", 1, 0.0}
    character2 := Character{"무지개곰2", 1, 0.0}
    character3 := Character{Name:"무지개곰3", Exe:1.0}
    character4 := new(Character)
    character4.Name="무지개곰4"
    fmt.Println(character1)
    fmt.Println(character2)
    fmt.Printf("%T %v\n",character3, character3)
    fmt.Printf("%T %v\n",character4, character4)
}

구조체도 type을 가지기에 변수 선언 방법처럼 구조체를 생성할 수 있습니다. 또한 배열을 선언하는 것처럼 중괄호 속에 값을 따로 입력하지 않는다면 기본 값으로 생성됩니다.

조금 특이한 점은 new를 사용하여 구조체를 생성하는 방법입니다.

new를 사용하게 된다면 new()가 메모리에 instance를 생성하고 character4는 메모리 주소를 값을 가지는 포인터가 됩니다.

포인터에 대한 설명은 다음에 다루도록 하겠습니다.

new를 사용하게 되면 초기 값을 선언할 수 없어 기본값으로 채워지게 됩니다.

*출력

{무지개곰1 1 0}
{무지개곰2 1 0}
main.Character {무지개곰3 0 1}
*main.Character &{무지개곰4 0 0}

임베디드 구조체

구조체 내에 다른 구조체를 필드로 포함하는 방식을 임베디드 구조체라고 합니다.

type Address struct {
    Street  string
    City    string
    Country string
}

type Person struct {
    Name string
    LivingAddress   Address
}

type Building struct {
    Name string
    Address
}

위의 예시에서 Address는 Street, City, Country의 값을 필요로 합니다.

Person은 Name 그리고 Address를 필요로 합니다.

Building은 Name 그리고 Address를 필요로 합니다.

이때 Person과 Building이 Address에 대하여 Street, City, Country을 작성하는 것이 아닌 Address struct을 사용하였습니다. 이러한 것을 임베디드 구조체라고 합니다.

변수 호출

임베디드 구조체를 정의할 때 Person의 LivingAddress와 같이 변수 명과 type을 작성하기도 하지만 Building의 Address와 같이 type만 명시하기도 합니다.

두 가지 상황에서 Address 구조체 속의 값을 호출하는 방법은 아래와 같습니다.

Country 출력

person1 := Person{"무지개곰" ,Address{"거리1", "도시1", "나라1"}}
building := Building{"무지개 타워", Address{"거리2", "도시2", "나라1"}}

fmt.Println(person1.LivingAddress.Country) // 나라1
fmt.Println(building.Country)  // 나라1
fmt.Println(building.Address.Country)  // 나라1

변수명을 따로 지정하지 않고 type만 입력한 Building의 경우는 바로 Address의 Country로 접근할 수도 있고 type을 명시하여 Address.Country로 접근할 수도 있습니다.

 

type을 명시하여 접근하여야 하는 경우

임베디드 구조체에서 Address에도 Country를 사용하고 Person에도 Country를 사용할 수 있습니다.

type Address struct {
    Street  string
    City    string
    Country string // 거주지 나라
}

type Person struct {
    Name string
    Country string // 국적
    Address
}

person := Person{"무지개곰", "출생지", Address{"거리1", "도시1", "거주지"}}

fmt.Println(person.Country,person.Address.Country)

위의 경우 person.Country는 Person 구조체의 Country값을 불러옵니다. 이런 상황에서 Address의 Country를 불러오고 싶다면 person.Address.Country를 사용하여 불러올 수 있습니다.

반응형
profile

무지개곰

@무지개곰

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!