이 글은 Tucker의 Go언어 프로그래밍 책을 13장 구조체를 보고 정리한내용이다.
구조체
구조체는 여러 필드를 묶어서 사용하는 타입이다. 구조체를 사용하면 연관된 여러 데이터를 하나의 이름으로 묶을수 있다.
type Home struct{
Address string
Size int
Price float64
Type string
}
var house House
모든 필드가 기본값으로 초기화된다.
var house House = House {"서울시 서초구",8,0.6,"오피스텔"}
모든 필드가 순서대로 초기화된다.
var house House = House {Size:28 , Type:"오피스텔"}
'필드명':'필드값' 형식으로 초기화 되며 , 초기화 되지 않은 나머지 변수에는 기본값 할당
type User struct {
Name string
ID string
Age int
}
type VIPUser struct {
UserInfo User
VIPLevel int
Price int
}
VIPUser 구조체에서 User 구조체 안의 변수로 접근하려면 VIPUser.User. 으로 접근해야하는 번거로움이 있다.
type User struct {
Name string
ID string
Age int
}
type VIPUser struct {
User
VIPLevel int
Price int
}
VIPUser 구조체에서 User 구조체의 필드명을 생략하게 되면 User 구조체 변수 접근시 VIPUser. 로 바로 접근할수 있다.
type User struct {
Name string
ID string
Age int
Level int
}
type VIPUser struct {
User
Price int
Level int
}
VIPUser 구조체의 변수와 User 구조체 변수가 같을 때 User 구조체 변수를 접근하려면 VIPUser.User. 으로 접근하면 된다.
type User struct{
Age int
Score float64
}
int(8바이트) + float64(8바이트) = 16바이트
package main
import (
"fmt"
"unsafe"
)
type User struct {
Age int32 // 4바이트
Score float64 // 8바이트
}
func main() {
user := User{23, 77.2}
fmt.Println(unsafe.Sizeof(user)) // 16
}
배운대로 라면 12바이트 출력되어야 한다. 16바이트가 출력되는 이유는 ??
메모리 정렬 : 컴퓨터가 효과적으로 접근하고자 메모리를 일정 크기 간격으로 정렬하는것이다. 64비트 컴퓨터에서는 8바이트 단위로 정렬되는 것이 효과적이므로 12바이트가 아닌 4바이트 메모리 패딩을 통해 크기는 16바이트가 된다.
메모리 패딩을 고려한 필드 배치 방법
package main
import (
"fmt"
"unsafe"
)
type User struct {
A int8
B int // int64
C int8
D int // int64
E int8
}
func main() {
user := User{1, 2, 3, 4, 5}
fmt.Println(unsafe.Sizeof(user)) //40
}
실제 1바이트 3개와 8바이트 2개로 구성되어 있기 때문에 19바이트 크기를 차지한다. 하지만 1바이트 변수는 7바이트씩 메모리 패딩으로 인해 크기는 ((1+7) 3) + (8 2) 40이 된다.
package main
import (
"fmt"
"unsafe"
)
type User struct {
A int8
B int8
C int8
D int
E int
}
func main() {
var user = User{1, 2, 3, 4, 5}
fmt.Println(unsafe.Sizeof(user)) // 24
}
이렇게 1바이트를 몰아 주면 구조체의 크기를 8바이트 * 3 = 24 로 순서 조정 전보다 16바이트를 절약할수 있다.
함수,배열,구조체 모드 응집도를 증가시키는 역할을 한다. 구조체를 사용해서 관련 데이터들을 묶으면 개별 데이터에 집중하지 않고 큰 범위에서 생각할 수 있게 되었다.
참고