Go언어 입문 #5

학미새🐥·2022년 2월 26일
1
post-custom-banner

구조체

구조체 : 여러 필드(속성)를 묶어서 사용하는 타입

  • 구조체 선언

    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, "아파트"}
  • 여러줄로 값 설정 :
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
}
  • User 타입의 구조체
  • VIPUser 타입의 구조체 : User구조체 타입의 필드를 포함한다
  • 사용법
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,
	)
}

embedded field (포함된 필드방식)

type User struct {
	Name string
    ID string
    Age int
}

type VIPUser struct {
	User	//embedded field : 필드명을 안적고 타입만 명시
    Price int
    Level int
}
  • embedded field로 구조체 정의 시, 점을 여러번 찍지 않아도 내장된 구조체 필드에 접근할 수 있다.
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,
	)
  • 만약 구조체를 포함하는 구조체와 내장된 구조체가 모두 같은 이름의 필드를 가질 때,
  1. vip.필드명 : 바깥 구조체의 필드에 우선적으로 접근한다. (VIPUser타입 구조체의 필드)
  2. vip.User.필드명 : 내장된 구조체의 필드에 접근하기 위해 필드 타입을 적으면 된다. (필드명을 지정하지 않았기 때문에)

구조체 복사

  • 모든 필드 값이 복사된다
  • 구조체 전체 크기만큼 복사된다
var student2 Student = { ... }
var student Student
student = student2  //모든 필드 값이 복사

구조체의 역할

💡결합도는 낮게, 응집도는 높게!
low coupling, high cohesion

  • 함수 : 관련 코드블록을 묶어서 응집도를 높이고 재사용성을 증가시킨다.
  • 배열 : 같은 타입의 데이터를 묶어 응집도를 높인다
  • 구조체 : 관련 데이터를 묶어 응집도를 높이고 재사용성을 증가시킨다.

💡구조체는 OOP의 기반이 된다!

  • 구조체도 관련 필드를 묶어서 하나의 의미를 부여한다는 기능에서 '객체'라고 할 수 있다.
  • Go는 class가 없고 구조체만이 객체의 역할을 한다.
profile
뭐든 다해보려는 공대생입니다
post-custom-banner

0개의 댓글