본문 바로가기

C++ 자료구조

[c++] 클래스 (Class)

[클래스 작성 및 객체 생성]

- 클래스?

속성과 기능이 묶여 담겨있는 것이다.

클래스는 객체의 설계도 이다. 클래스가 만든 객체를 인스턴스라고 한다.

 

[접근 지정자]

- private 클래스 안에서만 사용 될 수 있다.

- protected 클래스 안과 상속된 클래스에서 사용 될 수 있다.

- public 누구나 사용 될 수 있다.

 

[접근자와 설정자]

[클래스]

- 클래스의 인터페이스와 구현의 분리

복잡한 클래스인 경우에는 멤버 함수를 클래스 외부에서 정의

 

 

 

- 클래스의 선언과 클래스의 정의 분리

 

 

[클래스 생성자]

- 생성자의 중복 정의

생성자는 매개변수를 달리하여 중복 가능하다.

 

 

* 매개 변수가 없는 생성자를 안 만들고 매개 변수가  있는 생성자만 있는 경우 기본 생성자가 실행되지 않기 때문에 매개 변수가 있는 생성자를 만들 때 매개 변수가 없는 생성자도 같이 만들어 줘야 사용 했을 때 오류가 나지 않는다.

 

 

- 디폴트 생성자

Time a는 위에서 설명한 것 처럼 오류가 나지만, Time b는 디폴트 값이 있기 때문에 오류가 나지 않는다.

 

 

[멤버 초기화 리스트]

// 기본 c++ 생성자 문법
Time (int h, int m)
{
	hour = h;
    minute = m;
}

// 모던 c++ 생성자 문법
Time(int h, int m) : hour(h), minute(m){} // c++ 14
Time(int h, int m) : hour{h}, minute{m}{} // c++ 11

 

모던 c++ 생성자 문법의 좋은 점

 

1. 비용적으로 효율적이다.

원래 문법의 생성자는 생성자를 호출하고 대입도 하는 2번의 함수 호출이 일어난다.

초기화 리스트에 넣는다는 것은, 대입이 아닌 초기화를 수행한다는 것이다. 한 번의 생성자 호출로 초기화가 가능하다!

 

2. 상수 멤버나 참조자 멤버는 무조건 사용!

모던 c++ 생성자 문법은 매개 변수를 대입해 주는 것이 아니라 초기화를 해주는 것이다.

 

[중괄호 초기화]

중괄호를 사용해서 초기화를 하면 오류를 띄워준다.

 

 

 

[this 포인터]

포인터, 객체 자신의 포인터 이다. 클래스의 멤버 함수 내에서만 사용한다.

멤버 함수에 컴파일러에 의해 묵시적으로 삽입 선언되는 매개 변수 이다.

 

 

- this가 필요한 경우

매개 변수의 이름과 멤버 변수의 이름이 같은 경우

 

 

멤버 함수가  객체 자신의 주소를 리턴할 때 (연산자 중복 시에 매우 필요하다.)

 

[클래스 실습 문제]

- 객체가 함수의 매개 변수로 전달되는 경우

#include <iostream>
using namespace std;

class Pizza
{
public:
	int size;
	Pizza() {};
	Pizza(int s) : size(s) {};
};

void makeDouble(Pizza pizza)
{
	pizza.size *= 2;
}

int main()
{
	Pizza pizza(10);
	makeDouble(pizza);
	cout << pizza.size << "인치 피자" << endl;

	return 0;
}

 

 

- 객체의 참조자가 함수의 매개 변수로 전달되는 경우

#include <iostream>
using namespace std;

class Pizza
{
public:
	int size;
	Pizza() {};
	Pizza(int s) : size(s) {};
};

void makeDouble(Pizza &pizza)
{
	pizza.size *= 2;
}

int main()
{
	Pizza pizza(10);
	makeDouble(pizza);
	cout << pizza.size << "인치 피자" << endl;

	return 0;
}

 

 

[객체 배열]

 

// Book 이라는 클래스가 있을 때

Book books[2] = 
{
	Book("GGM", 25000),
    Book("HIGH SCHOOL", 22000)
};

// 총 2개의 book 클래스를 묶은 배열을 만든 것이고
// 둘을 생성자를 통해 초기화 해줬다.

 

'C++ 자료구조' 카테고리의 다른 글

시간복잡도 기초  (0) 2024.04.15
[c++] 연산자 중복 (오버로딩)  (0) 2024.04.02
[c++] vector  (0) 2024.03.26
[c++] 배열  (0) 2024.03.25
[c++] 제어 구조와 함수  (0) 2024.03.19