Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

Code Habit

Go ) 구조체 ( struct ) 본문

카테고리 없음

Go ) 구조체 ( struct )

코드베어 2020. 6. 1. 09:54

Go 언어에서 구조체는 다음과 같이 선언할 수 있다.

 - type 구조체명 struct {}

type Rectangle struct { 
    width 	int
    height 	int
}

 

구조체 타입으로 인스턴스는 다음과 같이 생성한다.

 - var 변수명 구조체타입

var rect Rectangle

여기서 구조체의 각 필드는 해당 자료형의 기본 값으로 초기화 된다. string은 "", unit는 0, float32는 0.0으로 초기화된다.

 

지역 변수 형태가 아닌 포인터에 메모리 공간을 할당할 수도 있다.

 - 구조체포인터 = new(구조체타입)

var rect1 *Rectangle    // 구조체 포인터 선언
rect1 = new(Rectangle)  // 구조체 포인터에 메모리 할당
rect2 := new(Rectangle) // 구조체 포인터 선언과 동시에 메모리 할당

 

구조체 인스턴스는 생성할 때 값을 초기화할 수 있다.

 - 구조체인스턴스 = 구조체타입{}

var rect1 Rectangle = Rectangle{10, 20}

rect2 := Rectangle{45, 62}

rect3 := Rectangle{width:30, height:15}

중괄호 블록 안에 필드 순서대로 값을 나열하면 된다. 여기서 필드명을 생략했을 때는 필드 개수를 모두 채워주어야 한다. 중괄호 블록 안에 '필드명 : "값"' 형식으로 필드명을 지정해 줄 수도 있다. 이때는 필드 개수를 모두 채워주지 않아도 된다.

 

구조체 인스턴스의 필드에 접근할 때는 .(점)을 사용한다. 마찬가지로 new 함수로 메모리를 할당한 구조체 인스턴스의 필드에 접근할 때도 점을 사용한다.

var rect1 Rectangle
var rect2 *Rectange = new(Rectangle)

rect1.height = 20 // 구조체 인스턴스의 필드에 접근할 때 .을 사용
rect2.height = 62 // 구조체 포인터에 접근할 때도 .을 사용

fmt.Println(rect1) // {0 20}: 구조체 인스턴스의 값
fmt.Println(rect2) // &{0 62}: 구조체 포인터이므로 앞에 &가 붙음

 

new 함수로 구조체의 메모리를 할당하는 동시에 값을 초기화하는 방법은 없다. 하지만 다음과 같은 패턴을 사용하여 다른 언어의 생성자를 흉내낼 수 있다.

func NewRectangle(width, height int) *Rectangle {
    return &Rectangle{width, height} // 구조체 인스턴스를 생성한 뒤 포인터를 리턴
}

func main() {
    rect := NewRectangle(20, 10)
    
    fmt.Println(rect) // &{20, 10}
}

함수 안에서 중괄호 블럭으로 구조체의 값을 초기화한 뒤 포인터를 리턴하는 방식으로 생성자 역할을 수행한다.

 

코드를 줄이면 다음과 같이 쓸 수 있다.

rect := &Rectangle{20, 10}

fmt.Println(rect) // &{20, 10}

 

※ Go언어에서 지역변수를 계속 참조하고 있다면 스코프({}로 묶인 영역)를 벗어나더라도 변수가 해제되지 않는다 !