시작은 미미하나 끝은 쥬쥬하리라.

Study/Passionate C++ Programming

[열혈 C++ 프로그래밍] (4) 클래스의 완성

코딩뚜벅이 2024. 1. 21. 12:42

클래스의 완성

  • 정보은닉
  • 캡슐화
  • 생성자와 소멸자
  • 클래스와 배열, this 포인터

정보은닉

정보 은닉

다른 클래스에서의 접근을 제한하는 것 (= 외부에서 멤버 변수에 접근하는 것을 방지)
= 멤버 변수를 private 선언 <-> 멤버 함수를 통한 안정적인 접근 경로를 설정

 

액세스 함수

정보 은닉으로 인하여 추가되는 함수

 

const 함수

멤버 함수의 const 선언 : const 함수 내에서는 동일 클래스에 선언된 멤버 변수의 값을 변경하지 못함
+ const 함수는 const가 아닌 함수를 호출하지 못함 -> 간접적인 멤버의 변경 가능성 차단
+ const 상수화 객체는 const 멤버 함수만 호출이 가능

 


 

캡슐화

하나의 클래스가 하나의 목적을 위하여 연관된 함수와 변수들이 모여 있는 것
ex) A클래스의 캡슐화가 잘되어 있다면 변경되더라도 연관된 B,C클래스는 변경되지 않거나 범위 최소화

 


 

생성자와 소멸자

생성자

객체의 생성과 동시에 함수를 호출 (new 함수 등)
조건: 클래스의 이름과 동일한 이름의 함수 + 반환형이 선언되어 있지 않으면서 값을 반환하지 않는 것
- 생성자가 정의되지 않으면 컴파일러에 의해 디폴트 생성자가 생성됨 -> 모든 객체는 생성자에 의해 생성
- 생성자 인자에 관한 정보가 없으면 void 생성자에 의한 호출이라는 의미(=디폴트 생성자)
- 생성자가 선언이 되었는데 어떠한 인자도 받지 않는 생성자가 필요하다면 직접 선언해주어야함
+ 생성자도 오버로딩 가능

 

 

- Circle 클래스를 기반으로 한 donut 객체 생성
- 인자가 없으므로 r=1인 donut 객체 생성
- double형 area 객체를 생성하여 Circle의
getArea() 함수를 호출
- r은 1이므로 면적은 3.14 출력
- pizza 객체는 10을 인자로 객체 생성

 

 

소멸자

객체의 소멸과 동시에 함수를 호출 (delete 함수 등)
형식: ~AA () { . . . }
-> 직접 명시하지 않아도 디폴트 생성자와 마찬가지로 디폴트 소멸자가 자동 생성

 

 

이니셜라이저

생성자 : 멤버변수의 초기화를 목적으로 정의
-> 객체 생성 과정에서의 생성자 호출은 객체의 초기화를 수월하게 만듬
-> 멤버 이니셜라이저는 멤버변수로 선언된 객체의 생성자 호출에 활용
+ 객체가 아닌 멤버변수도 이니셜라이저를 통해서 초기화 가능
-> 생성자의 몸체 혹은 이니셜라이저를 통한 초기화 중에서 선택 가능

 

 

- 생성자에 이니셜라이저를 정의
- Rectangle m_length=length;로 초기화
- 인자로 받은 값을 멤버변수로 초기화한다는 의미
- 객체z의 경우 width 값이 없어서 디폴트값 출력

 


 

클래스와 배열, this 포인터

this

객체 자신을 가리키는 키워드

A obj1;


-> obj1객체 내부에서 this는 obj1의 주소값과 A 타입정보를 의미
+ 객체의 주소값으로 접근 할 수 있는 대상은 멤버변수만 가능

 

 

- class A의 객체 a의 주소값과 a객체에서의
this는 동일
- class A와 객체 a, this의 주소값이 모두 동일

 

 

- this->num은 매개변수가 아닌 멤버변수 num을
가리키는 것
- this는 멤버변수를 초기화 할 때 많이 사용

 

 

- p는 num1의 주소값을, *p는 111을 의미
- ref1은 *p 즉, 111을 참조 -> ref1=num1=111
- p의 주소값을 ref2가 int형 포인터로 참조

 

 

객체 배열

person arr[3];
person* parr = new person(3);


-> person이라는 크래스에 arr이라는 배열을 선언
-> 배열 생성 시 객체가 함께 생성, 호출되는 생성자는 void 생성자

 

 

객체 포인터 배열

person *arr[3];
arr[0] = new person(name, age);
. . . arr[3] = new person(name, age);

 

-> person이라는 클래스에 객체를 저장할 수 있는 포인터(주소값) 변수로 이루어진 배열을 선언
-> 실제 객체는 배열 선언 시 생성되는 것이 아닌 별도의 생성 과정을 거쳐야 생성