Call by value, Call by reference, Call by assignment

Call by value , Call by reference, Call by assignment

ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ์—, ์šฐ๋ฆฌ๋Š” ๊ฐ’์— ์˜ํ•œ ํ˜ธ์ถœ์„ ํ•˜๊ธฐ๋„ํ•˜๊ณ  ์ฐธ์กฐ์— ์˜ํ•œ ํ˜ธ์ถœ์„ ํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ์•ˆ์—์„œ๋Š” ํ•จ์ˆ˜๋ฅผ ์œ„ํ•œ ๊ณต๊ฐ„์ด ์ƒ์„ฑ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ, ํ•ด๋‹น ๊ณต๊ฐ„์€ ์‚ฌ๋ผ์ง„๋‹ค.

Stack Frame : ํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ ํ• ๋‹น๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก(์ง€์—ญ๋ณ€์ˆ˜์˜ ์„ ์–ธ์œผ๋กœ ํ• ๋‹น๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก)

int    main(void)
{
    // ์Šคํƒ๋ณ€์ˆ˜ a๋Š” Stack Frame์— ์ง€์—ญ๋ณ€์ˆ˜๋กœ์„œ ํ• ๋‹น์ด ๋œ๋‹ค.
    int    a;

    a = 4;
    return (0);
}

Call by value

Call-by-value๋Š” ๋ง ๊ทธ๋Œ€๋กœ ๊ฐ’์— ์˜ํ•œ ํ˜ธ์ถœ์ด๋‹ค. Call-by-value๋Š” ์ธ์ž๋กœ ๋ฐ›์€ ๊ฐ’์„ ๋ณต์‚ฌํ•˜์—ฌ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š”๋ฐ,

๋ณต์‚ฌ๋œ ์ธ์ž๋Š” ํ•จ์ˆ˜ ์•ˆ์—์„œ ์ง€์—ญ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” local value(์ง€์—ญ๋ณ€์ˆ˜)๊ฐ€ ๋œ๋‹ค.

#include <stdio.h>

int    add(int a, int b)
{
    printf("a_ptr = %p\n", &a);
    printf("b_ptr = %p\n", &b);
    return (a + b);
}

int    main()
{
    int    a = 4;
    int    b = 6;
    int    c = add(a, b);

    printf("a_ptr = %p\n", &a);
    printf("b_ptr = %p\n", &b);
    return (0);
}

// ์ฃผ์†Œ๊ฐ’์ด ๋‹ค๋ฅด๋‹ค.
/***************************
a_ptr = 0x16b76322c
b_ptr = 0x16b763228
a_ptr = 0x16b763268
b_ptr = 0x16b763264
***************************/

Call by reference

Call-by-reference๋Š” ์ฐธ์กฐ์— ์˜ํ•œ ํ˜ธ์ถœ์ด๋‹ค. ๋ณ€์ˆ˜์˜ ๋ ˆํผ๋Ÿฐ์Šค(์ฃผ์†Œ)๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌํ•ด์„œ

์ธ์ž๋กœ ์ „๋‹ฌ๋œ ๋ณ€์ˆ˜์˜ ๊ฐ’๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ตฌ์กฐ์ƒ Call-by-value์— ๋น„ํ•ด ๋ฉ”๋ชจ๋ฆฌ์ ์ธ ์šฐ์œ„๊ฐ€ ์žˆ๋‹ค๊ณ ๋Š” ํ•˜์ง€๋งŒ, ์š”์ฆ˜์—๋Š” ๊ธฐ๊ธฐ์˜ ์„ฑ๋Šฅ์ด ๋‹ค ์ข‹์•„์„œ ํฐ ์ƒ๊ด€์€ ์—†๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋งŽ์€ ์—ฐ์‚ฐ์ด ๋“ค์–ด๊ฐ”์„ ๋•Œ์—๋Š” Call-by-value๋Š” ๊ณผ๋ถ€ํ•˜์˜ ์›์ธ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜๋Œ€๋กœ Call-by-value๋Š” ์›๋ž˜ ๋ณ€์ˆ˜๋ฅผ ํ„ฐ์น˜ํ•˜์ง€ ์•Š๊ณ  ๋ณต์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.


Call by assignment

Python์˜ ๊ฒฝ์šฐ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ๋ฐฉ์‹์œผ๋กœ call-by-assignment๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๋ชจ๋“  ๊ฒƒ์„ ๊ฐ์ฒด๋กœ ์ทจ๊ธ‰ํ•˜๋Š” Python์—์„œ๋Š” ๊ฐ์ฒด๋ฅผ ํฌ๊ฒŒ ๋‘ ์ข…๋ฅ˜๋กœ ๊ตฌ๋ถ„์ง€์„ ์ˆ˜ ์žˆ๋‹ค.

  1. Immutable : int, float, str, tuple

  2. Muttable : list, dict, set

Immutable ๊ฐ์ฒด๊ฐ€ ์ธ์ž๋กœ ์ „๋‹ฌ๋˜๋ฉด ์ฒ˜์Œ์—๋Š” call by reference๋กœ ๋ฐ›์ง€๋งŒ, ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œํ‚ค๋ฉด call by value๋กœ ๋™์ž‘ํ•œ๋‹ค.์ฆ‰ ํ•จ์ˆ˜ ๋‚ด์—์„œ formal parameter ๊ฐ’์ด ๋ฐ”๋€Œ์–ด๋„ actual parameter๋Š” ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•œ๋‹ค.

๋ฐ˜๋Œ€๋กœ Muttable ๊ฐ์ฒด๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ call by reference๋กœ ๋™์ž‘ํ•œ๋‹ค.

Last updated