class가 만들어지기 전, C언어에서는 어떤 방식으로 구현을 했을까?

바로 struct를 이용한 방식이다.

이런 struct 구조체와 class에 대한 차이점은 다음과 같다.

- 구조체: struct 내부에 선언된 변수들은 public과 비슷하게 어디서든 접근이 허용된다.

- 클래스: class 내부에 선언된 변수 및 함수에 대한 접근과 관련한 접근제어 지시자가 필요하며 default값은 private이다.

 

 

※ 접근제어 지시자

- private: 클래스 내 정의된 변수 및 함수에서의 접근만 허용

- public:  어디서든 접근이 허용됨

- protected: 상속관계에서 유도클래스에서의 접근만 허용

 

※ 멤버 변수와 멤버함수

- 멤버변수: class를 구성하는 변수로 주로 private에 선언된다.

- 멤버함수: class를 구성하는 함수로 주로 public에 선언된다.

 

 

※ Class

- 클래스 선언: Car.h과 같은 헤더파일처럼 클래스가 구성하는 외형적인 틀을 보여준다.

- 클래스 정의: Car.cpp 처럼 멤버함수의 정의와 소스파일을 저장, 컴파일 되도록 한다.

 

 

※ 객체지향프로그래밍(OOP):

현실에 존재하는 사물, 대상과 연관된 행동을 실체화 하기 위한 프로그래밍

- 객체: class 타입의 변수라 생각, 클래스 기반 2가지 객체생성 방법이 있는데 아래와 같다.

ClassName objName;  // 일반적인 변수 선언 방식
ClassName *ptrObj = new ClassName;  // 동적할당 방식

이때, 동적할당 방식은 반드시 마지막에 delete ptrObj; 로 할당한 객체를 없애 memory leak을 방지해 줘야 한다.

 

 

- 생성자: 일종의 객체 멤버변수를 초기화하는 함수로 아래와 같은 성질이 있다.

1. 클래스 이름과 함수의 이름이 동일

2. 반환형 선언이 없고 실제로도 반환하지 않음

3. 생성자는 객체 생성 시 딱 한번만 호출

4. 멤버변수를 초기화 할 필요없이 생성자를 이용해 객체를 생성과 동시에 초기화 가능.

 

 

 

※ 객체생성과 함수원형선언

이때, 매개변수가 선언되어 있지 않은 생성자의 경우, Simple s0();과 같은 선언은 불가능하다.

(객체생성문인지 함수 원형 생성인지 구분 불가.)

Simple s0();  --> 함수 원형 선언

Simple s0;    --> 객체 생성 선언

 

 

 

 

 

※ OOP_정보 은닉

1. 멤버변수를 private으로 선언

2. 해당 변수에 접근하는 함수를 별도로 정의

3. 안전한 형태의 멤버변수의 접근을 유도 하는 것.

 

§ access함수: GetX, SetX처럼 멤버변수를 private으로 선언, 클래스 외부에서 멤버변수 접근을 목적으로 정의하는 함수

 

※ OOP_캡슐화(encapsulation)

- 큰 목적을 위해 둘 이상의 기능이 모여 목적을 달성하는 것으로 캡슐화가 무너지면 클래스 상호관계가 복잡해진다.

 

 

※ Member Initializer List

멤버변수로 선언된 객체의 생성자 호출 및 객체와 멤버의 초기화에 사용

이니셜라이저의 장점

 - 초기화 대상을 명확히 인식 가능

 - 성능상의 이점

 - 선언과 동시에 초기화 되는 Binary code 생성

 - const 멤버변수도 Initializer로 초기화 가능

 

※ default 생성자: 생성자를 정의하지 않은 클래스에는 default constructor가 자동삽입된다.

 

※ 객체 배열 생성: Add arr[10] 또는 Add *add = new Add[10]; 형태로 생성

- 객체 배열선언에도 생성자가 호출되며 호출할 생성자를 별도로 명시하는 것은 불가능

- 따라서 Add() {...}와 같은 생성자가 반드시 있어야 한다.

 

 

※ [Effective C++_item 4]: 객체 사용전, 반드시 그 객체를 초기화 하자!

객체가 이상한 값을 갖게 되는 상황을 방지하기 위해 모든 객체를 사용전, 반드시 항상 초기화 하자.

직접 초기화를 제외하면 C++초기화의 나머지는 생성자로 귀결된다. 

객체의 data member는 생성자의 본문이 실행되기 전초기화 되어야 한다. 따라서 member initializer list를 사용한다.

 

 

 

 

※ 소멸자: 생성자 앞에 ~를 붙인 형태로 직접 정의하지 않아도 default 소멸자가 자동 생성.

- 생성자에서 new로 할당한 메모리 공간을 소멸자에서 delete로 소멸시킨다.

 

 

 

 

※ *this 포인터 (객체 자기자신을 반환한다는 의미)

- this포인터는 객체의 주소를 저장한 포인터 변수이다.

- 매개변수와 멤버변수가 명확하게 구분될 수 있다.

 

※ [Effective C++_item 10]: 대입연산자는 *this의 참조자를 반환하도록 만들자!

+ Recent posts