본 포스팅은 명품 c++ 책을 정리한 것입니다.
3.1 객체에 대한 이해
- 세상 모든 것이 객체다.
- 객체는 캡슐화된다.
- 객체의 일부 요소는 공개된다.
- C++ 객체는 멤버 함수(상태)와 멤버 변수(행동)로 구성된다.
- c++ 에서 클래스란, 객체를 정의하는 틀 혹은 설계도.
- 클래스에 멤버 변수와 멤버 함수를 선언한다!
- 객체는 클래스라는 틀에서 찍어내어, 멤버 변수 메모리와 멤버 함수 코드를 실제 가지고, 프로그램이 실행되는 동안 실존하는 실체 혹은 인스턴스(instance) 이다.
3.2 C++ 클래스 만들기
- class 키워드를 이용하여 클래스 선언
- 클래스는 선언부와 구현부로 나뉘어진다. <- 분리하여 작성하는 이유 : 클래스의 재사용을 위해서!
- 클래스 맴버 : 클래스의 멤버는 변수와 함수로 구성된다.
- 접근지정자 : private, public, protected
3.3 객체 생성과 객체 활용
- 객체 생성과 활용 예제
- 객체 생성과 객체 이름
- 객체의 맴버 접근 : 객체이름.맴버
3.4 생성자
- 생성자 : due to 객체 초기화
- 생성자의 특징!
(1) 생성자의 목적은 객체가 생성될 때 필요한 초기 작업을 위함.
(2) 생성자 함수는 오직 한 번만 실행된다. (자동으로)
(3) 생성자 함수의 이름은 클래스 이름과 동일하게 작성되어야 함.
(4) 생성자 함수는 리턴 타입 없음. <- return; 해야함.
(5) 생성자는 중복 가능하다.(매개변수로 구분)
- 객체 생성과 생성자 실행
- 위임 생성자(delegating constructor), 생성자가 다른 생성자 호출
c++11 부터는 중복된 초기화 코드를 하나의 생성자로 몰고, 다른 생성자에서 이 생성자를 호출할 수 있게 한다.
Circle::Circle() : Circle (1) {} //Circle(int r)의 생성자 호출
Circle::Circle(int r) {
radius = r;
}
- 생성자와 멤버 변수의 초기화
: 클래스의 멤버 변수들은 자동으로 초기화되지 않기 때문에 생성자에서 초기화! (방법 3가지)
- 생성자는 꼭 있어야 하나요? 네! 선언 안해도 어차피 컴파일러가 기본 생성자를 만들어서 삽입하기 때문.
- 기본 생성자(디폴트 생성자) <- 매개변수 없는 생성자.
3.5 소멸자
- 소멸자(destructor)는 객체가 소멸되는 시점에서 자동으로 호출되는 클래스의 멤버 함수.
~Circle();
소멸자는 오직 하나만 존재
- 소멸자의 목적은 객체가 사라질 때 필요한 마무리 작업을 하기 위함!
객체가 소멸할 때, 동적으로 할당받은 메모리를 운영체제에게 돌려주거나, 열어 놓은 파일을 저장하고 닫거나, 연결된 네트워크를 해제하는 등 객체가 사라지기 전에 필요한 조치를 하도록 하기 위함!
- 소멸자는 리턴 타입이 없음. (값 리턴하면 안됨!)
- 소멸자는 오직 한 개만 존재. 매개 변수를 가지지 않는다.
- 소멸자가 선언되어 있지 않으면 기본 소멸자가 자동으로 생성된다. : 생성된 반대 순으로 소멸됨!
- .
- 생성자/ 소멸자 실행 순서 : 생성된 순서의 반대순으로 소멸
3.6 접근 지정
- C++ 의 맴버 접근 지정자
(1) private : 클래스 내의 맴버 함수만 접근 가능.
(2) public : 클래스 내외의 모든 함수에게 접근 허용.
(3) protected : 클래스 내의 멤버와 상속받은 파생 클래스에만 접근 허용. (8장'상속' 에서 다시 설명)
- 디폴트 접근 지정은 private
- 멤버 보호와 생성자
맴버 변수는 private으로 지정하는 것이 바람직 : 다른 클라스의 외부 함수에서 접근할 수 없도록 하는 것이 바람직하다.
생성자는 public으로 : 클래스 외부에서 객체를 생성하기 위해서!(의도적으로 외부에서 객체를 생성할 수 없도록 생성자를 private로 선언하기도 하고, 자식 클래스에서만 생성자를 호출하도록 protected로 선언하기도 한다.)
3.7 인라인 함수
- 함수 : 적절한 단위 작업 가능해짐!
- 함수 호출에 따른 시간 오버헤드
- 인라인 함수 : 짧은 코드로 구성된 함수에 대해, 함수 호출 오버헤드로 인한 프로그램 의 실행 속도 저하를 막기 위해 도입된 기능. 인라인 함수는 함수 앞에 inline 키워드를 이용하여 선언함.<- 실행 속도가 빨라짐.
- c++ 에서는 멤버 변수의 값을 알아내고 멤버 변수에 값을 쓰는 getter/setter라고 불리는 작은 멤버 함수들이 많이 존재. 이 멤버 함수들을 호출하는 코드 역시 많이 존재. 이런 작은 함수를 인라인으로 선언하면 프로그램의 실행 속도 향상 가능!! 그러나 많이 있으면 그만큼 전체 크기가 늘어난다.. ㅠㅠ..
- 인라인 함수의 제약 사항 : inline 선언은 컴파일러에게 주는 일종의 요청이지 강제 명령이 아니다! 컴파일러가 슥 보고 함수의 크기나 효율을 따져서 불필요하다면 inline 선언을 무시할 수도 있다..
3.8 C++ 구조체
구조체 선언
구조체의 객체 생성
구조체와 클래스의 차이점
클래스는 디폴트가 private! 구조체는 디폴트 접근 지정은 public
구조체보다 class 많이 쓰세요!!!
3.9 바람직한 C++ 작성법