검색결과 리스트
글
const 위치에 따른 구문의 의미
C/C++ 기본 구문
- const 위치에 따른 구문의 의미
- by Tapitolife
지식iN에 이런 질문이 올라 왔더군요.
예제보니까 parameter에 |
원문 출처: http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=124932419
본디 상수 특성을 지정하는 const키워드는 그 놓인 위치에 따라 약간의 미묘한 의미 차이를
갖는데요…… 물론 이 질문에 제가 답변을 올렸고 채택이 되었습니다. ㅎㅎ
그러고 보니 저도 가끔 이 const 키워드가 들어갔을 때 그 의미를 혼동하는 경우가 있는데요.
이번 지식iN 답변을 계기로 저도 한번 제대로 const 키워드가 들어간 구문의 정확한 의미를
정리해 보렵니다.
const는 여러 곳에 놓일 수 있습니다. 그 때문에 의미가 혼동되기도 쉽죠.
변수 선언 시: [const] 자료형 [const] [포인터] [const] 변수명;
함수 선언 시: [const] 자료형 [const] [포인터] 함수명(매개변수…) [const] { }
뭐… 이렇게만 놓고 보면 무슨 말인지 감이 안 잡히니까,
예를 들어가면서 이야기 해 보기로 하죠. const는 어느 곳에 붙든 결국 원칙은 이겁니다.
"const가 붙으면 값 변경이 안 된다."
그렇다면 값 변경이 안 되는 경우(어디서 값 변경이 안 되는가?)를 찾는 것이 관건입니다.
질문 원문에서 소개 된 3가지 경우를 예로 들어 보죠.
1번. const int ** a,
2번. int * const * a,
3번. int ** const a
이 3가지의 자료형이 있습니다.
const가 붙는 위치가 조금씩 다른데요, 여러분은 이 차이를 명확히 구분하실 수 있습니까?
(만일 그렇다면 진정한 C언어 고수이십니다. ㅎㅎ)
위의 3가지 형식을 괄호로 쳐 본다면 다음과 같이 묶을 수 있습니다.
1번. (const int) ** a,
2번. (int * const) * a,
3번. (int **) const a
1번은 const int 형에 대한 이중 포인터입니다. 즉 int형 상수에 대한 이중 포인터이죠.
쉽게 나타낸다면 이런 과정으로 만들어지는 타입입니다.
const int x = 10;
const int * y = &x; // &x의 자료형이 const int** 형이라 보면 됩니다.
여기서 알맹이 값인 a = 10이라는 값이 상수처리 되는 거죠.
달리 말하면,
a = const int ** 형 (값 변경 O)
*a = const int * 형 (값 변경 O)
**a = const int 형 (값 변경 X)
void main() |
2번은 int * 형이 갖는 주소 값을 상수로 정했습니다.
즉 이런 과정을 통해 만들어지는 형식인 거죠.
int x = 10;
int * const y = &x; // &x의 자료형이 int * const * 형이라 보면 됩니다.
여기서 알맹이 값인 a = 10은 그냥 막 수정 가능하고, a의 주소를 갖고 있는 b가 상수인 거죠.
달리 말하면,
a = int * const * 형 (값 변경 O)
*a = int * const 형 (값 변경 X)
**a = int 형 (값 변경 O)
void main() |
3번은 int ** 형 자체가 상수형으로 지정되었습니다.
즉 이런 과정을 통해 만들어지는 형식인 거죠
int x = 10;
int * y = &x;
int ** const z = &y;
달리 말하면
a = int ** const 형 (값 변경 X)
*a = int * 형 (값 변경 O)
**a = int 형 (값 변경 O)
지식 iN에도 설명을 올렸지만 여기서 다시 한번 표로 정리를 해 보면 아래와 같습니다.
선언된 형식 | const int ** a | int * const * a | int ** const a |
a의 형식 | const int ** 형 | int * const * 형 | int ** const 형 |
*a의 형식 | const int * 형 | int * const 형 | int * 형 |
**a의 형식 | const int 형 | int 형 | int 형 |
const와 애스터리스크가 연달아 나오는 경우라면, 뒤에서부터 애스터리스크를
지워 나가는 방식을 추천해드리고 싶네요. 지워 나가다가 const가 걸리는 곳이
상수 취급 되는 곳이니까요.
strcpy 같은 함수를 보면 두 번째 인수가 const char * 형으로 되어 있을 겁니다.
풀이해 보면, 그 문자열의 주소는 경우에 따라 가변적이지만
문자열이 갖는 자체의 내용만큼은 변함이 없다. 이런 뜻입니다.
그럼 한번 테스트 해 볼까요?
아래 나온 코드들 간단한 거니까 직접 실습 해 보세요.
소스 A1
void test(const char * str) |
소스 A2
void test(const char * const str) |
소스 B1
void test(char * str) |
소스 B2
void test(const char * str) |
소스 A1는 컴파일부터 실행까지 잘 되지만, 소스 A2는 컴파일 오류가 납니다.
A2에서는 str의 주소 자체가 상수이기 때문에 이후 변경될 수 없어서 생기는 오류입니다.
B1과 B2도 같은 맥락입니다.
그럼 이제 다 되었는가? 아닙니다. 하나 더 있습니다.
지금까지는 변수 선언을 할 때만 const가 붙었지만, C++에서 멤버 함수를 선언할 때
아예 함수에다가 const를 붙일 수도 있습니다.
class Point |
이 때 함수에 붙이는 const의 의미는 무엇이냐 하면…
이 함수는 멤버 변수가 갖는 값을 가져다 쓸 수는 있어도 변경은 할 수 없다.
이런 의미를 갖습니다.
이런 예제를 보여드리면 될까요?
class Point |
출처: http://tapito.tistory.com/31
'♪C++ > STL' 카테고리의 다른 글
생성자에서 콜론(:)은 왜 쓰는 건가요? (0) | 2018.08.07 |
---|