개발바닥

[기본 개념 요약] 구조체 본문

GO 언어

[기본 개념 요약] 구조체

라이언 2023. 3. 17. 22:13
반응형

구조체란?

구조체는 여러 필드를 묶어서 사용하는 타입이다.

고 언어에서는 class를 지원하지 않기 때문에 고 언어에서 만큼은 객체로 쓰인다.

프로그래밍에서 추구해야 될 방향으로 "결합도(의존성)은 낮게 응집도는 높게" 하기 위해 함수, 배열, 구조체 등을 사용한다.

여기서 구조체관련된 데이터들을 묶어서 응집도를 높이고 재사용성을 증가시키는 역할을 한다.

 

구조체 선언

type 타입명 struct{
	필드명 타입
    	...
    	필드명 타입
}

ex) 
type User struct{
	Name string
    	Age int
}

 

구조체 크기

구조체는 타입이므로 변수 형태와 사이즈를 가지고 있다.

구조체 사이즈는 모든 필드에 사이즈를 더한 값이다.

여기서 주의할 사항으로 고언어 컴파일러는 메모리를 정렬해서 저장하기 때문에 8바이트씩(64비트 컴퓨터라면) 끊어서 저장한다.

그러므로 8바이트보다 작은 필드는 8바이트 크기(단위)를 고려해서 몰아서 배치하는 것이 좋다.

작은거부터 정의하게 되면 메모리 패딩을 줄일 수 있다. ( 최근에 컴퓨터 사양이 좋기 때문에 굳이 메모리 패딩까지 고려해서 프로그래밍할 필요는 없지만, 메모리 작은 환경인 임베디드 같은 곳에서는 고려하는 것이 중요하다.)

 

type Memory struct{
	A bool // 1byte
   	B int  // 8byte
    	C int8 // 1byte
    	D int  // 8byte
}

	memory := Memory{true, 1, 2, 3}
	fmt.Println(unsafe.Sizeof(memory))
    // 32 출력된다.
    

type Memory struct{
	A bool // 1byte
    	C int8 // 1byte
    	B int  // 8byte
	D int  // 8byte
}

	memory := Memory{true, 1, 2, 3}
	fmt.Println(unsafe.Sizeof(memory))
	//24 출력된다.

 

구조체를 포함하는 구조체 (embedded structure)

구조체안에 필드명과 특정 구조체를 포함시킨 방식이다.

접근할 때 필드명으로 접근하면 된다.

 

type User sturct{
	Name string
	Age int
}

type VIPUser struct{
	UserInfo User
	VipLevel int
	Price int
}

//출력할 때 필드명을 통해서 접근하면 된다.
//vip.UserInfo.Name
//vip.UserInfo.Age

 

포함된 필드 방식 (embedded field)

구조체가 구조체를 포함하고 있는 것으로 해당 필드를 변수명 없이 접근할 수 있다.

단, 중복되는 필드가 있을 경우 바깥쪽이 우선 순위를 갖기 때문에 안쪽 구조체에 필드를 접근하기 위해서는 구조체 타입으로 접근해서 필드를 사용할 수 있다.

 

type User struct{
	Name string
	Age int
	Level int
}

type VIPUser struct{
	User
	Price int
	Level int
}

// 필드 접근하기
// vip.Name
// vip.Level   // VIPUser의 필드 Level에 접근
// vip.User.Level // VIPUser 안에 있는 User 구조체 필드 Level에 접근
반응형

'GO 언어' 카테고리의 다른 글

[기본 개념 요약] 슬라이스  (0) 2023.04.11
[기본 개념 요약] 배열  (0) 2023.03.14
[기본 개념 요약] 변수  (0) 2023.03.12
Echo framework로 간단한 웹서버 만들기  (1) 2022.03.27
유닛 테스트(Unit Test)  (0) 2022.03.09
Comments