Go 프로그래밍 - 구조체

beno·2021년 6월 24일
0

golang

목록 보기
3/8

클래스의 개념과 유사한 Go의 구조체에 대해서 정리합니다.

1. 구조체 선언하기

package main

type House struct {
	Address string
	Size    int
	Price   float64
	Type    string
}
  • type (구조체이름) struct {필드..} 의 포멧으로 선언
  • 각 필드는 (필드명) (타입)의 포멧으로 선언

2. 구조체 초기화하기

func main() {
	// 초깃값 생략.
	var house House
	// 모든 필드 초기화 1 (한줄)
	var house1 House = House{"서울시 서초구", 50, 37.7, "아파트"}
	// 모든 필드 초기화 2 (여러줄. 마지막 요소의 끝에는 콤마 필수)
	var house2 House = House{
		"서울시 강동구",
		35,
		20.2,
		"아파트",
	}
	// 일부 필드 초기화 1 (한줄)
	var house3 House = House{ Size: 28, Type: "아파트"}
	// 일부 필드 초기화 2 (여러줄. 마지막 요소의 끝에는 콤마 필수)
	var house4 House = House{ 
		Size: 28, 
		Type: "아파트",
	}
    print(house1.Name)

}
  • 모든 필드를 초기화하는 방법과 일부만 초기화하는 방법이 있음
  • 여러줄에 걸쳐서 초기화할 때, 마지막 요소에 반드시 콤마를 붙여줘야 함.
  • .을 이용해 특정 구조체의 내부 필드에 접근 가능
    • house.Address, house.Size, ...

3. 구조체 내부의 구조체

package main

import "fmt"

type User struct {
	Name string
	ID   string
	Age  int
}

type VIPUser struct {
	UserInfo User
	VIPLevel int
	Price    int
}

func main() {
	user := User{"송하나", "하나", 30}
        /* 1 */
	vip := VIPUser{
		user,
		3,
		1000,
	}

	fmt.Printf("유저: %s ID: %s 나이: %d\n", user.Name, user.ID, user.Age)
	fmt.Printf("[VIP] 유저: %s ID: %s 나이: %d 레벨: %d 가격: %d\n",
            	/* 2 */
		vip.UserInfo.Name,
		vip.UserInfo.ID,
		vip.UserInfo.Age,
		vip.VIPLevel,
		vip.Price,
	)

}
  • 구조체를 별도로 정의해서 상위 구조체를 초기화할때 주입
  • .을 이용해 내부 구조체의 내부 필드에 접근
    • vip.UserInfo.Name, vip.UserInfo.ID,...

구조체 간 필드 레벨 병합

A.B.C... 처럼 여러단계를 거쳐 접근하는 번거로움을 덜어주는 방법이다.

package main

import "fmt"

type User struct {
	Name string
	ID   string
	Age  int
}

type VIPUser struct {
	/* 1. 필드명 생략 */
	User
	VIPLevel int
	Price    int
}

func main() {
	user := User{"송하나", "하나", 30}
	vip := VIPUser{
		user,
		3,
		1000,
	}

	fmt.Printf("유저: %s ID: %s 나이: %d\n", user.Name, user.ID, user.Age)
	fmt.Printf("[VIP] 유저: %s ID: %s 나이: %d 레벨: %d 가격: %d\n",
            	/* 2. user를 거치지 않고 User 필드에 바로 접근 가능 */
		vip.Name,
		vip.ID,
		vip.Age,
		vip.VIPLevel,
		vip.Price,
	)

}
  • 구조체 선언 시 필드명을 생략하면 해당 타입의 필드명에 직접 접근 가능
type VIPUser struct {
  /* 1. 필드명 생략 */
  User
  VIPLevel int
  Price    int
}
  • 만약 구조체 간 필드명이 겹친다면?
// Level 필드명이 겹치는 상황

type User struct {
	Name string
	ID   string
	Age  int
   	Level  int
}

type VIPUser struct {
	User
	Level 	int
	Price   int
}

...

// 해당 구조체에 선언된 필드가 우선시.
// 필드명이 중복되는 다른 내부변수에 접근하고자 할 때는 타입명 네임스페이스를 이용해 접근
vip.Level => VIPUser 객체의 Level 필드
vip.User.Level => VIPUser 내부 User 객체의 Level 필드
profile
마음은 여기에. 시선은 저 멀리.

0개의 댓글

관련 채용 정보