관리 메뉴

FU11M00N

[ C++ ] C++ 객체 , 클래스 만들기 본문

Programming/C++

[ C++ ] C++ 객체 , 클래스 만들기

호IT 2021. 3. 23. 13:12


 

- C++ 클래스, C++ 객체 개념

 

- 클래스

 

  • 객체를 만들어내기 위해 정의된 설계도, 틀
  • 클래스는 객체가 아닙니다.
  • 실체도 아닙니다.
  • 클래스 내부에는 멤버변수와 멤버 함수를 선언할 수 있습니다.

 

- 객체

 

  • 객체는 생성될 때 클래스의 모양을 그대로 가지고 탄생됩니다.
  • 멤버변수와 멤버함수로 구성합니다.
  • 메모리에 생성되어 실체(instance)라고도 부릅니다.
  • 하나의 클래스 틀에서 찍어낸 여러 개의 객체 생성 가능합니다.
  • 객체들은 상호 별도의 공간에 생성됩니다.

 

- C++ 클래스 만들기

- 클래스 작성

멤버변수와 멤버함수로 구성하고, 클래스 선언부와 클래스 구현부로 구성됩니다.

 

- 클래스 선언부

class 키워드를 이용하여 클래스를 선언하고, 멤버변수와 멤버함수를 선언합니다.

 

멤버에 대한 접근 권한 지정합니다.

  - private, public, protected 중 하나를 선택합니다.

  - 디폴트는 private 입니다.

  - public은 다른 모든 클래스나 객체에서 멤버의 접근이 가능함을 표시합ㄴ디ㅏ.

 

 

- 클래스 구현부

 

클래스에 정의된 모든 멤버 함수를 구현하는 부분입니다.

 

 

 

 

아래는 예제코드 입니다.

 

#include <iostream>
using namespace std;
int a = 10;
void show() {
	cout << "쇼" << endl;

}

class Circle {
public:
	int radius;
	double getArea();
};

double Circle::getArea() {
	return 3.14 * radius * radius;
}

int main() {

	Circle donut;
	donut.radius = 1;
	double area = donut.getArea();
	cout << "donut 면적은 : " << area << endl;

	return 0;
}

출력 값:

 

 

 

 

class Circle {
public:
	int radius;
	double getArea();
};

 

위 예제에서의 해당 부분은 클래스를 선언하는 곳 입니다.

 

 

 

 

double Circle::getArea() {
	return 3.14 * radius * radius;
}

 

해당 클래스 구현부입니다. getArea 라는 함수를 구현했습니다.

 

"::"  은 범위지정 연산자로, 어떤 클래스의 함수인지 알려주는 역할을 합니다.

 

 

 

아래는 예제입니다.

 

#include <iostream>
using namespace std;

class Circle {
public:
	int radius;
	double getArea();
};

double Circle::getArea() {
	return 3.14 * radius * radius;
}

class Rectangle {
public:
	int width, height;
	int getArea();
};

int Rectangle::getArea() {
	return width * height;
}


int main() {

	Circle donut;
	donut.radius = 1;
	double area = donut.getArea();
	cout << "donut 면적은 : " << area << endl;
	Rectangle rect;
	rect.width = 3;
	rect.height = 3;
	cout << "사각형의 면적은 : " << rect.getArea() << endl;

	return 0;
}

 

 

 

 

 

 

- 생성자(constructor)

 

  • 객체가 생성되는 시점에서 자동으로 호출되는 멤버 함수
  • 클래스 이름과 동일한 멤버 함수

 

객체가 생성될 때 객체가 필요한 초기화를 위해 생성자를 이용합니다.

 

 

 

방금 한 예제를를 예시로 들겠습니다.

 

 

Circle pizza(30);

 

donut 이 아니라 pizza 객체를 만들고 싶을때 아까와 같이 선언하는 것이 아닌

반지름의 길이를 매개변수로해서 넘긴다고 가정할때  class에 생성자를 추가해줘서 사용해야합니다.

 

class Circle {
public:
	int radius;
	Circle();
	Circle(int r);
	double getArea();
};

Circle::Circle() {
	radius = 1;
}

Circle::Circle(int r) {
	radius = r;
}

double Circle::getArea() {
	return 3.14 * radius * radius;
}

 

위는 각각 클래스의 선언부와 구현부입니다.

Circle(); 과 Circle(int r); 

이 추가된 것을 확인할 수 있습니다.

 

클래스의 이름과 같은 생성자가 생성된 것입니다.

 

생성자는 타입이 없는 형태로 구현부에 쓰면 됩니다.

 

 

Circle::Circle(int r){} 

 

pizza 객체가 만들어지는 순간 pizza 객체의 radius 는 넘겨지는 파라미터 값으로 초기화 됩니다.

 

 

이렇게 객체가 생성되는 시점에 자동으로 호출되어 객체를 초기화 시켜주는 함수를 생성자 라고 합니다.

 

 

 

 

 

- 소멸자

 

객체가 소멸되는 시점에서 자동으로 호출되는 함수입니다. 오직 한번만 자동 호출되고, 임의로 호출할 수 없습니다.

 

객체 메모리 소멸 직전 호출됩니다. 소멸자는 객체가 사라질 때 마무리 작업을 위해 있습니다.

 

소멸자 함수의 이름은 클래스 이름 앞에 ~를 붙이면 됩니다.  소멸자는 리턴타입이 없고, 어떤 값도 리턴하면 안됩니다.

 

소멸자는 한 클래스 내에 오직 한개만 존재합니다.

 

 

class Rectangle {
public:
	int width, height;
	Rectangle();
	Rectangle(int w);
	Rectangle(int w, int h);
	~Rectangle();
	int getArea();
	int getArea2();
	bool isSquare();
};

Rectangle::~Rectangle() {
	cout << "넓이가 " << getArea() << "인 나 이제 그만 사라진다" << endl;
}

 

소멸자는 위와 같이 이름 앞에 ~ 를 붙입니다.

 

C++ 에서는 가장 나중에 생성된 객체가 가장 먼저 소멸됩니다.

 

 

class Rectangle {
public:
	int width, height;
	Rectangle();
	Rectangle(int w);
	Rectangle(int w, int h);
	~Rectangle();
	int getArea();
	int getArea2();
	bool isSquare();
};

Rectangle::Rectangle() {
	width = 1;
	height = 1;
}
Rectangle::Rectangle(int w) {
	width = w;
	height = w;
}
Rectangle::Rectangle(int w, int h) {
	width = w;
	height = h;
}
Rectangle::~Rectangle() {
	cout << "넓이가 " << getArea() << "인 나 이제 그만 사라진다" << endl;
}

bool Rectangle::isSquare() {
	if (width == height) {
		cout << "넓이 : "<<getArea()<<" 둘레 : "<<getArea2()<<"  ";
		return true;
	}
	return false;
}


int Rectangle::getArea() {
	return width * height;
}

int Rectangle::getArea2() {
	return (width+height)*2;
}


int main() {
	Rectangle rect1;
	Rectangle rect2(3, 5);
	Rectangle rect3(3);

	if (rect1.isSquare()) cout << "rect1은 정사각형이다. 넓이 : " << rect1.getArea() << " 둘레 : " << rect1.getArea2() << endl;
	if (rect2.isSquare()) cout << "rect2는 정사각형이다. 넓이 : " << rect2.getArea() << " 둘레 : " << rect2.getArea2() << endl;
	if (rect3.isSquare()) cout << "rect3는 정사각형이다. 넓이 : " << rect2.getArea() << " 둘레 : " << rect3.getArea2() << endl;

	
}

 

 

위 코드의 결과는 아래와 같습니다.

 

 

 

 

 

 

- 인라인(inline) 함수

 

작은 크기의 함수를 호출하게 되면, 함수 실행 시간에 비해서

호출을 위해 소요되는 추가적인 시간 오버헤드가 상대적으로 커집니다.

 

이를 위해 인라인 함수라는 개념이 등장했습니다.

 

inline 키워드로 선언된 함수입니다.

인라인 함수를 호출하는 곳에 인라인 함수 코드를 확장해 삽입합니다.

매크로와 유사한데, 코드 확장 후 인라인 함수는 사라집니다.

 

인라인 함수를 호출하면,

함수 호출에 따른 오버헤드는 존재하지 않습니다.

 

또한 프로그램의 실행 속도가 개선됩니다.

 

자주 호출되는 짧은 코드의 함수 호출에 대한 시간 소모를 줄일 수 있기 때문입니다.

Comments