Golang

[Golang] 구조체

GenieLove! 2022. 2. 21. 10:27
728x90
반응형

1.구조체란

(1)여러 타입의 값들을 변수 하나로 묶어주는 기능

(2)선언

type Student struct {
	Name string
    Age  int
}

2.구조체 내부에 구조체

(1)

type User struct {
	Name string
    Age  int
    ID	 string
}

type Student {
	UserInfo	User
    Class       string
}

student := Student{
	User{
		"지니",
        5,
        "genie",
    },
    "AClass",
}
fmt.Println(student.UserInfo.Name)

(2)포함된 필드 방식

type User struct {
	Name string
    Age  int
    ID	 string
}

type Student {
	User
    Class	string
    ID		string
}

student := Student{
	User{
		"지니",
        5,
        "genie",
    },
    "AClass",
    "genie2"
}
fmt.Println(student.Name)
fmt.Println(student.User.ID)//중복된 필드가 있을 땐 포함된 구조체 명까지 작성
fmt.Println(student.ID)

3.구조체 크기

(1)메모리 정렬 - 64비트 컴퓨터는 레지스터 크기가 8바이트(32비트는 4바이트)이므로 한 번 연산에 8바이트 크기를 연산할 수 있어, User2의 Age의 4byte가 할당되고 Score의 8byte가 할당될 때 메모리 패딩(메모리 정렬을 위해서 필드 사이에 공간을 띄우는 것)으로 인해 Age와 Score 사이를 4byte만큼 띄워서 할당 된다.

type User struct {
	Age		int//8byte
    Score	float64//8byte
}

var user User
fmt.Println(unsafe.Sizeof(user))//16byte

type User2 struct {
	Age		int32//4byte
    Score	float64//8byte
}

var user2 User
fmt.Println(unsafe.Sizeof(user2))//16byte

(2)메모리 패딩을 고려한 필드 배치 방법

type User struct {
	A	int8
    B	int
    C	int8
    D	int
    E	int8
}

fmt.Println(unsafe.Sizeof(User{}))//40

type User2 struct {
	A	int8//1byte
    C	int8//1byte
    E	int8//1byte
    B	int//8yte
    D	int//8byte
}

fmt.Println(unsafe.Sizeof(User2{}))//24

4.구조체 역할

(1)함수는 관련 코드 블록을 묶어서 응집도를 높이고 재사용성을 증가

(2)배열은 같은 타입의 데이터를 묶어서 응집도를 높임

(3)구조체는 관련된 데이터들을 묶어서 응집도를 높이고 재사용성을 증가

728x90
반응형