4-4. 참조

Crat3 ㅣ 2023. 5. 11. 17:23

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