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 |