μ–Έμ–΄/C

[Cμ–Έμ–΄] call-by-value VS call-by-reference

SOo β€’ 2023. 2. 17. 01:06

πŸ’• call-by-value VS call-by-reference

 

ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ λ‹¨μˆœνžˆ 값을 μ „λ‹¬ν•˜λŠ” ν˜•νƒœμ˜ ν•¨μˆ˜ν˜ΈμΆœμ„ κ°€λ¦¬μΌœ Call-by-value라 ν•˜κ³ , λ©”λͺ¨λ¦¬μ˜ 접근에 μ‚¬μš©λ˜λŠ” μ£Όμ†Œ 값을 μ „λ‹¬ν•˜λŠ” ν˜•νƒœμ˜ ν•¨μˆ˜ν˜ΈμΆœμ„ call-by-reference라 ν•œλ‹€. 

 


[ call-by-value VS call-by-reference]

 

πŸ™Œ 예제 1)

λ³€μˆ˜ num에 μ €μž₯된 κ°’μ˜ μ œκ³±μ„ κ³„μ‚°ν•˜λŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜κ³ , 이λ₯Ό ν˜ΈμΆœν•˜λŠ” main ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄λ³΄μž. 단, μ—¬κΈ°μ„œλŠ” λ‹€μŒ 두 κ°€μ§€μ˜ ν˜•νƒœλ‘œ ν•¨μˆ˜λ₯Ό μ •μ˜ν•΄μ•Ό ν•œλ‹€.

  • call-by-value 기반의 SquareByValue ν•¨μˆ˜
  • call-by-reference 기반의 SquareByReference ν•¨μˆ˜ 

SquareByValue ν•¨μˆ˜λŠ” 인자둜 μ „λ‹¬λœ κ°’μ˜ μ œκ³±μ„ λ°˜ν™˜ν•΄μ•Ό ν•˜λ©°, SquareByReference ν•¨μˆ˜λŠ” μ •μˆ˜κ°€ μ €μž₯λ˜μ–΄ μžˆλŠ” λ³€μˆ˜μ˜ μ£Όμ†Œ 값을 인자둜 λ°›μ•„μ„œ ν•΄λ‹Ή λ³€μˆ˜μ— μ €μž₯된 κ°’μ˜ μ œκ³±μ„ κ·Έ λ³€μˆ˜μ— λ‹€μ‹œ μ €μž₯ν•΄μ•Ό ν•œλ‹€. 

 

 

πŸ€¦β€β™€οΈ μƒκ° κ³Όμ •

1. SquarByValue ν•¨μˆ˜λŠ” κ·Έλƒ₯ λ°›λŠ” 값을 num * num 을 μ΄μš©ν•˜μ—¬ λ§Œλ“€λ©΄ 될 것 κ°™κ³  ReferenceλŠ” μ£Όμ†Œκ°’μ„ ν™œμš©ν•˜μ—¬ λ§Œλ“€μž. 단, κ³„μ‚°μ‹œμ— μ£Όμ†Œκ°’μ„ κ³±ν•˜λŠ”κ²ƒμ΄ μ•„λ‹Œ λ³€μˆ˜μ— μ£Όμ†Œκ°’μ„ λ„£μ–΄ λ³€μˆ˜λΌλ¦¬μ˜ 곱을 λ§Œλ“€μž

 

λ‚΄κ°€ μƒκ°ν•œ λ‹΅

 

#include <stdio.h>

int SquareByValue(int num)
{
	return num * num;
}

void SquareByReference(int *ptr)
{
	int num = *ptr;
	*ptr = num * num;
}
int main()
{
	int num = 10;
	printf("%d \n", SquareByValue(num));
	SquareByReference(&num);
	printf("%d \n", num);
	return 0;
}

 

 


 

 

 

πŸ™Œ 예제 2)

μ„Έ λ³€μˆ˜μ— μ €μž₯된 값을 μ„œλ‘œ λ’€λ°”κΎΈλŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•΄λ³΄μž. 예λ₯Ό λ“€μ–΄μ„œ ν•¨μˆ˜μ˜ 이름이 Swap3라 ν•˜λ©΄, λ‹€μŒμ˜ ν˜•νƒœλ‘œ ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜μ–΄μ•Ό ν•œλ‹€.

  • Swap3(&num1,&num2,&num3);

그리고 ν•¨μˆ˜ν˜ΈμΆœμ˜ 결과둜 num1에 μ €μž₯된 값은 num2에, num2에 μ €μž₯된 값은 num3에, 그리고 num3에 μ €μž₯된 값은 num1에 μ €μž₯λ˜μ–΄μ•Ό ν•œλ‹€.

 

πŸ€¦β€β™€οΈ μƒκ° κ³Όμ •

1. μ €μž₯된 값을 λ°”κΏ”μ•Ό ν•˜λ‹ˆ μƒˆλ‘œμš΄ λ³€μˆ˜ tempλ₯Ό ν™œμš©ν•˜μ—¬ 수λ₯Ό λŒ€μž…ν•΄μ€€λ‹€. 

2. λ‹¨μˆœ κ°’ 변경이 μ•„λ‹Œ μ£Όμ†Œκ°’μ„ λ³€κ²½ν•˜κΈ° μœ„ν•΄ μ£Όμ†Œκ°’μ— μ ‘κ·Όν•œλ‹€. 즉, λ³€μˆ˜λ₯Ό λ°›μ„λ•Œμ—λ„ 포인터 μ£Όμ†Œκ°’μ„ λ°›λŠ”λ‹€. 

 

λ‚΄κ°€ μƒκ°ν•œ λ‹΅

#include <stdio.h>

int Swap3(int* ptr1, int* ptr2, int* ptr3)
{
	int temp = *ptr1;
	*ptr1 = *ptr2;
	*ptr2 = *ptr3;
	*ptr3 = temp;
}
int main()
{
	int num1 = 10, num2 = 20, num3 = 30;
	Swap3(&num1, &num2, &num3);
	printf("%d %d %d", num1, num2, num3);

}