티스토리 뷰
C++ 문법중에 const라는 키워드가 있다. 무언가를 상수화시킬 때 사용하는 키워드인데 공부하는 단계에서는 딱히 어떤 변수를 상수화시킬 필요성이 없기 때문에 잘 사용하지 않는 키워드이고 실제로 어떤 규모가 큰 제품을 만드는게 아닌 이상 어떤 변수를 변경시면 안되는지 알고있기 때문에 더욱 안쓰고있었다.
하지만 오픈소스 코드나 엔진 등을 열어보니 const를 적지않게 사용하는것을 볼 수 있었는데, 이번 기회에 명확하게 다시 기능을 배우고 넘어가보도록 하자.
일단 이것만 기억하자.
const는 자신과 가장 가까운 것을 상수화한다.
일반 변수
변수를 상수화한다. const로 선언된 변수는 그 값을 변경할 수 없다.
const int A = 10;
// same expression : int const A = 10;
A = 30; // error
값을 변경할 수 없다.
포인터 변수
class Coffee
{
public:
Coffee()
{
SugarCount = 0;
bTakeout = false;
}
void AddSugar()
{
SugarCount++;
}
const int& GetSugarCount()
{
return SugarCount;
}
booIsTakeout() const
{
return bTakeout;
}
private:
int SugarCount;
bool bTakeout;
};
예시를 들기위해 간단하게 만들어본 클래스의 구성이다.
포인터 왼쪽에 const선언을 할 경우, 가리키는 주소는 변경할 수 있지만 해당 주소에 있는 값을 변경할 수 없다. class instance일 경우 const로 선언된 함수와 변수에만 접근할 수 있다.
포인터의 오른쪽에 const선언을 할 경우, 포인터 변수를 상수화하는 것이므로 다른 주소를 가리킬 수 없다. 하지만 가리키고있는 주소에 있는 값은 변경할 수 있다.
const Coffee* A = new Coffee();
// same expression : Coffee const * A = new Coffee();
Coffee* const B = new Coffee();
A->AddSugar(); // error
B->AddSugar(); // success
A->IsTakeout(); // success
B = new Coffee(); // error
Coffee::AddSuger() 함수는 내부 값을 변경시키는 함수이기 때문에 const 포인터 변수인 A가 접근할 수 없다. 하지만 IsTakeout() 함수는 const로 선언되어있기 때문에 호출할 수 있다. B는 초기화된 값만 가리킬 수 있기 때문에 AddSugar()는 호출 가능하지만 다른 주소를 가리킬 수 없다.
함수
매개변수
위에서 설명한 변수/포인터변수에 사용과 동일한 기능을 한다.
맴버함수
bool Coffee::IsTakeout() const
{
SugarCount = 3; // error
return bTakeout;
}
위 함수는 const로 선언되어있기 때문에 맴버변수의 값을 변경할 수 없다. 또한 이러한 규칙 덕분에 const Coffee* 포인터로도 접근할 수 있다.
반환값
일반 변수일경우 사용하지 않을 때와 다른점은 크게 없다. 애초에 반환값 포인터나 레퍼런스가 아니라면 읽기밖에 못하기 때문에 const int Foo() 같은 함수는 int Foo()와 다른점은 없다.
대신 레퍼런스를 반환할 때 캡슐화를 헤치지 않으면서 값의 복사가 일어나지 않게 성능을 향상시킬 수 있다.
const int& Coffee::GetSugarCount()
{
return SugarCount;
}
private로 선언된 SugarCount에 대해 캡슐화도 유지하면서 값의 복사가 일어나지 않게 만들 수 있다. int의 경우 크기가 작기때문에 크게 의미가 없지만 구조체나 크기가 큰 자료형을 복사하면 비용이 발생하기 때문에 레퍼런스로 반환하여 최적화할 수 있다.
결론
const의 사용은 순전히 작성자의 의도에 달려있다. 사용하지 않는다고 틀린 문법은 아니지만 사용할 경우 컴파일 단계에서 오류를 검출할 수 있게 됨으로써 프로그램이 더욱 견고해진다.
'Programming > C++' 카테고리의 다른 글
C++ - 스마트 포인터(smart pointer) (2) | 2019.03.29 |
---|---|
C++ - 타입 캐스팅 (0) | 2019.03.04 |
C++ - 클래스 관계 용어 정리 (0) | 2018.03.02 |
C++ - 메모리 해제 (0) | 2017.12.30 |
C++ - 메모리 생성 (0) | 2017.12.30 |
- Total
- Today
- Yesterday
- 알고리즘
- ue4
- swift
- mongoDB
- game
- SHADER
- rxswift
- C
- DesignPattern
- JSP
- 운영체제
- C++
- C/C++
- database
- Git
- 수학
- winsock
- 드라마
- Spring
- SOCKET
- 데이터베이스
- 국내여행
- OS
- scala
- SwiftUI
- Cocos2d-x
- machine learing
- 자료구조
- Java
- ios
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |