Part02 객체지향의 도입

PassionYim·2023년 12월 7일
0

C++

목록 보기
3/4
post-thumbnail

Class : 객체

구조체와 비슷..하다

다른 점이 있다면 3가지

  1. 변수의 초기화는 클래스 내의 함수에서만 가능하다.
  2. 접근제어 지시자를 통해 변수나 함수에 접근한다.
  3. 최초 선언시 접근제어 지시자가 다르다.

접근제어 지시자?

  • public 어디서든 접근 허용
  • protected 상속관계에 놓여있을 때, 유도 클래스에서의 접근 허용
  • private 클래스 내(클래스 내에 정의된 함수)에서만 접근허용

Struct 구조체로 선언된 변수와 함수는 별도의 접근제어 지시자가 없다면
=>Public이기에 함수외부에서 변경이 가능했다.

Class 클래스로 선언된 변수와 함수는 별도의 접근제어 지시자가 없다면
=> Private이기에 클래스 내의 함수를 통해 변경이 가능하다.

...

class people
{
private:
	char nameID[20];
	int Age, Weight, Height;
public:
	void peopleinit(const char* name, int age, int weight, int height);
	void show_peopleStruct();
};
int main(void)
{
	people A;
	A.peopleinit("sm", 25, 175, 65);
	A.show_peopleStruct();

}
void people::peopleinit(const char* name, int age, int weight, int height)
{
	strcpy_s(nameID, name);
	Age = age;
	Weight = weight;
	Height = height;
}
}

Class를 외부함수에서 초기화 했을 떄 오류 발생

Class를 정상적으로 초기화 할 떄

Class information hiding

정보은닉

: 클래스의 멤버변수를 private으로 선언하고, 해당 변수에 접근하는 함수를 별도로 정의해서, 안전한 형태로 멤버변수의 접근을 유도하는 것이 바로 ‘정보은닉'이며, 이는 좋은 클래스가 되기 위한 기본 조건.(public의 경우 접근이 쉽게 가능하니까!)

Const 함수
함수 선언 끝에 const를 붙인다면, const함수 내에서 멤버변수의 값을 변경할 수 없다.=>컴파일 오류
Const함수 내에서 const가 아닌 함수로 호출이 제한된다.

Class 캡슐화

: 여러 기능(클래스)를 하나의 클래스안으로 담는 것.

캡슐화의 어려운점.. => 기능을 어디까지 넣어야하는 것인가. 범위를 결정짓는 것이 어려움.

정보은닉 + 캡슐화

Private으로 선언된 변수들을 캡슐화 하여, 변수 접근의 보안성이 향상.

Class 생성자

: 객체의 멤버변수를 초기화하기 위해 사용.

특징

  1. 생성자의 형태는 class의 이름과 함수의 이름이 동일.
  2. 반환형이 선언되어 있지 않으므로, 실제로 반환 불가.
  3. 생성자도 함수의 일종으로, 오버로딩이 가능.
  4. 생성자도 함수의 일종으로, 매개변수에 ‘디폴트 값'을 설정할 수 있음.


객체 안에 생성되어 있는 클래스를 생성자를 통해 멤버 이니셜라이저 하는 법


Class 소멸자

: 생성자처럼 앞에 ~를 붙임.

객체 배열, 포인터 배열, this 포인터

객체 배열 : 객체를 여러 개 생성

Person man[3];
Person * ptrArr = new Person[3];

객체 포인터 배열 : 객체의 주소 값 저장이 가능한 포인터 변수로 이루어진 배열

Person * man[3];

this 포인터 : 객체 내에서 this를 출력시 객체의 주소가 출력

this 포인터의 활용 : 매개변수와 객체 내에 변수가 존재할 때, 중복이 되지 않기 위해 사용가능.

복사 생성자

: class의 복사

//c 스타일 초기화
int a = 30;
int &ref = num;

//c++ 스타일 초기화
int num(20);
int &ref(num);

=> Class의 경우도 똑같다.

class sosimple
{}
sosimple sim1;
sosimple sim2 = sim1;
sosimple sim2(sim1);

복사 생성자

별도의 정의 가능.
자동으로 삽입이 되는
default copy constructor 도 가능.

깊은 복사(deep copy)와 얕은 복사(shallow copy)

- 얕은 복사

Called destructor가 한 번만 출력이 되었다.
=> 얕은 복사를 하면서 객체의 name이 공유되는데.
지워졌기 때문에.

- 깊은 복사

: Class의 멤버변수만 복사가 아닌, 포인터로 참조하는 대상까지 깊게 복사한다는 뜻.


Class의 멤버변수만 복사가 아닌, 포인터로 참조하는
대상까지 깊게 복사한다는 뜻.

참조변수와 임시객체 들이 언제 소멸되는지 알 수 있게 해주는 설명!!!

? 해당 부분은 생각해보자.

클래스와 함수의 friend 선언

profile
열정이 전부였던 개발자

0개의 댓글