#define을 사용하여 상수를 이름으로 나타내면 그 상수가 무엇을 의미하는 것인지 직관적으로 알 수 있다.
#define MONTHS 12
책에는 써있지 않지만, 대문자로 쓰는게 일반적인 관행이다. #define보다 더 좋은 상수 선언이 있다. 이것은 const 키워드이다.
기본적인 const 키워드는 변수를 상수화 시키는 것이다. 상수란 수식에서 변하지 않는 값을 의미한다. 즉, const 키워드가 붙은 변수는 값이 변경될 수 없으므로, 선언과 초기화를 동시에 해야한다. 선언과 초기화를 동시에 한다는 점에서 #define과 비슷하다고 느낄 수 있다.
#define MONTHS 12
const int MONTHS = 12;
#define보다 const를 사용하는 것이 더 좋다. 그 이유는 아래와 같다.
- 데이터형을 명시적으로 지정할 수 있다.
- C++의 활동 범위 규칙(scoping rules)에 의해 그 정의를 특정 함수나 파일에서만 사용할 수 있도록 제한할 수 있다.
- 배열이나 구조체와 같은 복잡한 데이터형에도 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의 변수여야 한다. 그러므로 함수를 호출한 쪽에서는 값을 변경할 수 없단 말이다.
'서적 정리 > 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 |
댓글