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는 값이 바뀌지 않음
}
댓글목록
등록된 댓글이 없습니다.