Cμ–Έμ–΄μ˜ κ½ƒπŸŒΉ(2)

@Super_E끌림·2024λ…„ 3μ›” 30일
post-thumbnail

Call by Value & Call by Reference

  • Call by Value
    : 값을 λΆ€λ₯Έλ‹€.
  • Call by Reference β†’ κ°€μ Έλ‹€ μ“΄λ‹€.
    : 참쑰둜 λΆ€λ₯Έλ‹€.

ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  λ•Œ λ§€κ°œλ³€μˆ˜λ₯Ό μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λƒμ— 따라 μœ„μ˜ 2κ°€μ§€ 방법 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Call by Value

λ³€μˆ˜μ˜ 데이터λ₯Ό λ³΅μ‚¬ν•΄μ„œ μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€.
μ½”λ“œλ‘œ μ‚΄νŽ΄λ³΄λ©΄

#include <stdio.h>

void swap(int a, int b){
	int temp;

	temp = a;
	a = b;
	b = temp;
}

int main(){
	int a, b;

	a = 10;
	b = 20;

	printf("swap μ „ : %d %d\n", a, b);
	
	swap(a,b);

	printf("swap ν›„ : %d %d\n", a, b);

	return 0;
}

//좜λ ₯
/*
---------------
swap μ „ : 10 20
swap ν›„ : 10 20
---------------
*/
  • swap(int a, int b){} : a와 b의 값을 μ„œλ‘œ λ°”κΏ”μ£ΌλŠ” ν•¨μˆ˜
  • swap(a,b); : swap ν•¨μˆ˜λ₯Ό a와 bλ₯Ό μ‚¬μš©ν•˜μ—¬ 호좜

큰 νλ¦„μ—μ„œ μ„€λͺ…ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.
λ¨Όμ € swap이 λ˜μ—ˆλŠ”μ§€ μ•ˆλ˜μ—ˆλŠ”μ§€ 확인을 μœ„ν•΄ printfλ₯Ό μ‚¬μš©ν•˜μ—¬ ν™•μΈν•©λ‹ˆλ‹€.

printf("swap μ „ : %d %d\n", a, b);
printf("swap ν›„ : %d %d\n", a, b);

swap ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ 2개의 숫자λ₯Ό μ„œλ‘œ 변경을 ν•©λ‹ˆλ‹€.

swap(a,b); //ν•¨μˆ˜ 호좜
    ⬇️ μ ‘κ·Ό
void swap(int a, int b){
	int temp;

	temp = a;
	a = b;
	b = temp;
}

μ½”λ“œκ°€ λ‹€ λ™μž‘ν•˜κ³  λ©”λͺ¨λ¦¬λ₯Ό 보면

        [λ©”λͺ¨λ¦¬]
 swap ν•¨μˆ˜     main ν•¨μˆ˜
----------   ----------
|   20   | a |   10   | a
----------   ----------
|   10   | b |   20   | b
----------   ----------

swap ν•¨μˆ˜ λ‚΄μ—μ„œλŠ” μ„œλ‘œ 변경이 λ˜μ—ˆμ§€λ§Œ main ν•¨μˆ˜λŠ” μ—¬μ „νžˆ swap μ „μ˜ κ°’μœΌλ‘œ μ €μž₯λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

Call by Reference

λ³€μˆ˜μ˜ μ£Όμ†Œλ₯Ό μ°Έμ‘°ν•΄μ„œ μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€.
μ½”λ“œλ‘œ μ‚΄νŽ΄λ³΄λ©΄

#include <stdio.h>
void swap(int *a, int *b){
	int temp;

	temp = *a;
	*a = *b;
	*b = temp;
}

int main(){
	int a, b;

	a = 10;
	b = 20;

	printf("swap μ „ : %d %d\n", a, b);

	swap(&a,&b);

	printf("swap ν›„ : %d %d\n", a, b);

	return 0;
}
//좜λ ₯
/*
---------------
swap μ „ : 10 20
swap ν›„ : 20 10
---------------
*/
  • swap(int *a, int *b){} : *a와 *b의 값을 μ„œλ‘œ λ°”κΏ”μ£ΌλŠ” ν•¨μˆ˜
  • swap(&a,&b); : swap ν•¨μˆ˜λ₯Ό &a와 &bλ₯Ό μ‚¬μš©ν•˜μ—¬ 호좜

μœ„μ—μ„œ μ‚¬μš©ν–ˆλ˜ λ°©μ‹κ³ΌλŠ” λ­”κ°€ λ‹€λ₯΄λ‹€λŠ” 것을 보싀 수 μžˆμŠ΅λ‹ˆλ‹€. β†’ 포인터 μ‚¬μš©!
κ·Έλž˜μ„œ Valueκ°€ μ•„λ‹ˆλΌ Reference라 λΆ€λ₯΄κ³  이λ₯Ό μ΄μš©ν•˜κ²Œ 되면 μœ„μ—μ„œμ™€ λ‹€λ₯΄κ²Œ main ν•¨μˆ˜μ—μ„œλ„ 값이 μ„œλ‘œ λ°”λ€Œκ²Œ λ©λ‹ˆλ‹€.
μ΄λŠ” κ·Έ μ „μ˜ λ‚΄μš© Cμ–Έμ–΄μ˜ κ½ƒπŸŒΉ(1)μ—μ„œ λ³΄μ•˜λ˜ 포인터가 λ™μž‘ν•˜λŠ” 흐름을 μƒκ°ν•˜μ‹œλ©΄ λ°”λ‘œ(?) 이해가 λ˜μ‹€ κ²λ‹ˆλ‹€.

μ•žμ— κ°œλ…μ„ λ³΅μŠ΅ν• κ²Έ ν•΄μ„œ 쑰금 μžμ„Έν•˜κ²Œ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

  • *p = &a
    *λ₯Ό μ‚¬μš©ν•˜λ©΄ λ©”λͺ¨λ¦¬μ— μ €μž₯된 κ°’μ˜ μ£Όμ†Œλ₯Ό μ°Έμ‘°ν•΄μ„œ 값을 μ‚¬μš©ν•œλ‹€.

이λ₯Ό μ΄μš©ν•œ λ‹€λ₯Έ ν•¨μˆ˜μ—μ„œ 값을 λ°”κΎΈλŠ” 방법이 Call by Reference λ˜λŠ” Call by Adress라고도 ν•©λ‹ˆλ‹€.

swap(&a,&b);
	⬇️ μ ‘κ·Ό
void swap(int *a, int *b){
	int temp;

	temp = *a;
	*a = *b;
	*b = temp;
}

swapν•¨μˆ˜μ—μ„œ int *a = &a;, int *b = &b;둜 μ‚¬μš©ν•  수 있게 λ©λ‹ˆλ‹€.
비둝 λ‹€λ₯Έ ν•¨μˆ˜μ§€λ§Œ ν¬μΈν„°μ˜ νŠΉμ§•μ„ 보면 원본에 접근을 ν•˜λ‹ˆκΉŒ mainν•¨μˆ˜μ—μ„œλ„ 값이 μ„œλ‘œ λ³€κ²½ λ©λ‹ˆλ‹€.
이제 λ©”λͺ¨λ¦¬λ₯Ό 보면

        [λ©”λͺ¨λ¦¬]
 swap ν•¨μˆ˜     main ν•¨μˆ˜
----------   ----------
|   20   | a |   20   | a
----------   ----------
|   10   | b |   10   | b
----------   ----------

swap ν•¨μˆ˜μ™€ main ν•¨μˆ˜μ—μ˜ λ³€μˆ˜ a,bλŠ” λ˜‘κ°™μ€ 값을 κ°€μ§€κ²Œ λ©λ‹ˆλ‹€.



0개의 λŒ“κΈ€