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의 참조자를 반환하도록 만들자!
'C | C++ > C++' 카테고리의 다른 글
★★this.code(5)_ 상속, 가상함수(동적바인딩 / 오버라이딩 / 추상클래스), 다형성, 다중상속 (0) | 2022.10.25 |
---|---|
★this.code(4)_ 복사생성자, 이동생성자, perfect forwarding, 임시객체, explicit, friend, static, mutable (0) | 2022.10.25 |
this.code(2)_ const, constexpr (0) | 2022.10.25 |
this.code(1)_ C++, based by C (0) | 2022.10.21 |
this.code(0)_ How to Study C++ (2) | 2022.10.21 |