언어/C&C++ 기본

[C++] ENUMS, Constructor, Destructor

차가운오미자 2021. 7. 2. 10:37

ENUMS

값에다가 이름을 붙여주는 것

어떤 상태 같은 것을 지정할 때 유용하게 사용된다. 

int A = 0;
int B = 1;
int C = 2;

int main(){
	
	if(val==A){
		// whatever
	}else if(val==B){
		// whatever
	}
	
}

위와 같이 만들어도 되지만 이렇게 할 경우, 매우 복잡하고, 또 각 지정값의 변동 가능성도 있다. 

 

enum Example{
	// 기본적으로 int형으로 0, 1, 2... 이런식으로 배정이 된다. 
	A, B, C;
	// can align numbers to each names too
	D=4;
};

enum Example2: float{
	// 이렇게 특별히 type을 지정해줄 수 있긴 하다. 
	F=7.2;
	E=4.5;
};


int main(){
	
	Example val = 3; //error: 없는 값이라
	
	if(val==A){
		// whatever
	}else if(val==B){
		
	}
	
}

이렇게 enum을 사용하는 것이 더 깔끔하다. 

 

Constructor (생성자)

#include <string>
#include <iostream>

using namespace std;

class Human{
public:
	string name;
	int age;
	
	void Print(){
		cout << name << " " << age << endl;
	}
}

int main(void){
	
	Human h;
	h.Print();
	
}

 

이런 식으로 코드를 짜면 이상한 값이 프린트 되는 것을 확인할 수 있다. 왜냐면 Human 인스턴스가 선언되었지만, name과 age 변수에 아무런 설정을 안해줬기 때문에 쓰레기값이 들어있는 거다. 

처음에 인스턴스를 선언할 때, 특정하게 기본값이 세팅되어 있도록 해주기 위해서 생성자를 사용한다. 

#include <string>
#include <iostream>

using namespace std;

class Human{
public:
	string name;
	int age;
	
	void Print(){
		cout << name << " " << age << endl;
	}
	
	void Init(){
		name = "null";
		age = 0;
	}
}

int main(void){
	
	Human h;
	h.Init();
	h.Print();
	
}

이렇게 초기값을 설정해주는 함수를 별도 선언할 수 있지만 이렇게 하면 매번 인스턴스를 생성할 때마다 Init() 함수를 불러야 한다는 단점이 있다.

 

#include <string>
#include <iostream>

using namespace std;

class Human{
public:
	string name;
	int age;
	
	Human(){
		name = "Hong Gildong";
		age = 0;
	}
	
	void Print(){
		cout << name << " " << age << endl;
	}
	
	
}

int main(void){
	
	Human h;
	h.Print();
	
}

이런식으로 클래스 이름과 같은 생성자를 선언해서 초기화를 해줌으로써 선언과 동시에 초기화를 할 수 있다. 

원래 생성자 선언을 따로 안해주면 

Entity(){

}

이렇게 비어있는 생성자가 대신 들어가 있는 것이다. 

 

생성자는 여러 개를 만들 수 있다. 매개변수를 다르게 주면 된다. 

	Human(){
		name = "Hong Gildong";
		age = 0;
	}
	
	Human(string str){
		name = str; 
		age = 0;
	}
	

 

만약 생성자를 private하게 설정해주면 외부 함수에서 당연히 인스턴스를 선언할 수 없게 된다. 

또 다른 방법으로는 public하게 선언하되, 다음과 같이 해주면 된다. 

#include <string>
#include <iostream>

using namespace std;

class Dog{
	
public:
    Dog() = delete; // 기본 생성자를 지워버린다.

    static void Gather(){

    };
};

int main(void){

	Dog.Gather();
	Dog d; // error
	
}

Destructor

uninitialize instance / delete from memory

#include <string>
#include <iostream>

using namespace std;

class Human{
public:
	string name;
	int age;
	
	Human(){
		name = "Hong Gildong";
		age = 0;
	}
	
	Human(string str){
		name = str; 
		age = 0;
	}
	
	~Human(){
		cout << "human died " << endl;
	}
	
	void Print(){
		cout << name << " " << age << endl;
	}
};

void Exp(){
	
	Human h;
	h.Print();

}

int main(void){
	
	Exp();
	
	cin.get();
	
}

함수 내에서 선언된 인스턴스는 생겨났다가 그 함수가 끝날 때 스택에서 없어진다. 그럼 함수가 끝날 때 destructor가 불릴 거라는 것을 예측할 수 있다. 실제로 위 코드를 실행시키면 Exp()를 부를 때 human died 라는 문구가 프린트 되는 것을 확인할 수 있다. 

 

사실 실제로 desctructor을 사용해서 인스턴스를 지워버릴 일이 많지는 않다. 부를 땐

h.~Human();

으로 부르면 되긴 한다. 

'언어 > C&C++ 기본' 카테고리의 다른 글

[C] 배열과 포인터  (0) 2021.08.12
[C] Storage Class (extern, static 등)  (0) 2021.08.09
[C++] Static  (0) 2021.07.01
[C++] Class  (0) 2021.06.25
[C++] Header Files  (0) 2021.06.14