C++프로그래밍/C 와 C++ 기초실습

참조타입

season97 2024. 9. 18. 10:28

※ 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 = &num;
	*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바구니(찐퉁)에다가 그 값을 꺼내거나 넣은것이 됨

&num이자 reference의 메모리

 

 

▶ 어셈블리 확인

ㆍ 포인터와 레퍼런스는 어셈블리 관점에서는 실제 작동 방식이 똑같다는걸 확인할 수 있다