※ C / C++을 이미 알고 있으나 개인적인 공부를 위해 포스팅 하는 글이므로
C++에 대한 구체적인 정보를 담고 있지 않습니다.
▶ 변수를 전달하는 방식을 살펴보자
1. 값 전달 방식
void PrintInfoByCopy(StatInfo info)
{
cout << "----------------------" << endl;
cout << "hp : " << info.hp << endl;
cout << "att : " << info.attack << endl;
cout << "def : " << info.defence << endl;
cout << "----------------------" << endl;
}
ㆍ 값 전달 방식은 지난 시간에 살펴봤듯 복사가 일어난다.
ㆍ 무언가를 return을 해주거나 하는것이 아니라면 실제 원본 객체엔 영향을 주지 않는다.
ㆍ 어셈블리로 확인해봐도 바로 알 수 있다. (지난 포스팅에서 다뤘으므로 다시 하진 않겠다)
ㆍ 만약 StatInfo가 100000바이트 짜리 구조체였다고 했다면?
ㆍ 값 전달 방식은 복사가 100000바이트 만큼 일어나는거다. (성능꾸짐)
2. 주소 전달 방식
void PrintInfoByPtr(StatInfo* info)
{
cout << "----------------------" << endl;
cout << "hp : " << info->hp << endl;
cout << "att : " << info->attack << endl;
cout << "def : " << info->defence << endl;
cout << "----------------------" << endl;
}
ㆍ 주소 전달 방식은 복사가 일어나지 않고 원본 객체를 건들기 때문에 4 혹은 8바이트만 있으면 된다.
ㆍ 이또한 어셈블리는 지난시간에 확인했으므로 따로 확인하지 않겠다.
ㆍ 그렇다면 참조방식은 어떨가?
3. 참조 전달 방식
void PrintInfoByRef(StatInfo& info)
{
cout << "----------------------" << endl;
cout << "hp : " << info.hp << endl;
cout << "att : " << info.attack << endl;
cout << "def : " << info.defence << endl;
cout << "----------------------" << endl;
}
ㆍ 값 전달처럼 사용할 수 있고 (-> 이 아닌 .), 주소전달처럼 주소값을 이용해 진퉁을 건들여 주는 구조이다.
※ 참조란? 참조 전달?
int main()
{
int num = 1;
int* pointer = #
*pointer = 2;
//----------------------------------------------------------
int& reference = num;
reference = 3; //num과 같은 주소를 공유하기에 num도 3으로 변함
StatInfo info;
PrintInfoByCopy(info);
PrintInfoByPtr(&info);
PrintInfoByRef(info);
return 0;
}
※ 먼저 int num 을 살펴보자
1. 4바이트 정수형 바구니를 사용할거야
2. 앞으로 그 바구니 이름을 num이라 할게.
3. 그러니까 num에서 뭘 꺼내거나 num에 뭘 넣는다 하면
4. 찰떡같이 알아듣고 해당 주소(data,stack,heap)에 1을 넣어줘
※ 다음으로 pointer을 살펴보자
1. " * " 은 주소를 담는바구니
2. int그 바구니를 따라가면 int 데이터(바구니)가 있음
※ 마지막으로 reference를 살펴보자
1. num이라는 바구니에 또 다른 이름을 부여한 것
2. num 라는 바구니에 reference라는 다른 이름을 지어줄게 (별명)
3. 앞으로 reference 바구니에다가 뭘 꺼내거나 넣으면
4. 실제 num바구니(찐퉁)에다가 그 값을 꺼내거나 넣은것이 됨
▶ 어셈블리 확인
ㆍ 포인터와 레퍼런스는 어셈블리 관점에서는 실제 작동 방식이 똑같다는걸 확인할 수 있다
'C++프로그래밍 > C 와 C++ 기초실습' 카테고리의 다른 글
배열과 포인터 (문자열) (0) | 2024.09.18 |
---|---|
포인터와 참조타입 비교,차이 (const pointer) (0) | 2024.09.18 |
포인터 실습 해보기 (일반return과 포인터를 이용한 원본객체 조정) (0) | 2024.09.17 |
포인터 연산 (0) | 2024.09.17 |
포인터 (0) | 2024.09.17 |