0. 회상
struct를 이용하여 hp, attack, defence를 구성
CreateMonster에 info라는 이름의 포인터를 받아서 몬스터의 스테이터스를 설정하였음.
void CreateMonster(StatInfo* info) // info 라는 포인터를 생성
{
cout << "몬스터 생성" << endl;
info->hp = 40;
info->attack = 8;
info->defence = 2;
}
한편 위의 코드는 아래의 코드와 다른 점이 있다.
void CreateMonster(StatInfo info) // info 라는 포인터를 생성
{
cout << "몬스터 생성" << endl;
info.hp = 40;
info.attack = 8;
info.defence = 2;
}
아래 코드는 매개 변수에만 hp attack defence의 값을 넘기게 된다.
즉 실제 값이 수정되지 않게 된다.
int main()
{
StatInfo info;
CreateMonster(&info);
PrintInfoByCopy(info);
PrintInfoByPtr(&info);
return 0;
}
1. 값을 직접 전달하는 방식
void PrintInfoByCopy(StatInfo info)
{
cout << "------------------------------" << endl;
cout << "HP : " << info.hp << endl;
cout << "ATK : " << info.attack << endl;
cout << "DEF : " << info.defence << endl;
cout << "------------------------------" << endl;
}
StatInfo의 Info를 모두 복사해서 여러 단계를 거쳐서 붙여 넣음.
성능이 상대적으로 저하됨.
2. 포인터를 이용한 주소 전달 방식
void PrintInfoByPtr(StatInfo* info)
{
cout << "------------------------------" << endl;
cout << "HP : " << info->hp << endl;
cout << "ATK : " << info->attack<< endl;
cout << "DEF : " << info->defence << endl;
cout << "------------------------------" << endl;
}
원본의 Info의 각 요소를 직접 이용함.
구조체의 크기가 매우 클 때 (ex.1000바이트) 값 전달 방식은 1000바이트의 복사가 이루어지지만
주소 전달 방식은 오직 8바이트 씩 만 복사가 이루어짐.
3. 참조 전달
int& reference = number;
실제 작동은 포인터와 동일하다.
C++에서는 number에 reference라는 이름을 부여했다고 볼 수 있음.
앞으로 reference에 값을 꺼내거나 넣는 것은 number의 값을 꺼내거나 넣는 것과 같음.
reference = 3; // == number = 3;
(1) 참조를 사용하는 이유
성능면에서 합리적인 포인터를 사용하면서 문법면에서 더 간략한 값 전달 방식을 사용함.
(info->hp와 같은 화살표를 사용하지 않을 수 있다)
(2) 참조 전달 방식
void PrintInfoByRef(StatInfo& info)
{
cout << "------------------------------" << endl;
cout << "HP : " << info.hp << endl;
cout << "ATK : " << info.attack << endl;
cout << "DEF : " << info.defence << endl;
cout << "------------------------------" << endl;
}
PrintInfoByRef(info);
문법 사용은 값 전달 방식을, 실제 작동은 주소 전달 방식을 사용한다.
'기초 C++ 스터디' 카테고리의 다른 글
4-6. 배열 (0) | 2023.05.22 |
---|---|
4-5. 포인터 vs 참조 (0) | 2023.05.11 |
4-2. 포인터 연산 (0) | 2023.05.11 |
4-1. 포인터 (0) | 2023.05.11 |
3-7. 구조체 (0) | 2023.05.10 |