이미 앞에서 상수와 변수를 말할때 const라는 명령어를 적었던것으로 기억한다.
const는 변수를 상수화 시키는것이라고 설명했을텐데 크게 다르진 않다.
다만 단어를 바꿔 변수를 "읽기 전용" 으로 바꾼다고 다시 설명하겠다.
읽기 전용이란 값을 변경할 수 없다는것인데. 이것이 상수와 동일하기 때문이다. 아니 애초에 상수가 읽기전용이니까 말을 바꾼게 아닌건가??
어찌되었든 const가 적혀있는것은 값을 변경할 수 없다.
그리고 const는 클래스의 멤버로도 들어올 수 있다.
다음의 경우를 보자.
#pragma once
class cTemp {
private :
const int m_iTemp;
public :
cTemp(int iTemp) { m_iTemp = iTemp; }
};
클래스 cTemp는 상수화된 int m_iTemp를 가지고 있다.
그리고 매개변수 있는 생성자를 통해 m_iTemp를 초기화하려고 한다. 생성자는 초기화하는 용도랬으니 괜찮을것같지만 이건 불가능하다
이유는 단순하다. 생성자도 대입을 통한 초기화이기 때문이다.
즉 이미 m_iTemp는 생성자가 실행되기전에 메모리상에 저장이 되었고, 상수이기때문에 값의 변경이 불가능해진다.
그러면 m_iTemp의 값을 정할수는 없는것인가??
두가지 방법이 있다.
1. 생성자에서 바로 초기화하기
#pragma once
class cTemp {
private :
const int m_iTemp;
public :
cTemp(int iTemp) : m_iTemp(iTemp) {}
};
이렇게 생성자 이후 바로 콜론을 붙이고 멤버변수(초기화할 값) 을 하게되면 그 값으로 초기화 된 이후 상수화되어 고정된다.
이것을 initializer라고 부른다.
2. 클래스에 선언할때 초기화하기
#pragma once
class cTemp {
private :
const int m_iTemp=100;
};
이렇게 클래스 내부에서 멤버변수를 선언할때부터 초기화하면 그 값으로 상수화된다.
다만 이 방법은 두가지 문제가 있다
첫째는 위의 방법처럼 매개변수를 받을 수 없다는 것, 즉 상황에 따를 초기화값의 변화가 불가능하다는것이다.
둘째는 이 방법 자체가 최근에 나온 기술이기 때문에 컴파일러의 버전에따라 불가능할 수도 있다는것이다.
상수화된 멤버변수는 보았고 이번엔 멤버함수이다.
경우에따라 멤버변수의 값을 변경하지 않는 함수들이 있을것이다.
#pragma once
class cTemp {
private :
int m_iTemp;
public :
void print() { cout << m_iTemp << endl; }
};
여기에 있는 print함수는 그 기능이 m_iTemp를 출력하는것이지 그 값을 변경시키진 않는다. 이런 함수의 경우 반환값 뒤에 const를 붙여 상수화 즉 읽기 전용으로 변경할 수 있다.
#pragma once
class cTemp {
private :
int m_iTemp;
public :
void const print() { cout << m_iTemp << endl; }
};
이럴 경우 print함수 내에서는 멤버변수의 값을 변경시킬 수 없게 된다.
그리고 같은 상수형 멤버함수를 호출하는것은 가능하지만 상수형이 아닌 일반 함수의 경우 호출이 불가능하다.( 일반 함수 내에서 멤버변수를 수정하는 기능이 없더라도 컴파일러는 그것을 모르기 때문에 const가 아닌 함수들은 전부 불러올 수 없다.)
그리고 같은 이름과 같은 매개변수를 가지더라도 const가 붙은것과 붙지않은것은 공존할 수 있다.
그 경우 애초에 클래스가 const로 선언되었다면 const함수가, 그렇지 않다면 일반 함수가 호출된다.
'c언어' 카테고리의 다른 글
복사 생성자 +깊은복사와 얕은복사 (0) | 2023.02.14 |
---|---|
static에 대해서 (0) | 2023.02.14 |
클래스 대입 (0) | 2023.02.13 |
상호참조와 전방선언 (0) | 2023.02.13 |
클래스 사용 예시 (0) | 2023.02.10 |