모든 내용은 [윤성우 저, "열혈 C++ 프로그래밍", 오렌지미디어] 를 기반으로 제 나름대로 이해하여 정리한 것입니다. 다소 부정확한 내용이 있을수도 있으니 이를 유념하고 봐주세요!
# 좋은 클래스의 조건
1. 정보은닉
2. 캡슐화
# 정보은닉
1) 멤버변수를 private 선언하고,
2) 멤버변수에 접근하는 멤버함수를 별도로 정의
=> 안전한 형태로 멤버변수의 접근을 유도
e.g.
Get() : private 멤버변수의 값을 얻게하는 함수
Set() : private 멤버변수의 값을 설정하는 함수
# 멤버함수의 const 선언은, "이 함수 내에서는 멤버변수에 저장된 값을 변경하지 않겠다." 라는 의미이다.
- const 선언을 한 멤버함수 내에서는 const 선언 함수만 호출 가능해진다.
- 이와 더불어, const 참조자를 대상으로도 const 선언 함수만 호출이 가능하다.
# 캡슐화의 범위를 결정하는 일은 어렵다. => 많은 경험이 필요하다.
# 생성자
1) 클래스의 이름과 멤버함수의 이름이 동일
2) 반환형이 선언되어 있지 않으며, 실제로 반환하지 않음
3) 객체 생성시 딱 한번만 호출됨
4) 함수 오버로딩이 가능
5) 매개변수에 디폴트값 설정이 가능
- 생성자 내에서 함수를 통해 초기화하는 경우도 있으며,
생성자를 정의하지 않으면 디폴트 생성자가 생성 및 호출된다.
- 디폴트 생성자 : "클래스명() {}" 형태의 멤버함수
# 객체의 생성과정
1) 메모리 공간의 할당
2) 멤버 이니셜라이저를 이용한 멤버변수(또는 객체)의 초기화(이 단계는 없을 수도 있음)
3) 생성자의 몸체부분 실행
- 2), 3)이 생성자의 호출과정이다.
# 멤버 이니셜라이저를 통해 멤버변수를 초기화하는 것이 가능하면, 이것이 더 선호된다.
1) 초기화의 대상을 명확히 인식 가능
2) 성능에 약간 이점 : 선언과 동시에 초기화가 이뤄지는 바이너리 코드가 생성됨
- 선언과 동시에 초기화가 이루어져야 하는 const 멤버변수도 멤버 이니셜라이저를 이용하면 초기화가 가능함
- const 멤버변수와 마찬가지로 참조자도 선언과 동시에 초기화가 이루어져야 하므로,
멤버 이니셜라이저를 이용하면 참조자도 멤버변수로 선언하고 초기화할 수 있음
# 객체가 되기 위해서는 메모리 공간 할당 이후에 생성자 호출까지 완료되어야만 한다.
- 디폴트 생성자의 형태 : "클래스명() {}"
- 디폴트 생성자는 생성자가 하나도 정의되어 있지 않을 때에만 자동으로 삽입된다.
- new 연산자를 이용한 객체 생성에도 동일하게 적용된다.
- 그러나, malloc 함수를 객체 생성에 이용하면 생성자는 호출되지 않는다.
(객체의 생성과정의 1단계인 "메모리 공간의 할당"만 이루어진다.)
# 객체 생성은 일반적으로 클래스 외부에서 진행되기 때문에 생성자는 public으로 선언되어야 하나,
클래스 내부에서만 객체 생성을 허용하려는 목적이라면 private으로 선언하기도 하기도 한다.
# 객체 소멸시 반드시 호출되는 것이 소멸자이다.
1) 클래스이름 앞에 '~'가 붙음 : "~클래스명 {...}" 의 형태
2. 반환형이 선언되어 있지 않으며, 실제로 반환하지 않음
3. 매개변수는 반드시 void형으로 선언되어야 하기 때문에 오버로딩도, 디폴트값 설정도 불가능
4. 소멸자를 정의하지 않으면 디폴트 소멸자가 자동으로 삽입됨
5. 소멸자는 대개 생성자에서 할당한 리소스 소멸에 사용함
e.g. 생성자에서 new로 동적할당했다면, 소멸자에서 delete로 해제
# 객체 배열
1) 배열을 선언하는 경우에도 생성자는 호출됨
2) 단, 배열의 선언과정에서는 호출할 생성자를 별도로 명시하지 못함
- 즉, 생성자에 인자를 전달하지 못하기에, 배열 생성시 객체의 디폴트 생성자가 호출됨
- 따라서, 반드시 디폴트 생성자가 정의되어 있어야 함
3) 배열 선언 이후에 각각의 요소를 원하는 값으로 초기화시키길 바란다면,
일일히 초기화 과정을 별도로 거쳐야만 함
4) 배열 소멸시에도 그 배열을 구성하는 객체의 소멸자가 호출됨
5) 객체 포인터배열도 객체 배열과 크게 다르지 않으나
new, delete 연산자 사용과 포인터로 객체에 접근하는 것이 다름!
# this 포인터
- 클래스의 멤버함수 내에서 this 포인터의 사용 가능하다.
- 객체 자신을 가리키는 용도로 사용한다.
- 주소값과 자료형이 정해져 있지 않은 포인터이다.
- 그러나, 멤버 이니셜라이저에서는 this 포인터 사용이 불가능하다.
- 하지만, 멤버 이니셜라이저 사용시,
e.g. 클래스명(매개변수):num(num) 인 경우 알아서 멤버변수(지역변수)로 인식하니 걱정할 필요가 없다.
# Self-Reference
- 객체 자신을 참조할수 있는 참조자
- 객체의 참조의 정보(참조값)을 반환
e.g.
클래스명& 함수명(~)
{
return *this;
}
# 대입 연산자의 왼편에 "참조자의 선언"이 오거나,
반환형으로 "참조형"이 선언되는 경우,
해당 변수를 참조할 수 있는 참조의 정보(참조값)이 전달된다.
[출처] : 윤성우 저, "열혈 C++ 프로그래밍", 오렌지미디어
'Programming > 열혈 C++ 프로그래밍(저자 윤성우)' 카테고리의 다른 글
Ch 06. friend와 static 그리고 const (0) | 2020.08.17 |
---|---|
Ch 05. 복사 생성자(Copy Constructor) (0) | 2020.08.17 |
Ch 03. 클래스의 기본 (0) | 2020.08.17 |
Ch 02. C언어 기반의 C++ 2 (0) | 2020.08.17 |
Ch 01. C언어 기반의 C++ 1 (0) | 2020.08.17 |