Go(golang) 구조체(struct)
안녕하세요. 이번에는 golang의 구조체에 대해서 알아보겠습니다.
![]() |
사진1) 구조체 선언 |
사진1과 같이 타입을 선언할수 있습니다.
1) 타입 선언
2) 선언할 타입의 이름
3) 구조체 선언
4) 해당 구조체의 원소 타입 선언
package main
import (
"fmt"
"unsafe"
)
// 학생 타입 선언
type Student struct {
age int32 // 4 byte
name string // 16 byte
}
// 학점 타입 선언
type Grade struct {
student Student
score float32
year uint8
}
func main(){
// 타입을 이용여 변수 선언 및 age, name 할당
var stu1 Student = Student{
32,
"alex",
}
// 64비트 운영체제의 실제 stu1 구조체(struct)의 크기를 측정할때 20byte가 아닌 24byte로 출력된다.
fmt.Println(unsafe.Sizeof(stu1))
// 타입을 이용하여 stu1Grade를 Grade타입으로 선언하고 원소값 할당
var stu1Grade Grade = Grade{
stu1,
100,
2,
}
// stu1에서 name과 age를 각각 출력
fmt.Println("stu1출력 :",stu1.name, stu1.age)
// stu1Grade에서 name과 age를 각각 출력
fmt.Println("stu1Grade 출력 :",stu1Grade.student.name, stu1Grade.student.age)
}
코드1) struct 크기
![]() |
사진2) struct 메모리 할당 |
그런데 코드1에서 Student타입의 크기는 24byte로 출력 되었습니다. 이는 운영체제가 32bit, 64bit에 따라 달라집니다. 64bit는 한번에 8byte를 계산할수 있기 때문에 한번 변수를 할당할때 8byte의 배수로 할당합니다.
package main
import (
"fmt"
"unsafe"
)
// 64bit OS에 Struct 타입 선언
type TestStruct struct {
Alpa1 int8 // 1byte
Alpa2 int // 8byte(int64)
Alpa3 int8 // 1byte
Alpa4 int // 8byte(int64)
}
func main(){
// 변수 선언
var test TestStruct = TestStruct{
1,
2,
3,
4,
}
// 해당 크기는 18byte가 아닌32byte가 출력된다.
fmt.Println("Size of struct :", unsafe.Sizeof(test))
}
코드2) struct 크기 테스트
![]() |
사진3) 실제 할당된 메모리 |
위 코드2는 효율적이지 못한 struct구조 입니다. 각각 1byte인 'Alpa1', 'Alpa3'이 따로 떨어져 있어 사용하지 못하는 메모리가 14byte나 생겼습니다. 이때 순서를 잘 이용하면 메모리 사용량을 상당히 줄일수 있습니다.
package main
import (
"fmt"
"unsafe"
)
// 64bit OS에 Struct 타입 선언
type TestStruct struct {
Alpa2 int // 8byte(int64)
Alpa4 int // 8byte(int64)
Alpa1 int8 // 1byte
Alpa3 int8 // 1byte
}
func main(){
// 변수 선언
var test TestStruct = TestStruct{
1,
2,
3,
4,
}
// 해당 크기는 24byte가 출력된다.
fmt.Println("Size of struct :", unsafe.Sizeof(test))
}
코드3) 효율적인 struct 크기 테스트
![]() |
사진4) 코드6의 실제 메모리 할당 |
코드3을 실행하면 코드2에서의 32byte가 아닌 24byte가 측정된다. 이는 사진4와 같이 golang에서 최대한 8byte에 넣으려고 노력하기 때문이다.
댓글
댓글 쓰기