값 타입(Value Type)과 참조 타입(Reference Type)
데이터를 다루는 방식은 크게 값을 직접 저장하는 방식과 어딘가에 있는 데이터를 참조하는 방식으로 나눌 수 있다.
값 타입 (Value Type)
데이터 자체를 직접 저장하는 타입이다.
변수를 복사하면 데이터도 함께 복사된다.
예시
int a = 10;
int b = a;
메모리
a = 10
b = 10
b는 a의 값을 복사하여 별도의 데이터를 가진다.
값 변경
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
ref는 value의 별명(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 |