const char* str와 char* const str는 둘 다 char* 포인터를 사용하는데,
const의 위치에 따라 무엇이 상수(constant) 인지가 달라집니다.
1. const char* str
const char* str:
"포인터가 가리키는 데이터(char)가 상수"
즉, 값을 바꿀 수 없습니다.
- 뜻: str은 char를 가리키는 포인터이고, 가리키는 char 값은 바꿀 수 없습니다.
- 가리키는 값이 상수입니다.

- 사용 예: str이 읽기 전용 문자열을 가리키도록 하고 싶을 때
2. char* const str
char* const str:
"포인터 자체가 상수"
어디를 가리키는지는 못 바꿉니다.
- 뜻: str은 char를 가리키는 포인터이고, 포인터 자체는 바꿀 수 없습니다.
- 포인터가 상수입니다.

- 사용 예: str이 항상 같은 메모리 위치를 가리키게 하고 싶을 때
선언 의미
| const char* str | 가리키는 값이 상수 | 포인터 이동 O, 값 수정 X |
| char* const str | 포인터 자체가 상수 | 포인터 이동 X, 값 수정 O |
| const char* str | char는 const, 포인터는 변경 가능 | 데이터(read-only): *str 변경 X, str 변경 O |
| char* const str | 포인터는 const, char는 변경 가능 | 주소 고정: *str 변경 O , str 변경 X |
| const char* const str | 둘 다 const | *str 변경 X, str 변경 X |
보너스: const char* const str
- 포인터도 상수고, 가리키는 값도 상수

함수에서 const를 매개변수에 사용하는 이유는 안정성과 명확한 의도 전달을 위해서입니다.
간단히 요약하자면:
const를 매개변수에 쓰는 이유
1. 값이 변경되지 않음을 보장
- 함수 안에서 절대 바꾸지 않겠다는 약속입니다
- 실수로 값을 바꾸는 것을 컴파일 단계에서 막아줍니다.

-> msg는 오직 출력용일 뿐, 바꾸지 않겠다는 의도를 명확히 함.
2. 호출자(caller)에게 의도를 전달
- 이 함수는 매개변수를 "읽기 전용(read-only)" 으로 쓴다는 걸 알려줍니다.
- 즉, 원본 데이터를 보호하겠다는 뜻.
void processData(const int* data);
-> 호출하는 입장에서도 안심할 수 있음. 이 함수는 data를 변경하지 않습니다.
3. 참조 타입(const T&)에서는 성능 + 안정성
- 복사 비용 없이 값을 전달하면서, 수정은 막는 안전한 방식입니다.
void showName(const std::string& name);
- std::string을 복사하지 않고 전달하니까 성능이 좋습니다.
- const이기 때문에 함수 안에서 name 수정 못합니다. 따라서 안정성이 높습니다.
만약 const를 안 쓴다면?
- 함수 내부에서 실수로 매개변수를 바꿔버릴 수도 있습니다.
- 혹은 다른 사람이 코드를 봤을 때, 이 함수가 매개변수를 바꿀 수도 있다는 불안함이 생깁니다.
언제 const 쓰는 게 좋을까?
상황 const 사용 여부
| 포인터 매개변수 (읽기 전용 용도) | const char*, const int* 등 |
| 참조로 객체를 전달할 때 | const std::string& |
| 간단한 값 타입 (int, float 등) | 복사해도 부담 적으니 그냥 값 전달 |
'C++' 카테고리의 다른 글
| [C++] 연산자 오버로딩 복습 문제 (클래스부터 생성자, 오버로딩까지 구현해보자) (6) | 2025.08.04 |
|---|---|
| [C++] 2차원 배열 선언과 동시에 초기화 vs 선언된 배열 초기화 : 재초기화 오류 (0) | 2025.07.11 |
| [C++] 지역 변수(Local Variable) 이름(변수명)과 전역 변수(Global Variable) 이름(변수명)이 같을 경우: Shadowing에 대해서 (0) | 2025.07.11 |