가장 빨리 만나는 Go 언어 Unit 29. 구조체 사용하기

저작권 안내
  • 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
  • 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.

구조체 사용하기

이재홍 http://www.pyrasis.com 2014.12.17 ~ 2015.02.07

여러 변수를 담을 수 있는 구조체에 대해 알아보겠습니다.

  • type 구조체명 struct { }

다음은 간단하게 사각형(Rectangle)을 나타내는 구조체입니다.

type Rectangle struct {
	width  int
	height int
}

{ } (중괄호) 블록 안에는 구조체의 필드(멤버) 목록을 정의합니다. 각 필드를 나타내는 방법은 변수를 선언하는 방법과 같습니다.

구조체 필드에서 자료형이 같은 필드는 한 줄로 나열해도 됩니다.

type Rectangle struct {
	width, height int // 자료형이 같은 필드는 한 줄로 나열
}

이제 Rectangle 타입으로 인스턴스를 생성해보겠습니다.

  • var 변수명 구조체_타입
var rect Rectangle

구조체 인스턴스는 일반 변수를 선언하는 방법과 같습니다. 여기서 구조체의 각 필드는 해당 자료형의 기본 값으로 초기화됩니다. string은 "", uint는 0, float32는 0.0으로 초기화됩니다.

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

  • 구조체_포인터 = new(구조체_타입)
var rect1 *Rectangle   // 구조체 포인터 선언
rect1 = new(Rectangle) // 구조체 포인터에 메모리 할당

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

new 함수로 메모리 공간을 할당할 때는 구조체의 포인터 변수에 할당합니다. var 키워드를 사용하지 않고 :=로 변수를 선언하면서 메모리를 할당할 수 있습니다.

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

  • 구조체_인스턴스 = 구조체_타입{ }
var rect1 Rectangle = Rectangle{10, 20} // 구조체 인스턴스를 생성하면서 값 초기화

rect2 := Rectangle{45, 62} // var 키워드 생략 구조체 인스턴스를 생성하면서 값 초기화

rect3 := Rectangle{width: 30, height: 15} // 구조체 필드를 지정하여 값 초기화

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

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

var rect1 Rectangle // 구조체 인스턴스 생성
var rect2 *Rectangle = new(Rectangle) // 구조체 포인터 선언 후 메모리 할당

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

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

fmt.Println 함수로 구조체 인스턴스나 포인터를 출력해보면 필드의 내용이 그대로 출력됩니다. 이때 구조체 인스턴스는 { } 안에 값이 출력됩니다. 그리고 구조체 포인터는 { } 앞에 메모리 주소를 뜻하는 &가 붙습니다(레퍼런스).


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

2015-06-01