본문 바로가기
Embedded System/소프트웨어 (C,C++)

[C++] 클래스, 객체 기초

by MachineJW 2023. 8. 27.

C++에서 클래스(Class)란 객체(Object)를 정의하는 틀.

클래스에 멤버 변수와 멤버 함수를 선언한다.

흔히들 붕어빵 틀이 클래스, 붕어빵이 객체라고 비유한다.

1. 선언 및 형태

class Myclass { // 참고로 클래스명은 대문자로 시작하는 것이 국룰.
	public : // 접근지정자 public 
		int a = 10; // 초기값을 넣어줄수도 있다.(2011년 C++ 표준) 
		double b;
		char c;
		void getArea(void); // 함수선언이 가능 
};

- 클래스는 class 키워드를 이용한다. C언어의 구조체(struct)를 선언하듯이 선언 마지막에 반드시 세미콜론을 추가한다.

// C언어 구조체 
struct Mystruct { // 구조체 이름 
	int member; // 구조체 멤버 1 
	char number[10]; // 구조체 멤버2
	unsigned short age; // 구조체 멤버3	
};

- 2011년 C++ 표준 부터는 멤버 변수를 선언과 동시에 초기화가 가능하다.

 

2. 객체의 멤버 접근

- 클래스를 만들었다면 실제 적용 시 객체를 생성한다.

#include <iostream>
// 예시 원(Circle) 계산 클래스 
class Circle {
	public:
		int radius;
		double getArea();	
};

// 함수 구현부 
double Circle::getArea() {
	return 3.14*radius*radius;
}

// Circle 클래스 적용
using namespace std;

int main(void) {
	Circle donut; // 도넛이라는 객체를 만든다.
	donut.radius = 1; // 도넛 객체의 반지름을 1로 설정 
	double area = donut.getArea(); // 도넛의 면적을 알아내기 
	cout << "donut 면적은 " << area << endl;
	return 0;
}

-  만든 클래스명과 사용할 객체명을 선언하여 객체를 만든다.

-  객체 멤버에 접근하기 위해서는 [객체이름.멤버]의 형태로 사용한다.

-  간접멤버접근연산자 " -> " 도 있는데 포인터멤버일때 사용한다. (다음에 더 자세히 공부)

- 멤버 함수 구현부에서 "::"연산자는 네임스페이스인데 "이름공간"보다는 "소속" 정도로 해석하는 것이 좋다.

3. 생성자(constructor)

/*생성자(constructor)*/
// 생성자의 목적은 객체가 생성될 때 초기 작업을 위함이다.
// 생성자 함수는 오직 한번만 실행된다
// 생성자 함수의 이름은 클래스 이름과 동일하게 작성되어야만 한다.
// 생성자 함수의 원형에 리턴타입을 선언하지 않는다.
// 생성자는 중복가능하다.
#include <iostream>
using namespace std;

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

Circle::Circle(){
	radius = 1;
	cout << "반지름" << radius << "원 생성" << endl;
	// return 값이 있으면 안됨 
} 

Circle::Circle(int r){
	radius = r;
	cout << "반지름" << radius << " 원 생성" << endl; 
}

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

int main(void) {
	Circle donut; // 매개변수 없는 생성자 호출 
	donut.radius = 1; // 도넛 객체의 반지름을 1로 설정 
	double area = donut.getArea(); // 도넛의 면적을 알아내기 
	cout << "donut 면적은 " << area << endl;
	
	Circle pizza(5); // 매개변수 있는 생성자를 호출. 30이 radius 멤버 변수로 전달되어 설정됨
	area = pizza.getArea();
	cout << "pizza 면적은 " << area << endl;
	return 0;
}

// 위임생성자
Circle::Circle() : Circle(1) // Circle(int r)의 생성자 호출

// 객체의 초기화를 담당하는 타겟생성자
Circle::Circle(int r){
	radius = r;
	cout << "반지름" << radius << " 원 생성" << endl; 
}

- 객체의 초기화 작업이 코딩된 Circle(int r)를 타겟 생성자라고 부르고, Circle() 생성자는 객체의 초기화를 다른 생성자에게 위임한다고 하여 위임생성자(delegating constructor)라고 부른다.