Menu
Coddy logo textTech

포인터와 참조

Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 104개 중 13번째.

이제 스택 및 힙 메모리를 이해했으니, 메모리 위치를 직접 다룰 수 있게 해 주는 도구인 pointersreferences를 살펴보겠습니다.

pointer는 다른 변수의 memory address를 저장합니다. *로 선언하고 &를 사용하여 address를 가져옵니다.

int value = 42;
int* ptr = &value;    // ptr은 value의 주소를 보유합니다

std::cout << ptr;     // 메모리 주소를 출력합니다
std::cout << *ptr;    // 역참조: 42를 출력합니다

reference는 기존 변수의 alias입니다. 한 번 연결되면 항상 해당 변수를 참조합니다. &를 사용하여 선언합니다.

int value = 42;
int& ref = value;     // ref는 value의 별칭입니다

ref = 100;            // value를 100으로 변경합니다
std::cout << value;   // 100을 출력합니다

주요 차이점:

Pointers참조
null일 수 있음초기화해야 함
재할당할 수 있음다시 바인딩할 수 없음
*를 사용하여 값에 접근값에 directly 접근
아무것도 point하지 않을 수 있음항상 유효함

둘 다 객체를 복사하지 않고 함수에 효율적으로 전달하고, 힙에 할당된 메모리로 작업하는 데 필수적입니다. 참조는 더 안전하고 간단한 반면, 포인터는 재할당하거나 null인지 확인해야 할 때 더 유연합니다.

challenge icon

챌린지

쉬움

데이터를 수정할 때 pointers와 references가 어떻게 다르게 작동하는지 보여 주는 간단한 value manipulation system을 만들어 보겠습니다.

코드를 정리하기 위해 두 개의 파일을 만듭니다:

  • ValueOps.h: 정수 값을 서로 다른 방식으로 수정하는 세 개의 함수를 Define합니다:
    • doubleByPointer(int* ptr): pointer를 takes하고 pointer가 가리키는 값을 두 배로 만듭니다
    • tripleByReference(int& ref): reference를 takes하고 값을 세 배로 만듭니다
    • swapValues(int* a, int* b): 두 개의 pointer를 takes하고 pointer가 가리키는 값들을 서로 교환합니다
  • main.cpp: input에서 두 개의 정수를 Read한 다음, pointers와 references를 모두 사용해 봅니다:
    • Original 값을 Print합니다: "Original: <first> <second>"
    • 첫 번째 값에 doubleByPointer를 사용한 다음 Print합니다: "After double: <first>"
    • 두 번째 값에 tripleByReference를 사용한 다음 Print합니다: "After triple: <second>"
    • swapValues를 사용해 두 값을 교환한 다음 Print합니다: "After swap: <first> <second>"

pointers를 사용해 함수를 호출할 때는 address-of 연산자(&)를 사용해 변수의 address를 pass해야 한다는 점을 기억하세요. References는 더 자연스럽게 작동하므로 변수를 directly pass하면 됩니다.

#include "ValueOps.h"를 using하여 main.cpp에 header file을 Include하세요.

직접 해보기

#include <iostream>
#include "ValueOps.h"
using namespace std;

int main() {
    // 입력에서 두 정수를 읽기
    int first, second;
    cin >> first;
    cin >> second;
    
    // 원래 값 출력
    cout << "Original: " << first << " " << second << endl;
    
    // TODO: 첫 번째 값에 doubleByPointer 사용 (&를 사용하여 주소 전달)
    
    // TODO: 두 배 후 출력
    
    // TODO: 두 번째 값에 tripleByReference 사용 (변수를 직접 전달)
    
    // TODO: 세 배 후 출력
    
    // TODO: swapValues를 사용하여 두 값 교환 (&를 사용하여 주소 전달)
    
    // TODO: 교환 후 출력
    
    return 0;
}
quiz icon실력 점검

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

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

직접 연습해 보세요: 온라인 C++ 컴파일러