Go 언어

본문 바로가기
사이트 내 전체검색


Go 언어
Go 언어

1. 구조체 사용하기

페이지 정보

작성자 관리자 댓글 0건 조회 3,033회 작성일 19-03-13 19:42

본문

1. 구조체 사용하기

구조체는 여러 변수를 담을 수 있다.


type 구조체명 struct {}


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


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


다음은 사각형을 나타내는구조체이다.


package main

import "fmt"

type Rectangle struct {

 width  int
 height int

}

func main() {

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

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

 fmt.Println(rect1)
 fmt.Println(rect2)

}


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


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


package main

import "fmt"

type Rectangle struct {

 width  int
 height int

}

func main() {

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

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

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

 fmt.Println(rect1)
 fmt.Println(rect2)
 fmt.Println(rect3)

}


구조체 인스턴스의 필드에 접근할 때는 .(점)을 사용한다.


package main

import "fmt"

type Rectangle struct {

 width  int
 height int

}

func main() {

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

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

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

}



1. 구조체 생성자 패턴 활용하기


new 함수로 구조체의 메모리를할당하는 동시에 값을 초기화하는 방법은 없다.

하지만 다음과 같은 패턴을 사용하여 다른언어의 생성자를 흉내낼 수 있다.


package main

import "fmt"

type Rectangle struct {

 width  int
 height int

}

func NewRectangle(width, height int) *Rectangle {

 return &Rectangle{width, height} // 구조체 인스턴스를 생성한 뒤 포인터를 리턴

}

func main() {

 rect := NewRectangle(20, 10)

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

}


다음과 같은 방법도 같은 결과를 보여준다.



package main

import "fmt"

type Rectangle struct {

 width  int
 height int

}

func main() {

 rect := &Rectangle{20, 10} // 구조체를 초기화한 뒤 메모리 주소를 대입

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

} 



2. 함수에서 구조체 매개변수 사용하기


사각형의 넓이를 구하는 함수를 만들어보겠다.


package main

import "fmt"

type Rectangle struct {

 width  int
 height int

}

func rectangleArea(rect *Rectangle) int { // 매개변수로 구조체 포인터를 받음

 return rect.width * rect.height

}

func main() {

 rect := Rectangle{30, 30}

 area := rectangleArea(&rect) // 구조체의 포인터를 넘김

 fmt.Println(area) // 900

} 



보통 rectangleArea(rect *Rectangle)과 같이 함수의 매개변수에 구조체 포인터를 받는다.

값을 넘겨줄때도 rect 변수에 &를 붙여 주어 주소를 넘겨준다.



package main

import "fmt"

type Rectangle struct {

 width  int
 height int

}

func rectangleScaleA(rect *Rectangle, factor int) { // 매개변수로 구조체 포인터를 받음

 rect.width = rect.width * factor   // 포인터이므로 원래의 값이 변경됨
 rect.height = rect.height * factor // 포인터이므로 원래의 값이 변경됨

}

func rectangleScaleB(rect Rectangle, factor int) { // 매개변수로 구조체 인스턴스를 받음

 rect.width = rect.width * factor   // 값이 복사되었으므로 원래의 값에는 영향을 미치지 않음
 rect.height = rect.height * factor // 값이 복사되었으므로 원래의 값에는 영향을 미치지 않음

}

func main() {

 rect1 := Rectangle{30, 30}
 rectangleScaleA(&rect1, 10) // 구조체의 포인터를 넘김
 fmt.Println(rect1)          // {300 300}: rect1에 바뀐 값이 들어감

 rect2 := Rectangle{30, 30}
 rectangleScaleB(rect2, 10) // 구조체 인스턴스를 그대로 넘김
 fmt.Println(rect2)         // {30 30}: rect2는 값이 바뀌지 않음

}
 



댓글목록

등록된 댓글이 없습니다.


개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

TEL. 063-469-4551 FAX. 063-469-4560 전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과

Copyright © www.leelab.co.kr. All rights reserved.