2021.09.16 - [CPP공부] - cpp 객체 지향(1-설계도)
cpp 객체 지향(1-설계도)
절차(procedure)지향 프로그래밍 - procedure == 함수 즉, 함수 기반 프로그래밍 객체지향 프로그래밍 - 게임 업계에서는 객체지향 프로그래밍 방식을 이용한다. 객체 지향 설계 knight 설계 - 속성(데이
louanna97.tistory.com
코드를 이해하려면 보고 오자.
멤버 함수에서 객체의 "탄생"과 "끝"을 알리는 함수가 있다.
생성자(Constructor): 탄생, 여러개 만들 수 있다.
소멸자(Destructor): 끝, 하나만 만들 수 있다.
생성자(Constructor)
기본적으로 생성자는 객체가 생성됐을 때 호출된다.
생성자에는 여러가지 종류가 있다.
기본 생성자와 암시적(implicit) 생성자
class Knight
{
public:
// 기본 생성자 (인자x)
Knight()
{
cout << "Knight() 기본 생성자 호출" << endl;
_hp = 100;
_attack = 10;
_posY = 0;
_posX = 0;
}
...
}
int main()
{
Knight k1; // 기본 생성자 호출
return 0;
}
클래스 내부에 생성자를 명시적으로 만들지 않으면, 컴파일러가 기본 생성자를 자동으로 만든다.
int main()
{
// 기본 생성자를 만들지 않았을 때
Knight k1; // 에러 x
k1._hp = 100;
k1._attack = 10;
k1._posY = 0;
k1._posX = 0;
return 0;
}
이때 해당 객체에는 데이터를 초기화하지 않았기 때문에 따로 초기화해야 한다.
복사 생성자
// 복사 생성자
Knight(const Knight& knight)
{
_hp = knight._hp;
_attack = knight._attack;
_posY = knight._posY;
_posX = knight._posX;
}
int main()
{
// 복사 생성자 호출
Knight k2(k1);
Knight k4 = k1;
return 0;
}
자기 자신의 클래스 참조 타입을 인자로 받는다.
복사 생성자를 사용하는 이유는 똑같은 데이터를 지닌 객체가 생성되길 바라기 때문이다.
따라서 const를 넣어서 데이터를 조작할 수 없도록 한다.
복사 생성자를 만들지 않으면, 컴파일러가 암시적 복사 생성자를 만들어준다.
이때 암시적 복사 생성자는 우리가 만든 코드와 똑같이 동작한다.
Knight k4 = k1; // 복사 생성자
Knight k4; // 기본 생성자
k4 = k1; // 복사 대입 연산자
이 둘은 다르다는 것을 알고 가자.
기타 생성자와 타입 변환 생성자
// 기타 생성자
Knight(int hp, int attack, int posY, int posX)
{
cout << "Knight(int) 생성자 호출" << endl;
_hp = hp;
_attack = attack;
_posY = posY;
_posX = posX;
}
int main()
{
Knight k2(50, 20, 1, 1); // k3._hp = 50;
return 0;
}
기본 생성자에 조작하고 싶은 인자를 추가해주면 된다.
특정 객체를 생성하면서 특정 데이터를 조작하고 싶을 때 사용한다.
인자가 1개만 있는 기타 생성자는 타입 변환 생성자라고 부르기도 한다.
Knight(int hp)
{
cout << "Knight(int) 생성자 호출" << endl;
_hp = hp;
_attack = 10;
_posY = 0;
_posX = 0;
}
타입 변환 생성자는 사용자가 지정해주지 않으면 컴파일러가 암시적으로 생성한다.
이는 예기치 못한 에러를 발생시킬 수 있다.
// 타입 변환 생성자를 만들지 않았을 때
void HelloKnight(Knight knight)
{
cout << "Hello Knight" << endl;
}
int main()
{
// 암시적 개념 이해를 돕기 위한 간단한 형 변환
// 암시적 형변환 -> 컴파일러가 바꾼다.
int num = 1;
float f = num; // == (float)num;
// 명시적 형변환
float fl = (float)num;
Knight k5;
k5 = 1; // 컴파일러가 암시적 타입 변환 생성자를 호출한다.(1)
HelloKnight(5); // (2)
return 0;
}
우리가 예상할 때는 k5라는 객체에 1이 들어가지 않을거라 생각하지만, 컴파일러가 자동으로 생성자를 호출해서 처리하기 때문에 에러가 발생하지 않는다. 마찬가지로 HelloKnight(5)처럼 Knight 객체가 아닌 정수를 넣었는데도 에러가 발생하지 않는다.
따라서 우리는 컴파일러가 자동으로 생성자를 호출하지 않도록 하기 위해서 명시적인 생성자를 지정해줘야 한다.
explicit Knight(int hp)
{
cout << "Knight(int) 생성자 호출" << endl;
_hp = hp;
_attack = 10;
_posY = 0;
_posX = 0;
}
explicit은 명시적인 용도로만 사용하겠다는 표시다. 따라서 우리가 의도한 hp 값을 변경하는 용도로만 사용할 수 있다.
만약 정말로 형 변환을 이용하려면, 컴파일러에게 알려주면 된다.
k5 = (Knight)1;
HelloKnight((Knight)5);
소멸자(Destructor)
클래스 내부에 소멸자는 하나만 존재한다.
main 함수의 return 0;이 끝나고 호출된다.
class Knight
{
public:
...
~Knight()
{
cout << "Knight() 소멸자 호출" << endl;
}
...
}
int main()
{
...
return 0;
// 소멸자 호출
}
출처
https://www.inflearn.com/course/%EC%96%B8%EB%A6%AC%EC%96%BC-3d-mmorpg-1/dashboard
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 - 인프런 | 강의
시리즈를 원활하게 학습하기 위한 기초적인 C++ 문법들에 대해 학습합니다. 어셈블리 언어부터 시작해서 기본 C++ 문법, STL, C++11까지 핵심적인 내용을 압축해서 다루게 됩니다., - 강의 소개 | 인
www.inflearn.com
'프로그래머 > CPP_강의정리' 카테고리의 다른 글
cpp 객체지향(4-은닉성) (0) | 2021.09.19 |
---|---|
cpp 객체지향(3-상속성) (0) | 2021.09.19 |
cpp 객체 지향(1-설계도) (0) | 2021.09.16 |
cpp 파일 관리 (0) | 2021.09.16 |
cpp 다차원 배열 (0) | 2021.09.14 |