[Basic] 맴버변수의 상수, 정적 속성, 상수와 정적변수 동시적용 시, 상수 맴버 함수 정리

Program Lang./C++ 2017. 4. 26. 14:16

1. 목적

맴버변수나 맴버함수를 상수로 선언했을 때, 상수와 정적변수를 동시에 선언했을 때 동작이 나의 경우에는 잘 정리가 안되어서 여기에 정리한다. 


2. 맴버변수

1) 맴버변수가 상수속성만 가질 경우

- 각 객체는 생성자 호출 통해서 맴버변수를 초기화하고 다른 맴버 함수를 통해서 상수 속성을 가지는 맴버변수의 값을 바꿀 수 없다. 아래 첫번째 예제는 각 객체는 서로 다른 초기값으로 객체를 생성하엿다. 하지만 상수 맴버변수에 값을 설정하는 setDebugLevel() 함수의 구현부분은 주석처리 되어야지만 빌드 에러가 발생하지 않는다.



2) 맴버변수가 정적 속성만 가질 경우

- 각 객체는 해당 정적 변수에 대해서 모두 동일한 초기값을 가지며, 해당 정적 변수는 객체 생성전에 반드시 초기화되어야 한다. 따라서 생성자에 정적변수에 값을 설정하는 부분이 있는 1)번 예제는 모두 빌드 에러가 발생한다.

초기화 후에 다른 맴버 함수를 통해서 초기값은 변경가능하다. 1)번 예제와 차이점은 주석처리된 코드를 참조



3) 맴버변수가 상수와 정적 속성을 모두 가질 경우

- 각 객체는 동일한 초기값을 가지면서 이제 더이상 다른 맴버함수를 통해서 초기값을 변경할 수 없다. 아래 예제는 위의 예제 2)보다 더 많은 코드 부분을 주석처리해야지만 빌드에 성공할 수 있다. 즉 초기값을 변경하는 코드와 초기값에도 const라는 지시어가 들어가야 한다. 주석 부분 참조



3. 맴버함수 (상수속성의 맴버함수)

값을 변경하지 않는 맴버함수는 상수 속성을 주는 것을 권장하고 있다. 실제 이 부분은 Modern C++ 책에 잘 가이드되어 있다. 맴버함수의 상수 속성은 맴버함수의 Overloading의 기준이 됨으로 항상 상수와 비상수 맴버함수의 쌍을 가지는 것이 좋다. 아래 예처럼 객체가 상수 속성을 가지고 생성되면 상수 속성을 가지지 않는 맴버함수는 호출될 수 없다. 아래 주석 처리 부분 참조



4. 결론

const 속성을 가지는 맴버변수는 생성자에서 초기값을 전달할 수 있고, 이 그외의 맴버함수를 통해서 값 변경은 불가하다. 정적변수는 클래스에 속하는 변수로 초기화는 객체 생성전에 한번만 가능하고 맴버함수를 통해서 기존에 설정된 초기값을 변경할 수 있다. const와 static이 동시에 사용되면 각각 속성에서 제한된 속성이 모두 적용되는 형태이다. 상수 맴버함수는 객체가 상수속성을 가지고 생성되는 경우를 대비해서 값을 변경하지 않는 맴버함수는 상수 속성을 주는 것이 바람직하다. 

: