1. const와 관련해서 아직 못다한 이야기
const 객체와 const 객체의 특성들
다음과 같이 변수를 상수화 하듯이,
const int num=10; |
다음과 같이 객체도 상수화할 수 있다.
const SoSimple sim(20); |
그리고 이렇게 객체에 const 선언이 붙게 되면, 이 객체를 대상으로는 const 멤버함수만 호출이 가능하다.
이는 객체의 const 선언이 다음의 의미를 갖기 때문이다.
"이 객체의 데이터 변경을 허용하지 않겠다!"
때문에 const 멤버함수의 호출만 허용하는 것이다.
물론 const로 선언되지 않은 함수 중에도 데이터를 변경하지 않는 함수가 있을 수 있다.
하지만 변경시킬 능력이 있는 함수는 아예 호출을 허용하지 않는 것이다.
멤버변수에 저장된 값을 수정하지 않는 함수는 가급적 const로 선언해서,
const 객체에서도 호출이 가능하도록 할 필요가 있다.
const와 함수 오버로딩
함수의 오버로딩이 성립하려면 매개변수의 수나 자료형이 달라야 한다.
다음과 같이 const의 선언유무도 함수 오버로딩의 조건에 해당이 된다.
void SimpleFunc(){.....} void SimpleFunc() const {.....} |
2. 클래스와 함수에 대한 friend 선언
클래스 friend 선언
C++의 friend 선언에 대해 정리해보자
- A 클래스가 B 클래스를 대상으로 friend 선언을 하면, B 클래스는 A 클래스의 private 멤버에 직접 접근이 가능하다. - 단, A 클래스도 B 클래스의 private 멤버에 직접 접근이 가능하려면, B 클래스가 A 클래스를 대상으로 friend 선언을 해줘야 한다. |
이렇듯, friend 선언은 private 멤버의 접근을 허용하는 선언이다.
friend 선언은 언제?
friend 선언은 객체지향의 대명사 중 하나인 '정보은닉'을 무너뜨리는 문법이기 때문에 제법 논란이 되었다.
friend 선언과 관련해서 다음 사실은 확실히 말할 수 있다.
"friend 선언은 지나치면 아주 위험할 수 있습니다. friend 선언은 필요한 상황에서 극히 소극적으로 사용해야 합니다."
friend 선언이 좋은 약으로 사용되는 상황은, 후에 연산자 오버로딩을 공부하면서 볼 수 있을 것이다.
함수의 friend 선언
전역함수를 대상으로도, 클래스의 멤버함수를 대상으로도 friend 선언이 가능하다.
물론 friend로 선언된 함수는 자신이 선언된 클래스의 private 영역에 접근이 가능하다.
3. C++에서의 static
C언어에서의 static은 C++에서도 그대로 통용된다.
그러나 C++에서는 멤버변수와 멤버함수에 static 선언을 추가할 수 있다.
C언어에서 이야기한 static
C언어에서 공부한 static의 개념을 정리해보자.
- 전역 변수에 선언된 static의 의미 : 선언된 파일 내에서만 참조를 허용하겠다는 의미 - 함수 내에 선언된 static의 의미 : 한번만 초기화되고, 지역변수와 달리 함수를 빠져나가도 소멸되지 않는다. |
static 멤버변수(클래스 변수)
static 멤버변수는 '클래스 변수'라고도 한다.
일반적인 멤버변수와 달리 클래스당 하나씩만 생성되기 때문이다.
static 멤버변수의 또 다른 접근방법
사실 static 멤버변수는 어디서든 접근이 가능한 변수이다.
static 멤버가 private로 선언되면, 해당 클래스의 객체들만 접근이 가능하지만,
public으로 선언되면 클래스의 이름 또는 객체의 이름을 통해서 어디서든 접근이 가능하다.
public static 멤버에 접근할 때에는 첫 번째 문장에서 보이듯이 클래스의 이름을 이용해서 접근하는 것이 좋다.
static 멤버함수
static 멤버함수 역시 그 특성이 static 멤버변수와 동일하다.
따라서 위에서 설명한 다음 특성이 그대로 적용된다.
- 선언된 클래스의 모든 객체가 공유한다. - public으로 선언이 되면, 클래스의 이름을 이용해서 호출이 가능하다. - 객체의 멤버로 존재하는 것이 아니다. |
여기서 특히 주목할 것은객체의 멤버로 존재하지 않는다는 사실이다.
static 멤버함수 내에서는 static 멤버변수와 static 멤버함수만 호출이 가능하다.
그리고 이러한 특성을 지니는 static 멤버변수와 static 멤버함수를 잘 활용하면,
대부분의 경우에 있어서 전역변수와 전역함수를 대체할 수 있다.
키워드 mutable
이번에 설명하는 mutable이라는 키워드는 사용의 빈도수가 낮은,
아니 가급적 사용의 빈도수를 낮춰야 하는 키워드이다.
키워드 mutable의 의미를 살펴보자
"const 함수 내에서의 값의 변경을 예외적으로 허용한다."
- 윤성우저, 열혈강의 C++ 프로그래밍 中 -
'Programming Study > C++' 카테고리의 다른 글
상속과 다형성(Polymorphism) (0) | 2014.09.29 |
---|---|
상속(Inheritance)의 이해 (0) | 2014.09.27 |
복사 생성자(Copy Constructor) (0) | 2014.09.25 |
클래스의 완성 (0) | 2014.09.24 |
클래스의 기본 (0) | 2014.09.23 |