c++/기초

값 타입과 참조타입

코드망령 2026. 6. 8. 09:47

값 타입(Value Type)과 참조 타입(Reference Type)

데이터를 다루는 방식은 크게 값을 직접 저장하는 방식어딘가에 있는 데이터를 참조하는 방식으로 나눌 수 있다.


값 타입 (Value Type)

데이터 자체를 직접 저장하는 타입이다.

변수를 복사하면 데이터도 함께 복사된다.


예시

int a = 10;
int b = a;

메모리

a = 10
b = 10

ba의 값을 복사하여 별도의 데이터를 가진다.


값 변경

int a = 10;
int b = a;

b = 100;

결과

a = 10
b = 100

원본은 변경되지 않는다.


메모리 구조

┌──────┐
│ a=10 │
└──────┘

┌──────┐
│ b=10 │
└──────┘

서로 다른 메모리를 가진다.


대표적인 값 타입

char
short
int
long
long long
float
double
bool

또한 포인터가 없는 일반 구조체도 값 타입처럼 동작한다.

struct Player
{
    int HP;
};

값 전달 (Call by Value)

void Func(int x)
{
    x = 100;
}

int main()
{
    int num = 10;

    Func(num);

    std::cout << num;
}

결과

10

값이 복사되었기 때문에 원본은 변경되지 않는다.


참조 타입 (Reference Type)

데이터 자체를 저장하는 것이 아니라 데이터의 위치를 참조하는 타입이다.


참조 변수

int value = 10;

int& ref = value;

메모리 구조

ref ───► value
          │
          ▼
         10

refvalue의 별명(Alias)이다.


값 변경

int value = 10;

int& ref = value;

ref = 100;

결과

value = 100

원본이 변경된다.


참조 전달 (Call by Reference)

void Func(int& x)
{
    x = 100;
}

사용

int num = 10;

Func(num);

결과

100

원본 데이터가 변경된다.


포인터도 참조 개념을 사용한다

int value = 10;

int* ptr = &value;

메모리 구조

ptr ───► value
          │
          ▼
         10

값 변경

*ptr = 100;

결과

value = 100

원본 데이터가 변경된다.


값 타입과 참조 타입 비교

항목 값 타입 참조 타입
저장 내용 데이터 자체 데이터의 위치
복사 시 값 복사 같은 데이터 참조
원본 변경 불가능 가능
메모리 사용 별도 메모리 같은 메모리 공유
대표 예시 int, float, double 참조자(&), 포인터(*)

값 캡처와 참조 캡처 (람다)


값 캡처

int x = 10;

auto lambda = [x]()
{
    std::cout << x;
};

람다가 생성될 때 값이 복사된다.

x = 100;

해도

lambda();

결과

10

참조 캡처

int x = 10;

auto lambda = [&x]()
{
    x = 100;
};

실행 후

x = 100

원본이 변경된다.


얕은 복사와의 차이

값 타입과 참조 타입은 얕은 복사(Shallow Copy)와는 다른 개념이다.


값 복사

int a = 10;
int b = a;
a = 10
b = 10

서로 독립적이다.


얕은 복사

class Player
{
public:
    int* HP;
};
Player p2 = p1;
p1.HP ----+
          |
          v
        [100]
          ^
          |
p2.HP ----+

같은 메모리를 가리킨다.


정리

  • 값 타입은 데이터를 직접 저장한다.
  • 값을 복사하면 별도의 데이터가 생성된다.
  • 참조 타입은 데이터의 위치를 참조한다.
  • 참조 타입은 원본 데이터를 수정할 수 있다.
  • 참조자(&)와 포인터(*)는 참조 개념을 사용한다.
  • 값 전달(Call by Value)은 원본이 변경되지 않는다.
  • 참조 전달(Call by Reference)은 원본이 변경된다.
  • 람다의 [x]는 값 캡처, [&x]는 참조 캡처이다.
  • 값 타입/참조 타입과 얕은 복사/깊은 복사는 서로 다른 개념이다.

'c++ > 기초' 카테고리의 다른 글

동적할당  (0) 2026.06.08
const  (0) 2026.06.08
extern (외부 변수)  (0) 2026.06.05
분할 구조 (Header / Source File)  (0) 2026.06.05
nullptr  (0) 2026.06.05