power-girl0-0

[ C++ ] 클래스 & 객체 본문

언어/C++

[ C++ ] 클래스 & 객체

power-girl0-0 2021. 3. 23. 14:25
728x90

 클래스 & 객체 개요 

 클래스 

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

 객체 

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

 C++ 클래스 생성 

 클래스 작성 

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

 

 클래스 선언부 

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

 

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

접근 권한 지정에는 private, public, protected 가 있다.

default는 private이며, public은 다른 모든 클래스나 객체에서 멤버의 접근이 가능함을 표시한다.

 

 클래스 구현부 

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

 

아래는 예제코드로, 면적을 구하는 예제이다.

#include <iostream>
using namespace std;

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

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

int main(){
	Circle donut;
	donut.radius = 1;	//donut 객체의 반지름을 1로 설정
	double area = donut.getArea();	//donut 객체의 면적 알아내기
	cout << "donut 면적은 "<<area<<endl;
	
	Circle pizza;
	pizza.radius = 30;
	area = pizza.getArea();
	cout << "pizza 면적은 "<<area<<endl;
}


 생성자(constructor) 

  • 객체가 생성되는 시점에서 자동으로 호출되는 멤버 함수이다.
  • 반드시 클래스 이름과 동일해야 한다.
  • 리턴 타입이 없으며, void 타입도 불가능하다.
  • 객체가 생성될 때, 객체가 필요한 초기화를 위해 이용한다.

아래는 위 예제에서, 생성자를 사용한 예제이다.

#include <iostream>
using namespace std;

class Circle{
public:
	int radius;
	double getArea();
	Circle();  //생성자 선언
	Circle(int r); //생성자 선언
};

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

Circle::Circle(){ 	//생성자 구현
	cout<<"반지름 "<<radius<<" 원 생성"<<endl;
}

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

int main(){
	Circle donut;
	donut.radius = 1;	//donut 객체의 반지름을 1로 설정
	double area = donut.getArea();	//donut 객체의 면적 알아내기
	cout << "donut 면적은 "<<area<<endl;
	
	Circle pizza2(20); //객체 생성
	area = pizza2.getArea();
	cout << "반지름이 "<<pizza2.radius<<" 이면, pizza2 면적은 "<<area<<endl;
	
}

위 코드에서,

Circle();과 Circle(int r); 

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

 

이는 클래스 이름과 같은 생성자이다.

생성자는 타입이 없는 형태로 구현부에는 아래와 같이, 쓰면 된다.

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

 

위 생성자는, 아래 코드에 의해 호출된다.

Circle pizza2(20);

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


 소멸자 

객체가 소멸되는 시점에서, 자동으로 호출되는 함수이다.

오직 한번만 자동으로 호출되는 것으로, 임의로 호출이 불가능하다.

 

소멸자는 객체 메모리 소멸 직전 호출되고, 객체가 사라질 때 마무리 작업을 위해 존재한다.

소멸자 함수의 이름은 클래스 이름 앞에 ~를 붙이면 된다.

이는 한 클래스 내에 오직 한개만 존재한다.

 

#include <iostream>
using namespace std;

class Circle{
public:
	int radius;
	double getArea();
	Circle();  
	Circle(int r); 
	~Circle(); //소멸자
};

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

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

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

Circle::~Circle(){ 	//소멸자
	cout<<"반지름 "<<radius<<" 원 소멸"<<endl;
}

int main(){
	Circle donut;
	donut.radius = 1;	
	double area = donut.getArea();	
	cout << "donut 면적은 "<<area<<endl;
	
	Circle pizza2(20);
	area = pizza2.getArea();
	cout << "반지름이 "<<pizza2.radius<<" 이면, pizza2 면적은 "<<area<<endl;
	
}

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

 

 

 

 

728x90
Comments