[C/C++] Call-By-Value VS Call-By-Reference

반응형
반응형

* 개인적인 공부 내용을 기록하는 용도로 작성한 글 이기에 잘못된 내용을 포함하고 있을 수 있습니다.

 

#1 값에 의한 전달 Call-By-Value

#2 참조에 의한 전달 Call-By-Reference


#1 값에 의한 전달 Call-By-Value

Call-By-Value 방식은 인자로 넘기는 값을 "복사"하여 함수에 넘겨주는 방식입니다.  즉, 값의 복사에 의한 함수 호출을 의미합니다.

다음 코드는 main() 함수에서 doSomething 함수로 x의 값 5를 전달해 출력하는 예제입니다. 

유의해야 할 점은 x가 직접 전달되는 것이 아닌 x의 값 "5"만이 전달되는 것으로 doSomething 함수의 파라미터 x와 main() 함수의 x는 서로 다른 메모리에 할당되어 있습니다. 따라서, 각 함수에서 x의 주소값을 출력해보면 전혀 다른 주소가 출력됩니다.

// int x 메모리 선언.
// int x 메모리에 값이 복사가 되어 초기화
// Call-By-Value
void doSomething(int x) {
	cout << "doSomething() " << x << " " << &x << endl;
}

int main(){
	// call-by-value
    	int x = 5;
	doSomething(x); // x가 직접 전달되는 것이 아니라, x의 값 "5"만이 전달된다
	cout << "main() " << x << " " << &x << endl;
	return 0;
}

 

doSomething() 5 0x7ffc942b605c
main() 5 0x7ffc942b6074

값에 의한 전달은 값을 복사해서 전달하기에, "원본의 값에 영향을 미칠 수 없으며", 값을 넘겨줄 때 마다 새로운 메모리를 복사해 할당해야 하기에 복사손실 문제를 지니고 있습니다.

아래 코드와 같이 doSomething 함수에서 x의 값을 6으로 변경해도 main 함수부에는 전혀 영향을 끼치지 못함을 확인할 수 있습니다.

// int x 메모리 선언.
// int x 메모리에 값이 복사가 되어 초기화
// Call-By-Value
void doSomething(int x) {
	x = 6;
	cout << "doSomething() " << x << " " << &x << endl;
}


int main(){
	// call-by-value
	int x= 5;
	doSomething(x); 
	cout << "main() " << x << " " << &x << endl;
	return 0;
}
doSomething() 6 0x7ffe7651420c
main() 5 0x7ffe76514224

 

#2 참조에 의한 전달 Call-By-Reference

Call-By-Reference 방식은 함수의 인자에 변수 자체를 즉, 주소값을 넘겨주는 방식입니다. 변수의 주소를 넘겨주기에, Call-By-Value 방식과 달리 원본의 값에 직접 영향을 미칩니다.

다음 코드는 main() 함수부에서 addOne() 함수로 직접 y의 주소를 넘겨 y의 값을 1 더해주는 예제입니다.

출력 결과를 확인해보면 main() 함수의 y의 값도 6으로 증가해 있음을 확인할 수 있습니다. 또한 addOne에서의 y와 main()에서의 y의 주소가 동일합니다.

// Call-By-Reference
void addOne(int &y) {
	y = y + 1;
	cout << "addOne() " << y << " " << &y << endl;
}

int main(){
	// call-by-ref
	int y = 5;
	addOne(y);
   	cout << "main() " << y << " " << &y << endl;
	return 0;
}
addOne() 6 0x7ffd933425d4
main() 6 0x7ffd933425d4

 

Call-By-Value 와 Call-By-Reference 방식의 특징에 대해 정리하고 마치도록 하겠습니다.

Call-By-Value 방식은 원본의 데이터에 영향을 끼칠 수 없고, 값을 넘겨줄 때 마다 매번 새로운 메모리를 할당해야 하기에, 복사손실 문제를 갖고 있다는 단점을 가지고 있습니다.

Call-By-Reference 방식은 원본의 데이터에 영향을 끼칠 수 있으며, 직접 주소를 넘겨주는 방식이기에 새로운 메모리를 할당할 필요가 없어 복사손실 문제에서 자유롭다는 장점을 가지고 있습니다.

반응형

댓글

Designed by JB FACTORY