CS

call by value vs call by reference

deo2kim 2020. 10. 11. 20:47
๋ฐ˜์‘ํ˜•

๐Ÿ“” call by value vs call by reference ์ •์˜

  • call by value: ๊ฐ’์— ์˜ํ•œ ํ˜ธ์ถœ
  • call by reference: ์ฐธ์กฐ์— ์˜ํ•œ ํ˜ธ์ถœ

๐Ÿ“” call by value vs call by reference ์ฐจ์ด

  • ๊ฐ์ฒด์—๋Š” ๊ฐ’๊ณผ ์ฃผ์†Œ๊ฐ€ ์žˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์‹ค์ œ๋กœ ๊ฐ’๋งŒ ๋ณด๊ณ  ์žˆ์ง€๋งŒ ์ฃผ์†Œ๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
c = 20
print(f'๊ฐ’: {c}')  # ๊ฐ’: 20
print(f'์ฃผ์†Œ: {id(c)}')  # ์ฃผ์†Œ: 140734032078064
  • ์–ด๋–ค ํ•จ์ˆ˜์— argument๋ฅผ ์ „๋‹ฌ ํ•  ๋•Œ call by value ์™€ call by reference๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • call by value์˜ ๊ฒฝ์šฐ ํ•จ์ˆ˜์— ๊ฐ’์„ ์ „๋‹ฌํ•ด์„œ ๊ทธ ํ•จ์ˆ˜์•ˆ์—์„œ ํ•ด๋‹น ๊ฐ’์„ ๋ฐ”๊พผ๋‹ค๋ฉด?
    • ๊ธฐ์กด์˜ ๊ฐ’์€ ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค. 
    • ์šฐ๋ฆฌ๋Š” ๊ฐ’๋งŒ ๋ณต์‚ฌํ–ˆ๋‹ค. ์ฆ‰, ์ฃผ์†Œ๋Š” ๋‹ค๋ฆ„
    • ๊ธฐ์กด์˜ ๊ฐ’๊ณผ ์„œ๋กœ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ „ํ•˜๋‹ค. ์›๋ž˜์˜ ๊ฐ’์„ ๋ณด์กดํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ•˜์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ๋Ÿ‰์ด ๋Š˜์–ด๋‚œ๋‹ค. ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉด ๋ณ„๋กœ ์ข‹์ง€ ์•Š๋‹ค.
  • call by reference์˜ ๊ฒฝ์šฐ ํ•จ์ˆ˜์— ๊ฐ’์„ ์ „๋‹ฌํ•ด์„œ ๊ทธ ํ•จ์ˆ˜์•ˆ์—์„œ ํ•ด๋‹น ๊ฐ’์„ ๋ฐ”๊พผ๋‹ค๋ฉด?
    • ๊ธฐ์กด์˜ ๊ฐ’ ๋˜ํ•œ ๋ฐ”๋€๋‹ค.
    • call by reference ๋Š” ๊ฐ’๊ณผ ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ๋‹ค. ์ฆ‰, ๊ฐ™์€ ๊ฐ์ฒด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
    • ๊ธฐ์กด์˜ ๊ฐ’๊ณผ ์„œ๋กœ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค. ์œ„ํ—˜ํ•˜๋‹ค.
    • ํ•˜์ง€๋งŒ ์ฐธ์กฐ๋งŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค.

๐Ÿ“” call by assignment with python

  • ํ•˜์ง€๋งŒ ํŒŒ์ด์„ ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๊ฐœ๋…์ด ๋”ฐ๋กœ ์กด์žฌ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์šฐ๋ฆฌ๊ฐ€ ์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ์ฒด๊ฐ€ ์›๋ž˜ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ฐธ์กฐ๋ฐฉ์‹์— ๋”ฐ๋ผ ๊ฒฐ์ •๋œ๋‹ค.
    • mutable: list, dict, set
    • immutable: str, int, tuple
  • mutableํ•œ ๊ฐ์ฒด๋Š” call by reference๋ฅผ
  • immutableํ•œ ๊ฐ์ฒด๋Š” call by value๋ฅผ ๋”ฐ๋ฅธ๋‹ค.

๐Ÿ“” call by assignment ์˜ˆ์ œ

# immutable: str, int, tuple
# ํ•จ์ˆ˜์— ๋„ฃ๊ณ  ๊ฐ’์„ ๋ฐ”๊ฟ”๋„ ์›๋ž˜์˜ ๊ฐ’์€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.
def immu(a):
    a += 10
    print(f'ํ•จ์ˆ˜์— ๋„ฃ๊ณ  ๋ฐ”๊พผ ๊ฐ’: {a}, ์ฃผ์†Œ: {id(a)}')
    return a


a = 10
print(f'์ดˆ๊ธฐ ๊ฐ’: {a}, ์ฃผ์†Œ: {id(a)}')
immu(a)
print(f'ํ•จ์ˆ˜ ์‹คํ–‰ ํ›„ ๊ฐ’:{a}, ์ฃผ์†Œ: {id(a)}')

'''
์ดˆ๊ธฐ ๊ฐ’: 10, ์ฃผ์†Œ: 140734032077744
ํ•จ์ˆ˜์— ๋„ฃ๊ณ  ๋ฐ”๊พผ ๊ฐ’: 20, ์ฃผ์†Œ: 140734032078064
ํ•จ์ˆ˜ ์‹คํ–‰ ํ›„ ๊ฐ’:10, ์ฃผ์†Œ: 140734032077744
'''


# mmutable: list, dict, set
def mu(b):
    b.append(20)
    print(f'ํ•จ์ˆ˜์— ๋„ฃ๊ณ  ๋ฐ”๊พผ ๊ฐ’: {b}, ์ฃผ์†Œ: {id(b)}')
    return b


b = [10]
print(f'์ดˆ๊ธฐ ๊ฐ’: {b}, ์ฃผ์†Œ: {id(b)}')
mu(b)
print(f'ํ•จ์ˆ˜ ์‹คํ–‰ ํ›„ ๊ฐ’:{b}, ์ฃผ์†Œ: {id(b)}')

'''
์ดˆ๊ธฐ ๊ฐ’: [10], ์ฃผ์†Œ: 2389478957704
ํ•จ์ˆ˜์— ๋„ฃ๊ณ  ๋ฐ”๊พผ ๊ฐ’: [10, 20], ์ฃผ์†Œ: 2389478957704
ํ•จ์ˆ˜ ์‹คํ–‰ ํ›„ ๊ฐ’:[10, 20], ์ฃผ์†Œ: 2389478957704
'''
  • immutable์˜ ๊ฒฝ์šฐ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ€ ๋‹ค๋ฅด๊ณ , mutable์˜ ๊ฒฝ์šฐ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ€ ๊ฐ™์€ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐ’ ๋˜ํ•œ ๋‹ฌ๋ผ์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค
๋ฐ˜์‘ํ˜•