Language/C++

[C++] 참조

Return 2022. 6. 5. 12:44

Introduce

 참조의 개념과 참조와 포인터의 차이점을 알아보자. 

참조는 값 전달 방식과 주소 전달 방식의 중간점

주소 전달 방식 

void CreateMonster(Statinfo *info)
{
    info->hp = 100;
    info->attack = 8;
    info->defence = 2;
}
void PrintinfoByPtr(Statinfo *info)
{
    cout << " HP : " << info->hp << endl;
    cout << " Attack : " << info->attack << endl;
    cout << " Defence : " << info->defence << endl;
}

값 전달 방식

-  * 가 붙지 않으면 값 방식(복사방식) 결과는 위와 같을 지라도 과정은 완전히 다르다. 

-  진짜를 안건드리고 엄한 복사본 만들아서 쿵짝쿵짝한 다음 마지막에 진자에 복사해준다. 

void CreatePlayer(Statinfo info)
{
    info.hp = 100;
    info.attack = 8;
    info.defence = 5;
}
void PrintinfoByCopy(Statinfo info)
{
    cout << " HP : " << info.hp << endl;
    cout << " Attack : " << info.attack << endl;
    cout << " Defence : " << info.defence << endl;
}

값 전달 방식의 문제점 

-  만약 구조체가 1000바이트 짜리라면 ? 

-  값 전달 방식 : 1000바이트 복사해야됨. 

-  주소 전달 방식 : 주소값 8바이트만 쓰면 된다. 

-  새로운 방식 ? : 참조(값 전달 처럼 편리하게 사용하고, 주소 전달처럼 주소값을 이용해 진짜를 건드리는 방식)

참조 

void PrintinfoByRef(Statinfo &info)
{
    cout << " HP : " << info.hp << endl;
    cout << " Attack : " << info.attack << endl;
    cout << " Defence : " << info.defence << endl;
}
int main()
{
    int number = 1;

    int *pointer = &number;
    *pointer = 2;

    // 실제 작동 방식은 int*와 똑같다. 근데 사용방식은 첫번째
    int &reference = number;
    reference = 3; // number에 3을 넣는다. 실제로 *pointer = 2; 와 동일하게 동작함.

    Statinfo info;
    CreateMonster(&info);

    PrintinfoByCopy(info);
    PrintinfoByPtr(&info);
    PrintinfoByRef(info);

        return 0;
}

- 참조의 작동 방식은 완벽하게 포인터와 동일하게 동작하지만 사용방식은 값 전달 방식을 이용한다.

- C++관점에서 number라는 바구니에 또 다른 이름(reference)을 부여하는것으로 생각하면된다. 앞으로 reference 바구니에다가 뭘 꺼내거나 넣을려면 실제 nuber바구니 그 값을 꺼내거나 넣으면 된다. 

- 이제 -> 기호를 안쓰고 바로 . 기호를 사용해 편하게 접근하자. [편의성 증가] 

유의사항

참조를 사용하면 편의성이 증가하지만 마냥 좋은 것은 아니다. 포인터를 주소를 넘기니 확실하게 원본을 넘긴다는 명시적인 문구가 있어 확인하기 쉽다. 하지만 참조는 값 전달 방식과 동일하게 사용하다 보니 이를 인지하지 못하고 가볍게 지나칠 수 있다.(메모리에 접근해 원본을 수정하는 것은 항상 주의해야하는 일!) 

 

이를 예방하기 위해 마음대로 못고치게 const를 붙이자. 어지간해서 참조는 const와 한 묶음이다. 

void PrintinfoByRef(const Statinfo &info)
{
    cout << " HP : " << info.hp << endl;
    cout << " Attack : " << info.attack << endl;
    cout << " Defence : " << info.defence << endl;
}