Menu
Coddy logo textTech

Go의 포인터 기초

Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 107개 중 19번째.

포인터는 다른 변수의 메모리 주소를 저장하는 변수입니다. 값을 직접 보유하는 대신, 해당 값이 메모리에 위치한 주소를 보유합니다. 포인터는 Go의 기본이며 효율적인 데이터 조작을 위해 필수적입니다.

포인터를 생성하려면 & 연산자를 사용하여 변수의 주소를 가져오고, * 연산자를 사용하여 포인터 타입을 선언하거나 해당 주소의 값에 접근합니다.

x := 42
p := &x  // p는 x의 메모리 주소를 가집니다

fmt.Println(p)  // 0xc000018030 (메모리 주소)
fmt.Println(*p) // 42 (해당 주소의 값)

& 연산자는 "~의 주소"를 의미하며 포인터를 반환합니다. * 연산자는 포인터에 사용될 때 "~에 있는 값"을 의미하며 역참조(dereferencing)라고 불립니다. 또한 포인터를 통해 원래 값을 수정할 수도 있습니다.

x := 10
p := &x

*p = 25         // 포인터를 통해 값 변경
fmt.Println(x)  // 25 (원본 변수가 변경됨)

포인터 타입은 *T와 같이 작성하며, 여기서 T는 가리키는 대상의 타입입니다. int에 대한 포인터는 *int 타입을 가집니다.

var p *int      // int 포인터를 선언합니다
x := 100
p = &x          // p는 이제 x를 가리킵니다

포인터의 제로 값(zero value)은 nil이며, 이는 아무것도 가리키지 않음을 의미합니다. nil 포인터를 역참조하려고 시도하면 런타임 패닉(runtime panic)이 발생하므로, 사용하기 전에 항상 포인터가 초기화되었는지 확인하십시오.

challenge icon

챌린지

쉬움

메모리 주소를 통해 변수를 수정하는 포인터의 강력함을 보여주는 간단한 값 교환기(value swapper)를 만들어 보겠습니다.

코드는 두 개의 파일로 구성됩니다:

  • swap.go: 두 개의 *int 포인터를 매개변수로 받는 SwapValues라는 함수를 만듭니다. 이 함수는 포인터가 가리키는 값들을 서로 교환해야 합니다. 함수를 호출한 후에는 각 변수가 상대방의 원래 값을 가지고 있어야 합니다. 이 함수는 아무것도 반환하지 않으며, 포인터를 통해 직접 값을 수정합니다.
  • main.go: 입력으로부터 두 개의 정수를 읽어 변수에 저장한 다음, SwapValues 함수를 사용하여 값을 교환합니다. 변경 사항을 보여주기 위해 교환 전과 후의 두 값을 모두 출력합니다.

다음과 같은 입력이 제공됩니다:

  • Line 1: 첫 번째 정수
  • Line 2: 두 번째 정수

출력 형식:

Before: a=[first] b=[second]
After: a=[first] b=[second]

예를 들어, 1025가 주어지면 출력은 다음과 같아야 합니다:

Before: a=10 b=25
After: a=25 b=10

변수를 함수에 전달할 때는 & 연산자를 사용하고, 함수 내부에서 실제 값에 접근하고 수정할 때는 * 연산자를 사용해야 함을 기억하세요.

치트 시트

포인터(pointer)는 다른 변수의 메모리 주소를 저장하는 변수입니다. 변수의 주소를 얻으려면 & 연산자를 사용하고, 포인터 타입을 선언하거나 해당 주소의 값에 접근하려면 * 연산자를 사용합니다.

x := 42
p := &x  // p는 x의 메모리 주소를 가집니다

fmt.Println(p)  // 0xc000018030 (메모리 주소)
fmt.Println(*p) // 42 (해당 주소의 값)

& 연산자는 "~의 주소"를 의미하며 포인터를 반환합니다. * 연산자가 포인터에 사용될 때는 "~의 값"을 의미하며 이를 역참조(dereferencing)라고 합니다.

포인터를 통해 원래의 값을 수정할 수 있습니다:

x := 10
p := &x

*p = 25         // 포인터를 통해 값을 변경
fmt.Println(x)  // 25 (원래 변수가 변경됨)

포인터 타입은 *T와 같이 작성하며, 여기서 T는 가리키는 대상의 타입입니다:

var p *int      // int를 가리키는 포인터를 선언
x := 100
p = &x          // p는 이제 x를 가리킵니다

포인터의 제로 값(zero value)은 nil입니다. nil 포인터를 역참조하려고 시도하면 런타임 패닉(runtime panic)이 발생합니다.

직접 해보기

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)
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨