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;
}
'Language > C++' 카테고리의 다른 글
[C++] OOP(객체지향)의 특성 - 상속성(inheritance) (0) | 2022.06.06 |
---|---|
[C++] OOP(객체지향)의 개념 (0) | 2022.06.06 |
[C++] 포인터 실습 (0) | 2022.06.05 |
[C++] 포인터 (0) | 2022.06.05 |
[C++] 메모리 구조 (0) | 2022.06.05 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!