저작권 안내
- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
구조체 사용하기
이재홍 http://www.pyrasis.com 2014.12.17 ~ 2015.02.07
함수에서 구조체 매개변수 사용하기
간단하게 사각형의 넓이를 구하는 함수를 만들어보겠습니다.
func rectangleArea(rect *Rectangle) int { // 매개변수로 구조체 포인터를 받음
return rect.width * rect.height
}
func main() {
rect := Rectangle{30, 30}
area := rectangleArea(&rect) // 구조체의 포인터를 넘김
fmt.Println(area) // 900
}
실행 결과
900
보통 rectangleArea(rect *Rectangle)과 같이 함수의 매개변수에 구조체 포인터를 받습니다. 그리고 값을 넘겨줄 때도 rect 변수에 &를 붙여 주소를 넘겨줍니다.
함수의 매개변수에 구조체 포인터가 아닌 일반적인 형태(구조체 인스턴스)로 넘겨주면 값이 모두 복사되므로 주의합니다.
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는 값이 바뀌지 않음
}
실행 결과
{300 300}
{30 30}
rectangleScaleA는 구조체 포인터를 매개변수로 받았기 때문에 원래 값이 변경되지만, rectangleScaleB는 구조체를 그대로 받으면서 값이 복사되었으므로 원래의 값에는 영향을 미치지 않습니다.
저작권 안내
이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.- 블로그, 게시판 등에 퍼가는 것을 금지합니다.
- 비공개 포스트에 퍼가는 것을 금지합니다.
- 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
- 링크 및 SNS 공유는 허용합니다.