구조체 : 여러 필드(속성)를 묶어서 사용하는 타입
구조체 선언
type 타입명 struct { 필드명 타입 ... 필드명 타입 } // 별칭 타입 형태와 유사함
필드 접근 시 : 구조체변수명.필드
ex)
type House struct {
Address string
Size int
Price float64
Category string
}
func main() {
var house House
house.Address = "서울시 강남구 ..."
house.Size = 28
house.Price = 10
house.Category = "아파트"
fmt.Println(house) //{서울시 강남구 ... 28 10 아파트}
fmt.Printf("주소:%s 사이즈:%d평 가격:%v억원 종류:%s\n",
house.Address,
house.Size,
house.Price,
house.Category)
//주소:서울시 강남구 ... 사이즈:28평 가격:10억원 종류:아파트
}
var house House
var house House = House {
"서울시 강동구",
28,
9.80,
"아파트", // 여러줄로 초기화할 경우 가장 마지막 값 뒤에 쉼표 달아야 하는 Go언어 특징!
}
var house House = House{ Size:28, Category: "아파트"}
type User struct {
Name string
ID string
Age int
}
type VIPUser struct {
UserInfo User
VIPLevel int
Price int
}
func main() {
user := User{"송하나", "hana", 23}
vip := VIPUser{
User{"화랑", "hwarang", 48},
3,
250,
}
fmt.Printf("유저: %s IP: %s 나이: %d\n", user.Name, user.ID, user.Age)
fmt.Printf("VIP 유저: %s ID: %s 나이: %d VIP레벨: %d VIP가격: %d만원\n",
vip.UserInfo.Name, //점을 여러번 찍어서 접근한다
vip.UserInfo.ID,
vip.UserInfo.Age,
vip.VIPLevel,
vip.Price,
)
}
type User struct {
Name string
ID string
Age int
}
type VIPUser struct {
User //embedded field : 필드명을 안적고 타입만 명시
Price int
Level int
}
fmt.Printf("VIP 유저: %s ID: %s 나이: %d VIP레벨: %d VIP가격: %d만원\n",
vip.Name, //vip.UserInfo.Name
vip.ID, //vip.UserInfo.ID
vip.Age, //vip.UserInfo.Age
vip.VIPLevel,
vip.Price,
)
vip.필드명
: 바깥 구조체의 필드에 우선적으로 접근한다. (VIPUser타입 구조체의 필드)vip.User.필드명
: 내장된 구조체의 필드에 접근하기 위해 필드 타입을 적으면 된다. (필드명을 지정하지 않았기 때문에)var student2 Student = { ... }
var student Student
student = student2 //모든 필드 값이 복사
💡결합도는 낮게, 응집도는 높게!
low coupling, high cohesion
💡구조체는 OOP의 기반이 된다!