Go의 포인터 기초
Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 107개 중 19번째.
pointer는 다른 variable의 memory address를 저장하는 variable입니다. 값을 직접 보유하는 대신, 해당 값이 memory에 존재하는 위치를 보유합니다. pointers는 Go의 기본 요소이며 효율적인 데이터 조작에 필수적입니다.
포인터를 만들려면 & operator를 사용하여 variable의 address를 가져오고, * operator를 사용하여 포인터 유형을 선언하거나 해당 address의 값을 access합니다.
x := 42
p := &x // p는 x의 메모리 주소를 보유합니다
fmt.Println(p) // 0xc000018030 (메모리 주소)
fmt.Println(*p) // 42 (해당 주소의 값)& operator는 "address of"를 의미하며 pointer를 반환합니다. * operator는 pointer에 사용될 때 "value at"을 의미하며 역참조라고 합니다. 또한 pointer를 통해 original 값을 modify할 수도 있습니다.
x := 10
p := &x
*p = 25 // 포인터를 통해 값 변경
fmt.Println(x) // 25 (원래 변수가 변경됨)포인터 타입은 가리키는 대상의 타입이 T일 때 *T로 작성합니다. int를 가리키는 포인터의 타입은 *int입니다.
var p *int // int에 대한 포인터를 선언합니다
x := 100
p = &x // p가 이제 x를 가리킵니다pointer의 제로 값은 nil이며, 이는 아무것도 가리키지 않는다는 의미입니다. nil pointer를 역참조하려고 하면 런타임 패닉이 발생하므로, 사용하기 전에 pointer가 초기화되었는지 항상 확인해야 합니다.
챌린지
쉬움메모리 주소를 통해 variables를 modify하는 pointers의 강력한 기능을 보여 주는 간단한 값 교환기를 만들어 보겠습니다.
코드를 두 파일로 구성합니다:
swap.go: 매개변수로 두 개의*intpointers를 takes하는 function을 만듭니다. 이 function은 이러한 pointers가 가리키는 values를 swap해야 하며, 이를 호출한 후 각 variable은 다른 variable의 original value를 holds해야 합니다. 이 function은 아무것도 반환하지 않습니다. pointers를 통해 values를 직접 modify합니다.main.go: input에서 두 개의 integers를 Read하여 variables에 저장한 다음,SwapValuesfunction을 사용하여 values를 교환합니다. change를 보여 주기 위해 swap 전과 후에 두 values를 모두 Print합니다.
다음 input이 제공됩니다:
- Line 1: first integer
- Line 2: second integer
출력 형식:
Before: a=[first] b=[second]
After: a=[first] b=[second]예를 들어 10과 25가 주어지면 출력은 다음과 같아야 합니다:
Before: a=10 b=25
After: a=25 b=10variables를 function에 전달할 때는 & operator를 사용하고, function 내부에서 실제 values에 access하고 modify할 때는 * operator를 사용해야 한다는 점을 Remember하세요.
직접 해보기
package main
import "fmt"
func main() {
// 입력에서 두 정수를 읽습니다
var a, b int
fmt.Scanln(&a)
fmt.Scanln(&b)
// 교환 전 값을 출력합니다
fmt.Printf("Before: a=%d b=%d\n", a, b)
// TODO: a와 b에 대한 포인터로 SwapValues 함수를 호출하세요
// 주소를 전달하려면 & 연산자를 사용해야 함을 기억하세요
// 교환 후 값을 출력합니다
fmt.Printf("After: a=%d b=%d\n", a, b)
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8에러 처리와 OOP
error 인터페이스사용자 정의 에러 타입에러 래핑 (fmt.Errorf)센티넬 에러errors.Is()와 errors.As()Panic, Defer, Recover요약 - 파일 파서직접 연습해 보세요: 온라인 Go 컴파일러