본문 바로가기
서적 정리/C++ 기초 플러스

9.const 제한자

by 민돌이2 2022. 7. 25.

#define을 사용하여 상수를 이름으로 나타내면 그 상수가 무엇을 의미하는 것인지 직관적으로 알 수 있다.

#define MONTHS 12

 

책에는 써있지 않지만, 대문자로 쓰는게 일반적인 관행이다. #define보다 더 좋은 상수 선언이 있다. 이것은 const 키워드이다.

 

기본적인 const 키워드는 변수를 상수화 시키는 것이다. 상수란 수식에서 변하지 않는 값을 의미한다. 즉, const 키워드가 붙은 변수는 값이 변경될 수 없으므로, 선언과 초기화를 동시에 해야한다. 선언과 초기화를 동시에 한다는 점에서  #define과 비슷하다고 느낄 수 있다.

#define MONTHS 12
const int MONTHS = 12;

 

#define보다 const를 사용하는 것이 더 좋다. 그 이유는 아래와 같다.

  1. 데이터형을 명시적으로 지정할 수 있다.
  2. C++의 활동 범위 규칙(scoping rules)에 의해 그 정의를 특정 함수나 파일에서만 사용할 수 있도록 제한할 수 있다.
  3. 배열이나 구조체와 같은 복잡한 데이터형에도 const를 사용할 수 있다.

데이터를 명시적으로 지정할 수 있다는 장점이 와닿지 않을 수 있다. 이는 예상치 못한 에러를 방지할 수 있다는 의미이다.

예를 들어 위 코드에서 MONTHS 12는 정수형으로 받아들일 수 있다. 하지만 float형에 사용할 경우 사용자체는 할 수 있지만, int형에서 float형으로 캐스팅이 되던 예상치 못한 일이 발생할 수 있다.

 

활동 범위 규칙제한이란 #define의 경우 다른 파일에서 포함이 되어 있다면 #define의 변수를 사용할 수 있다. const의 경우 우 전역변수가 아니라면 다른 파일에서의 사용을 제한할 수 있다.

 

 


const의 위치에 따라 의미가 다르다.

  • 변수
  • 함수

변수

포인터가 아닌 변수의 자료형 앞

변수의 값이 변경 될 수 없음을 의미한다.

const int MONTHS = 12;

MONTHS = 10; //에러

 

포인터 변수의 자료형 앞

포인터 변수의 값이 변경될 수 없음을 의미한다. 변수의 주소는 바뀔 수 있다.

int num = 12;
int num2 = 10;
const int* MONTHS = #

MONTHS = &num2; //가능
*MONTHS = num2; //에러

 

포인터 변수의 자료형 뒤

포인터 변수의 주소가 변경될 수 없음을 의미한다. 변수의 값은 바뀔 수 있다.

MONTHS = &num2; //에러
*MONTHS = num2; //가능

 


함수

매개변수

함수 안에서 매개변수의 값을 변경할 수 없음을 의미한다.

int ClassA::Play(const char*s);

 

멤버 함수

함수안에서 멤버 변수의 값을 변경할 수 없음을 의미한다. 즉, 함수 내부에서 멤버 변수의 값을 읽기만 가능하다.

int ClassA::Play(char* s) const;

 

리턴

함수의 리턴값이 포인터 일 때, 함수를 호출한 쪽에서 반환된 값을 수정할 수 없다.

const int ClassA::Play(char* s);

const int a = Class::Play('a');

이해하기 어려울 수 있는데, 리턴값이 const임으로 받아들이는 쪽도 const의 변수여야 한다. 그러므로 함수를 호출한 쪽에서는 값을 변경할 수 없단 말이다.

728x90

'서적 정리 > C++ 기초 플러스' 카테고리의 다른 글

13.문자열(string)  (0) 2022.07.26
12.배열(array)  (0) 2022.07.26
11.C++ 산술 연산자  (0) 2022.07.26
10.부동 소수점수(floating point)  (0) 2022.07.25
8.간단한 변수  (0) 2022.07.22
7.함수(function)  (0) 2022.07.20
6.C++의 기타 구문  (0) 2022.07.20
5.C++ 구문  (0) 2022.07.20

댓글