๊ฐœ๋ฐœ์ž HOON
๐Ÿ› HOON DEVLog
๊ฐœ๋ฐœ์ž HOON
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๐Ÿ˜Ž ์ „์ฒด ์นดํ…Œ๊ณ ๋ฆฌ (137)
    • ๐Ÿ“ ์‹ ์ž… ์ธํ„ฐ๋ทฐ ์ค€๋น„ (7)
    • ๐Ÿฆ” ์ทจ์—…์ค€๋น„ ๊ธฐ๋ก (7)
    • โ˜• ์ž๋ฐ” : JAVA (5)
    • ๐Ÿ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋Œ€๋น„ : PS (80)
    • ๐ŸŒฑ ๋ฐฑ์—”๋“œ : Backend (13)
    • ๐Ÿงช ์ปดํ“จํ„ฐ๊ณผํ•™ : CS (11)
    • ๐Ÿ—‚ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค : DB (1)
    • ๐Ÿƒ‍โ™‚๏ธ DEVLOG (8)
    • โš™๏ธ Trouble Shooting (5)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • GitHub
  • Resume

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
๊ฐœ๋ฐœ์ž HOON

๐Ÿ› HOON DEVLog

[๊ฐœ๋ฐœ๊ณตํ†ต] Call by value์™€ Call by reference (Java, Python, C/C++)
๐Ÿงช ์ปดํ“จํ„ฐ๊ณผํ•™ : CS

[๊ฐœ๋ฐœ๊ณตํ†ต] Call by value์™€ Call by reference (Java, Python, C/C++)

2022. 10. 11. 02:58

๐Ÿ 1. Call by value์™€ Call by reference๋ž€?

 

 Call by value์™€ Call by reference๋Š” ์‹ ์ž… ๊ฐœ๋ฐœ์ž ๊ธฐ์ˆ ๋ฉด์ ‘์—์„œ๋„ ์ž์ฃผ ๋‚˜์˜ฌ๋งŒํผ ๊ธฐ์ดˆ์ ์ด๋ฉด์„œ ์ค‘์š”ํ•œ ๊ฐœ๋…์ด๋‹ค.

ํ•„์ž๋„ ๋ชจ ์ธํ„ฐ๋ทฐ ์ค‘ ํ•ด๋‹น ์งˆ๋ฌธ์„ ๋ฐ›์€ ์ ์ด ์žˆ๋Š”๋ฐ, ๋ฉด์ ‘ ์ค€๋น„๋„ ์ž˜ ๋˜์ง€ ์•Š์•˜๊ณ  ๋‹นํ™ฉํ–ˆ๋˜ ํ„ฐ๋ผ ๋ถ€์กฑํ•˜๊ฒŒ ๋Œ€๋‹ตํ–ˆ๋˜ ๊ฒฝํ—˜์ด ์žˆ๋‹ค.

์ด๋Ÿฐ ์ผ์ด ๋‹ค์‹œ๋Š” ์—†๋„๋ก ์ œ๋Œ€๋กœ ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด์ž.

 

 ๋ฉ”์†Œ๋“œ์˜ ์ธ์ž๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋‰˜์–ด์ ธ์žˆ๋‹ค.

(๋ฌผ๋ก  ์ˆ˜๋งŽ์€ ์ธ์ž ์ „๋‹ฌ ๋ฐฉ์‹์ด ์žˆ์ง€๋งŒ, ๋Œ€ํ‘œ์ ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋‘ ๊ฐ€์ง€๋ฅผ ์˜๋ฏธํ•จ.)

 

ํ•˜๋‚˜๋Š” Call by Value๋กœ, ์ง์—ญํ•˜๋ฉด ๊ฐ’์— ์˜ํ•œ ์ „๋‹ฌ์— ํ•ด๋‹นํ•œ๋‹ค.

์‹ค์ œ ๊ฐ’(caller)๊ณผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ๊ฐ’(callee)์ด ๋ฉ”๋ชจ๋ฆฌ ์ธก๋ฉด์—์„œ ์‹ค์ œ ์„œ๋กœ ๋™์ผํ•˜์ง€ ์•Š๊ณ  ๊ฐ’์„ ๋ณต์‚ฌํ•˜์—ฌ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰, Call by Value ๋ฐฉ์‹์œผ๋กœ ๋ฉ”์†Œ๋“œ์˜ ์ธ์ž๋ฅผ ์ „๋‹ฌํ•œ ๊ฒฝ์šฐ ๋ฉ”์†Œ๋“œ ๋‚ด์—์„œ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋ฉด ๊ฐ’์„ ๋ณต์‚ฌํ•˜์—ฌ ์ „๋‹ฌํ•œ ๊ฒƒ(๋‘ ๋ณ€์ˆ˜๋Š” ๋‹ค๋ฅธ ๋ณ€์ˆ˜)์ด๋ฏ€๋กœ ์‹ค์ œ ๊ฐ’์„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

๋˜ ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” Call by reference๋กœ, ์ง์—ญํ•˜๋ฉด ์ฐธ์กฐ์— ์˜ํ•œ ์ „๋‹ฌ์ด๋‹ค. ํ˜ธ์ถœ์ž(caller)๊ณผ ํ˜ธ์ถœ ์ˆ˜์‹ ์ž(callee)๋กœ ์ „๋‹ฌํ•œ ๊ฐ’์ด ์•„์˜ˆ ๋™์ผํ•˜๋‹ค. ์ฆ‰ ๋ฉ”์†Œ๋“œ ๋‚ด๋ถ€์—์„œ ๊ฐ’์„ ๋ฐ”๊พธ๋ฉด, ์›๋ณธ์˜ ๊ฐ’๋„ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์ด ํŠน์ง•์ด๋‹ค.

 


 

๐Ÿ 2. ์–ธ์–ด๋ณ„ ์ธ์ˆ˜ ์ „๋‹ฌ ๋ฐฉ๋ฒ•

> 2-1. Java๋Š” ๋ฉ”์†Œ๋“œ์— ์ธ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์ „๋‹ฌํ•˜๋Š”๊ฐ€?

 

 ๋‹จ๋„์ง์ž…์ ์œผ๋กœ ๋งํ•˜๋ฉด, Java๋Š” Call by reference ๋ฐฉ์‹์€ ํ•˜๋‚˜๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์˜ค๋กœ์ง€ Call by Value์— ์˜ํ•ด ๋ฉ”์†Œ๋“œ์— ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์„ ์ฑ„ํƒํ•œ๋‹ค.

 

์ž๋ฐ” ์ฐฝ์‹œ์ž์ธ ์ œ์ž„์Šค ๊ณ ์Šฌ๋ง์€ ์ˆ˜๋งŽ์€ ์ธ์ˆ˜์ „๋‹ฌ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ ์ž๋ฐ”์—๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ "call by value"๋งŒ์„ ์ฐธ๊ณ ํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค(ํ•˜๋‹จ ์ฐธ์กฐ). ๋นผ๋ฐ• ์ฐฝ์‹œ์ž ์˜คํ”ผ์…œ์ด์ง€๋งŒ, ๋ฉด์ ‘์—์„œ "์ฐฝ์‹œ์ž๊ฐ€ ๊ทธ๋Ÿฌ๋˜๋ฐ์š”?"๋ผ๊ณ  ํ•  ์ˆ˜๋Š” ์—†์œผ๋‹ˆ ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.

the Java authors choose to only include one simple idea - pass-by-value, with no default values or optional parameter (overloading often provides a satisfactory alternative), no variable length parameter lists (added finally in Java 5), no named parameters, no pass-by-reference, no const (a general Java issue) parameters, etc. 

-The Java Programming Language, 2nd ed. by Ken Arnold and James Gosling, section 2.6.1, page 40, 3rd paragraph.

 

1) ๊ธฐ๋ณธํ˜•์„ ์ „๋‹ฌํ•  ๋•Œ

์ž๋ฐ”์—์„œ์˜ ๊ธฐ๋ณธํ˜• ์ฆ‰, ์›์‹œ ๋ณ€์ˆ˜๋Š” ๋ฉ”์†Œ๋“œ์˜ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์œผ๋ฉด ์ง์ ‘ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋œ๋‹ค. ์›์‹œ ๋ฐ์ดํ„ฐ ์œ ํ˜•์˜ ๋ณ€์ˆ˜๊ฐ€ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋  ๋•Œ๋งˆ๋‹ค ๋ณต์‚ฌ๋˜์–ด ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์— ์ž์ฒด ๊ณต๊ฐ„์„ ์ถ•์ ํ•œ๋‹ค. 

 

์ด๋Ÿฌํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ˆ˜๋ช…์€ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ์—๋งŒ ์ง€์†๋˜๋ฉฐ ๋ฐ˜ํ™˜ ์‹œ ์Šคํƒ์—์„œ ์ง€์›Œ์ง€๊ณ  ๋ฒ„๋ ค์ง€๊ฒŒ ๋œ๋‹ค.

/*
https://www.baeldung.com/java-pass-by-value-or-pass-by-reference
*/
public class PrimitivesUnitTest {
 
    @Test
    public void whenModifyingPrimitives_thenOriginalValuesNotModified() {
        
        int x = 1;
        int y = 2;
       
        // Before Modification
        assertEquals(x, 1);
        assertEquals(y, 2);
        
        modify(x, y);
        
        // After Modification
        assertEquals(x, 1);
        assertEquals(y, 2);
    }
    
    public static void modify(int x1, int y1) {
        x1 = 5;
        y1 = 10;
    }
}

 

์œ„์˜ ์ฝ”๋“œ๋Š” Java์—์„œ ๊ธฐ๋ณธํ˜• ๋ณ€์ˆ˜๋ฅผ ๋ฉ”์†Œ๋“œ์˜ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ–ˆ์„ ๋•Œ call by value์ž„์„ ์ฆ๋ช…ํ•˜๋Š” ํ…Œ์ŠคํŠธ์ฝ”๋“œ์ด๋‹ค.

๋‚ด๋ถ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ทธ๋ฆผ์œผ๋กœ ํ™•์ธํ•ด๋ณด์ž.

 

์ถœ์ฒ˜ : https://www.baeldung.com/java-pass-by-value-or-pass-by-reference

 

์ฒ˜์Œ ๊ธฐ๋ณธํ˜• ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋ฉด Stack ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์„ฑ๋œ๋‹ค. ๊ทธ ์ดํ›„ modify๋ผ๋Š” ๋ฉ”์†Œ๋“œ์— x1๊ณผ y1์˜ ์ž๋ฆฌ์— x์™€ y๋ฅผ ์ „๋‹ฌํ•˜๋ฉด, x1๊ณผ x2๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ƒˆ๋กœ์ด ์ƒ์„ฑํ•˜๊ณ , x์˜ ๊ฐ’์„ ๋ณต์‚ฌํ•ด x1์œผ๋กœ, y์˜ ๊ฐ’์„ ๋ณต์‚ฌํ•ด y1์œผ๋กœ ์ „๋‹ฌํ•œ๋‹ค.

๊ทธ ํ›„ x1๊ณผ y1์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋”๋ผ๋„, x์™€ y์˜ ๊ฐ’์€ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์— ์ €์žฅ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ „ํ˜€ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

 

 

2) ์ฐธ์กฐํ˜•์„ ์ „๋‹ฌํ•  ๋•Œ

 

์ž๋ฐ”์˜ ๊ธฐ๋ณธํ˜• ๋ณ€์ˆ˜ 8๊ฐ€์ง€๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋‚˜๋จธ์ง€ ๋ณ€์ˆ˜๋Š” ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜์— ํ•ด๋‹นํ•œ๋‹ค. '์ฐธ์กฐํ˜•' ๋ณ€์ˆ˜๋ผ๋Š” ์ด๋ฆ„์„ ๋“ค์—ˆ์„ ๋•Œ, ์ฐธ์กฐ์— ์˜ํ•œ ํ˜ธ์ถœ์ด๋ž€ ์ด๋ฆ„์„ ๊ฐ€์ง„ call by reference ๋ฐฉ์‹์œผ๋กœ ์ „๋‹ฌํ•  ๊ฒƒ ๊ฐ™์ง€๋งŒ, call by value ๋ฐฉ์‹์œผ๋กœ ๊ฐ’์„ ์ „๋‹ค๋Ÿฌํ•˜๊ฒŒ ๋œ๋‹ค.

 

์šฐ์„ , ๊ธฐ๋ณธํ˜• ๋ณ€์ˆ˜์™€ ๋‹ค๋ฅด๊ฒŒ ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜๋Š” ๋‘ ๋‹จ๊ณ„์— ๊ฑธ์ณ์„œ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ๋‹ค.

JVM ๋‚ด๋ถ€ ๋ฉ”๋ชจ๋ฆฌ์—๋Š” ๋ฉ”์†Œ๋“œ ์˜์—ญ, ํž™ ์˜์—ญ, ๊ฐ ์“ฐ๋ ˆ๋“œ ๋‚ด์˜ ์Šคํƒ ์˜์—ญ์œผ๋กœ ์ด๋ค„์ ธ ์žˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ์ฐธ์กฐ ๋ณ€์ˆ˜๋Š” ์Šคํƒ ์˜์—ญ์— ์ €์žฅ๋˜๊ณ  ์ฐธ์กฐ๋˜๋Š” ๊ฐ์ฒด๋Š” ํž™ ์˜์—ญ์— ์ €์žฅ๋˜๊ฒŒ ๋œ๋‹ค. 

 

Foo a = new Foo();

 

์‰ฝ๊ฒŒ ๋ณด๋ฉด, a ๋ณ€์ˆ˜๊ฐ€ ์ฐธ์กฐ ๋ณ€์ˆ˜์— ํ•ด๋‹นํ•˜๊ณ , new๋กœ ์ƒˆ๋กœ์ด ์ƒ์„ฑํ•œ ์ธ์Šคํ„ด์Šค์ธ Foo()๊ฐ€ ์ฐธ์กฐ๋˜๋Š” ๊ฐ์ฒด์— ํ•ด๋‹นํ•œ๋‹ค.

 

class Example {
    public static void main(String[] args) {
        Person p = new Person(10);

        System.out.println("before : "+ p.age);

        getOlder(p);

        System.out.println("after : "+ p.age);
    }

    private static void getOlder(Person p){
        p.age++;
    }
}

/*
  ์ถœ์ฒ˜ : https://ecsimsw.tistory.com/entry/%EC%9E%90%EB%B0%94%EB%8A%94-Call-by-Value-%EC%9D%B4%EB%8B%A4
  before : 10
  after : 11
*/

 

์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด์ž.

getOlder๋ผ๋Š” ๋ฉ”์†Œ๋“œ์— ์ฐธ์กฐ ๋ณ€์ˆ˜์ธ p๋ฅผ ์ „๋‹ฌํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ์ž p.age์˜ ๊ฐ’์€ ๋ฉ”์†Œ๋“œ์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „์€ 10์ด ๋‚˜์˜ค๊ณ , ๋ฉ”์†Œ๋“œ๋ฅผ ๋น ์ ธ ๋‚˜์˜จ ํ›„๋Š” 11์ด ๋‚˜์™”๋‹ค.

 

์ด๊ฒƒ์„ ๋ณด๊ณ  call by reference๋กœ ํ—ท๊ฐˆ๋ ค ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฉ”๋ชจ๋ฆฌ ๊ด€์ ์—์„œ ๋ณด๋ฉด ์ „ํ˜€ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 

getOlder ๋ฉ”์†Œ๋“œ์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „ JVM์˜ ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ์ด๋‹ค. ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์˜ Stack ์˜์—ญ์— ์ฐธ์กฐ ๋ณ€์ˆ˜ p๊ฐ€ ์ €์žฅ๋œ๋‹ค. ์ด ์ฐธ์กฐ ๋ณ€์ˆ˜ p๋Š” ํž™์˜ ์ฃผ์†Œ ๊ฐ’์„ ๊ฐ–๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํž™ ๋‚ด์— ์ฐธ์กฐ ๋‹นํ•˜๋Š” ๋ณ€์ˆ˜์ธ p.age๊ฐ€ int ํ˜•ํƒœ๋กœ ์กด์žฌํ•œ๋‹ค.

 

์ด์ œ getOlder ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด๋ณด์ž.

 

getOlder์— ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜ p๊ฐ€ ๋“ค์–ด์˜ค๊ณ , call by value์— ์˜ํ•ด '์ฃผ์†Œ ๊ฐ’'์ด ๋ณต์‚ฌ๋œ๋‹ค.

์ฃผ์†Œ ๊ฐ’์„ ํƒ€๊ณ , heap ์˜์—ญ์˜ age๋ฅผ ๋ณ€๊ฒฝ์‹œ์ผฐ๋‹ค.

์ด์ œ getOlder์˜ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์ด ๋๋‚ฌ๋‹ค.

๋ฉ”์†Œ๋“œ์˜ ๋ชจ๋“  ๋ผ์ธ์˜ ๋ช…๋ น์ด ์‹คํ–‰๋˜๊ณ  ์ข…๋ฃŒ๋˜๋ฉด frame_getOlder ๋ถ€๋ถ„์€ ์‚ฌ๋ผ์ง„๋‹ค.

์ด๋•Œ frame_main์˜ p ๋ณ€์ˆ˜์—๋Š” ๋ณ€ํ™”๊ฐ€ ์žˆ๋Š”๊ฐ€?

์ž˜ ๋ณด๋ฉด, ํž™ ์˜์—ญ์˜ ์ฐธ์กฐ ๋‹นํ•˜๋Š” ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋ณ€ํ™”๋Š” ์žˆ์ง€๋งŒ, ์ฐธ์กฐ ๋ณ€์ˆ˜์˜ ๊ฐ’์€ ๋ณ€ํ™”๋œ ๊ฒƒ์ด ํ•˜๋‚˜๋„ ์—†๋‹ค.

main์˜ p์˜ ๊ฐ’์€ ๋ฉ”์†Œ๋“œ๋กœ ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ณ  ๋‚˜์„œ๋„ 0x0004๋กœ ๋™์ผํ•˜๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ, Java๋Š” call by value๋‹ค.

 

์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž๋ฉด, ๋‹ค์Œ ์˜ˆ์‹œ๋ฅผ ์ฐธ๊ณ ํ•ด๋ณด์ž.

class CallByValueExample {
    public static void main(String[] args) throws Exception{
        Person p = new Person(10);

        System.out.println("before : "+ p.age);

        changePerson(p);

        System.out.println("after : "+ p.age);
    }

    private static void changePerson(Person p){
        p = new Person(50);
    }
}

/*
https://ecsimsw.tistory.com/entry/%EC%9E%90%EB%B0%94%EB%8A%94-Call-by-Value-%EC%9D%B4%EB%8B%A4
*/

 

 

์œ„์˜ ๊ทธ๋ฆผ์€, changePerson ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ง‰ ํ˜ธ์ถœ๋˜์—ˆ์„ ๋•Œ์˜ ์ƒํ™ฉ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. call by value์ด๋ฏ€๋กœ, stack ์˜์—ญ์— ์ฐธ์กฐ๋ณ€์ˆ˜ p๋Š” ์ฃผ์†Œ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•˜์—ฌ ๊ฐ–๊ฒŒ ๋œ๋‹ค.

 

 

๊ทธ ํ›„, p = new Person(50);์„ ํ†ตํ•ด ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•˜๋ฉด ์œ„์™€ ๊ฐ™์€ ๊ตฌ์กฐ์ด๋‹ค.

์—ฌ๊ธฐ์„œ changePerson์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋œ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„(์ข…๋ฃŒ์‹œ frame_changePerson์€ stack์—์„œ ์‚ฌ๋ผ์ง), main์˜ p๊ฐ’์€ ๋ฐ”๋€Œ๋Š”๊ฐ€๋ฅผ ๋ณด๋ฉด ๊ทธ๋ ‡์ง€ ์•Š๋‹ค.

ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ p๋ฅผ ๋Œ€์ž…ํ•˜๋Š” ๊ฒƒ์œผ๋กœ main์˜ p ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ call by value์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 

> 2-2. Python์€ ๋ฉ”์†Œ๋“œ์— ์ธ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์ „๋‹ฌํ•˜๋Š”๊ฐ€?

 

ํŒŒ์ด์ฌ์€ ์กฐ๊ธˆ ๋‹ค๋ฅธ ํŒŒ๋ผ๋ฏธํ„ฐ ์ „๋‹ฌ ๋ฐฉ์‹์„ ๊ฐ–๊ณ  ์žˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ Call by Value์™€ Call by Reference๊ฐ€ ์žˆ๋‹ค๊ณ  ํ–ˆ์ง€๋งŒ, ๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜๋ฉด Python์€ Passed by Assignment, Call by object-reference๋ผ๊ณ  ํ•œ๋‹ค.

 

์ฆ‰, ๋„˜๊ฒจ์ง€๋Š” ๊ฐ์ฒด์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ์ „๋‹ฌ ๋ฐฉ์‹์ด ์กฐ๊ธˆ ๋‹ค๋ฅด๋‹ค.

์ด ๊ฐ์ฒด์˜ ์ข…๋ฅ˜๋Š” ๋ณ€ํ™”์˜ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋ถ„๋ฅ˜๋œ๋‹ค.

 

1) ๋ถˆ๋ณ€๊ฐ์ฒด (immutable variable) : int, float, string, tuple๊ณผ ๊ฐ™์ด ๋‹จ์ผ ๊ฐ’์ด๊ฑฐ๋‚˜ static ์†์„ฑ์„ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด

2) ๊ฐ€๋ณ€๊ฐ์ฒด (mutable variable) :  list, set, dict์™€ ๊ฐ™์ด ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด

 

 

ํŒŒ์ด์ฌ์˜ ํŠน์ง•์€ ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ์ฒด๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

์ผ๋ฐ˜์ ์ธ ๋‹ค๋ฅธ ์–ธ์–ด๋“ค๊ณผ ๋‹ฌ๋ฆฌ ๊ฐ’๋“ค์ด ๋ณ€์ˆ˜ ๋‚ด์— ์ €์žฅ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, 1, 2์™€ ๊ฐ™์€ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๋ณ€์ˆ˜๊ฐ€ ๊ทธ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•œ๋‹ค. ํ”ํžˆ ์ด๋ฆ„ํ‘œ๋ผ๋Š” ๋น„์œ ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. a = 1, c = 1์ด๋ฉด, 1์ด๋ผ๋Š” ํ•˜๋‚˜์˜ ๊ฐ์ฒด์— a์™€ c๋ผ๋Š” ์ด๋ฆ„ํ‘œ๊ฐ€ ๋‘๊ฐœ ๋ถ™์–ด์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

 

๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ func ๋ฉ”์†Œ๋“œ์— ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ–ˆ์„ ๋•Œ์˜ ์‚ฌ์ง„์ด๋‹ค.

func์— ์ง„์ž…ํ•˜๋ฉด์„œ 1์ด๋ผ๋Š” ๊ฐ์ฒด์— c๋ผ๋Š” ์ด๋ฆ„ํ‘œ๋„ ๋‹ฌ๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  c = 2๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด, 2๋ผ๋Š” ๊ฐ์ฒด๊ฐ€ ์ƒˆ๋กœ์ด ์ƒ์„ฑ๋˜๊ณ , c ์ด๋ฆ„ํ‘œ๋Š” 2์— ๋ถ™๊ฒŒ ๋œ๋‹ค.

์ด ๊ฒฐ๊ณผ, a๋Š” ๋ณ€ํ™”๊ฐ€ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒผ์„ ๋•Œ์—๋Š” call by value์™€ ๋น„์Šทํ•œ ํ˜•ํƒœ๋ฅผ ๊ฐ–๋Š”๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

์ด๋ฒˆ์—” ๊ฐ€๋ณ€ ๊ฐ์ฒด๋ฅผ ๋ฉ”์†Œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•ด๋ณด์ž.

๋ฆฌ์ŠคํŠธ๋Š” ๋‚ด๋ถ€์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐ€๋ณ€ ๊ฐ์ฒด์— ํ•ด๋‹นํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฆฌ์ŠคํŠธ์˜ ๋์— 5๋ฅผ appendํ•˜๋ฉด, 5๊ฐ€ ์ถ”๊ฐ€๋œ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋™์ผํ•œ id ๊ฐ’์„ ๊ฐ€์ง„ ๋ฆฌ์ŠคํŠธ์— 5๊ฐ€ ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ ๋ฟ์ด๋‹ค.

 

def func(arr):
    arr.append(5)

a = [1,2,3,4]
func(a)

์ด ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด, [1,2,3,4] ๋ฆฌ์ŠคํŠธ์— a๋ผ๋Š” ์ด๋ฆ„ํ‘œ๋ฅผ ๋‹ฌ์•˜๊ณ , ์ด๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊ฒจ์ฃผ์ž.

๊ทธ๋Ÿฌ๋ฉด [1,2,3,4]๋ผ๋Š” ๊ฐ์ฒด์— arr์ด๋ผ๋Š” ์ด๋ฆ„ํ‘œ๋„ ๋‹ฌ๊ฒŒ ๋˜๊ณ , ์ด arr ์ด๋ฆ„ํ‘œ๊ฐ€ ๋‹ฌ๋ฆฐ ๊ฐ์ฒด(๋ฆฌ์ŠคํŠธ) ๋์— 5๋ฅผ ์‚ฝ์ž…ํ•˜๊ฒŒ ๋œ๋‹ค.

๋ฉ”์†Œ๋“œ๊ฐ€ ๋๋‚˜๊ณ  local variable์ธ arr๊ฐ€ ์‚ฌ๋ผ์ง€๋”๋ผ๋„ a ์ด๋ฆ„ํ‘œ๊ฐ€ ๋‹ฌ๋ ค์žˆ๋Š” ๊ฐ์ฒด์˜ id๋Š” ๋™์ผํ•˜๋‹ค.

๋”ฐ๋ผ์„œ a = [1,2,3,4,5]๊ฐ€ ๋œ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” call by reference์™€ ๋น„์Šทํ•˜๊ฒŒ ๋ณด์ธ๋‹ค.

 

def func(arr):
    arr = [5,6]

a = [1,2,3,4]
func(a)

์ด ์ฝ”๋“œ๋Š” ์–ด๋–จ๊นŒ?

์—ญ์‹œ [1,2,3,4] ๋ฆฌ์ŠคํŠธ์— a๋ผ๋Š” ์ด๋ฆ„ํ‘œ๋ฅผ ๋‹ฌ๊ณ , func ๋ฉ”์†Œ๋“œ์— ์ง„์ž…ํ•  ๋•Œ ๋™์ผํ•œ ๋ฆฌ์ŠคํŠธ์— arr๋ผ๋Š” ์ด๋ฆ„ํ‘œ๋„ ๋‹ฌ๊ฒŒ ๋œ๋‹ค.

arr = [5,6]์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด, [5,6]์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , arr ์ด๋ฆ„ํ‘œ๋Š” ์ด ๋ฆฌ์ŠคํŠธ๋กœ ์˜ฎ๊ฒจ๊ฐ„๋‹ค.

method๊ฐ€ ์ข…๋ฃŒ๋œ ํ›„, local variable์ด ์‚ฌ๋ผ์ง„ ๊ฒฝ์šฐ, a์˜ ๊ฐ’์€ ์–ด๋– ํ•œ๊ฐ€?

 

์—ฌ์ „ํžˆ a = [1,2,3,4]๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์€ call by reference์™€๋Š” ๋งŽ์ด ๋‹ฌ๋ผ๋ณด์ธ๋‹ค.

๋”ฐ๋ผ์„œ Python์€ Call by value๋‚˜ Call by reference๊ฐ€ ์•„๋‹Œ Passed by Assignment, Call by object-reference์ด๋‹ค.

 

 

 

> 2-3. C/C++๋Š” ๋ฉ”์†Œ๋“œ์— ์ธ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์ „๋‹ฌํ•˜๋Š”๊ฐ€?

 

1. Call by Value

void CallByValue(int value)
{
	value = 20;
	std::cout << value << std::endl;	//value์˜ ๊ฐ’
	std::cout << &value << std::endl;	//value์˜ ์ฃผ์†Œ
}

int main()
{
	int num = 10;
	CallByValue(num);
	std::cout << num << std::endl;	//num์˜ ๊ฐ’
	std::cout << &num << std::endl;	//num์˜ ์ฃผ์†Œ

	return 0;
}

// ์ถœ์ฒ˜ : https://rehtorb-algorithm.tistory.com/11

 

CallByValue ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด, value๋Š” num์˜ ๊ฐ’์„ ๋ณต์‚ฌํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒˆ๋กœ์ด ์ƒ์„ฑ๋œ๋‹ค.

๊ทธ ํ›„ value์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฏ€๋กœ, main์˜ num์—๋Š” ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์ด ์—†๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๊ณ  value์™€ num์ด ์ €์žฅ๋œ ๊ฐ๊ฐ์˜ ์ฃผ์†Œ ๊ฐ’๋„ ๋‹ค๋ฅด๋‹ค.

 

 

2. Call by Address

void CallByAddress(int* address)
{
	*address = 20;
	std::cout << *address << std::endl;	//address๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ์˜ ๊ฐ’
	std::cout << &address << std::endl;	//address์˜ ์ฃผ์†Œ
}
int main()
{
	int num = 10;
	CallByAddress(&num);
	std::cout << num << std::endl;	//num์˜ ๊ฐ’
	std::cout << &num << std::endl;	//num์˜ ์ฃผ์†Œ

	return 0;
}

// ์ถœ์ฒ˜ : https://rehtorb-algorithm.tistory.com/11

 

๋‹ค์Œ์€ Call by Address ๋ฐฉ์‹์ด๋‹ค. CallByAddress ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด, address๋Š” num์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค. ๋‹ค๋ฅธ ๋ง๋กœํ•˜๋ฉด, address์™€ num์˜ ์ฃผ์†Œ๋Š” ์—„์—ฐํžˆ ๋‹ค๋ฅด๋‹ค.

 

์—ญ์ฐธ์กฐ ์—ฐ์‚ฐ์ž์ธ '*'๋ฅผ ์‚ฌ์šฉํ•ด *address๋กœ num์˜ ์ฃผ์†Œ์— ์ ‘๊ทผํ•ด ๊ฐ’์„ ๋ฐ”๊พธ๋ฉด, main์˜ num์—๋„ ์˜ํ–ฅ์ด ๊ฐ€ ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ๋‹ค.

๋’ค์— ๋‚˜์˜ค๋Š” Call by Reference์™€ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€, address์˜ ์ฃผ์†Œ์™€ num์˜ ์ฃผ์†Œ๋Š” ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

 

3. Call by Reference

void CallByReference(int& reference)
{
	reference = 20;
	std::cout << reference << std::endl;	//reference๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ์˜ ๊ฐ’
	std::cout << &reference << std::endl;	//reference์˜ ์ฃผ์†Œ
}
int main()
{
	int num = 10;
	CallByReference(num);
	std::cout << num << std::endl;	//num์˜ ๊ฐ’
	std::cout << &num << std::endl;	//num์˜ ์ฃผ์†Œ

	return 0;
}

// ์ถœ์ฒ˜ : https://rehtorb-algorithm.tistory.com/11

 

๋งˆ์ง€๋ง‰, Call by Reference์ด๋‹ค. ์ด ๊ฒฝ์šฐ CallByReference ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด, ๊ฐ’์„ ๋ณต์‚ฌํ•˜๊ฑฐ๋‚˜ ์ฃผ์†Œ'๊ฐ’'์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ reference๋Š” num์ด ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ์™€ ๊ณต์œ ํ•œ๋‹ค. 

 

๋”ฐ๋ผ์„œ ํ›„์— reference = 20์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด num๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ์™„์ „ํžˆ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— num์—๋„ ์˜ํ–ฅ์ด ๊ฐ„๋‹ค.

์ฆ‰, reference์˜ ์ฃผ์†Œ์™€ num์˜ ์ฃผ์†Œ๋Š” ๋™์ผํ•˜๋‹ค. (์ด ๋ถ€๋ถ„์ด call by address์™€ ๋‹ค๋ฅธ ์ )

 

 


 

๐Ÿ 3. ์š”์•ฝ

 

- ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์‹œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ „๋‹ฌ ๋ฐฉ๋ฒ•์€ ๋Œ€ํ‘œ์ ์œผ๋กœ Call by Value์™€ Call by Reference๊ฐ€ ์žˆ๋‹ค.

- Call by Value๋Š” ๊ฐ’์„ ๋ณต์‚ฌํ•ด ์ƒˆ๋กœ์ด ์Šคํƒ์— ํ• ๋‹นํ•œ๋‹ค.

- Call by Reference๋Š” caller์™€ callee ๋ชจ๋‘ ๋™์ผํ•œ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์ด๋‹ค.

- Java๋Š” ์˜ค๋กœ์ง€ Call by Value์ด๋‹ค.

- Python์€ Call by value๋‚˜ Call by reference๊ฐ€ ์•„๋‹Œ Passed by Assignment ์ด๋‹ค.

- C๋Š” ์˜ค๋กœ์ง€ Call by Value์ด๋‹ค (ํฌ์ธํ„ฐ๋Š” Call by Address์˜ ๊ฐœ๋…์œผ๋กœ, Call by Value ์ด๋‹ค.)

- C++์—์„  Call by Value์™€ Call by Address (ํฌ์ธํ„ฐ *), Call by Reference (์ฐธ์กฐ์—ฐ์‚ฐ์ž &)๊ฐ€ ๋ชจ๋‘ ์žˆ๋‹ค.

 

 

 

๐Ÿ˜Ž  ์ฐธ๊ณ  ์ž๋ฃŒ

 

[๋งํฌ] https://www.baeldung.com/java-pass-by-value-or-pass-by-reference (Pass-By-Value as a Parameter Passing Mechanism in Java)

[๋งํฌ] https://rehtorb-algorithm.tistory.com/11 ([C++] call by value, call by address, call by reference ์ฐจ์ด)

[๋งํฌ] https://loosie.tistory.com/486?category=964815 ([Java] ์ž๋ฐ”๊ฐ€ ์–ธ์ œ๋‚˜ Call By Value์ธ ์ด์œ  (Call By Reference X))

[๋งํฌ] https://ecsimsw.tistory.com/entry/%EC%9E%90%EB%B0%94%EB%8A%94-Call-by-Value-%EC%9D%B4%EB%8B%A4 (์ž๋ฐ” ๊นŠ์ด ์•Œ๊ธฐ / ์ž๋ฐ”๋Š” ํ•ญ์ƒ Call by Value.)

 

 

 

 

์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋™์ผ์กฐ๊ฑด

'๐Ÿงช ์ปดํ“จํ„ฐ๊ณผํ•™ : CS' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[์ž๋ฃŒ๊ตฌ์กฐ] Stack๊ณผ Queue์˜ ๋น„๊ต (์ธํ„ฐ๋ทฐ ๋Œ€๋น„)  (0) 2022.10.23
[์ž๋ฃŒ๊ตฌ์กฐ] Array์™€ LinkedList์˜ ์ฐจ์ด (์ธํ„ฐ๋ทฐ ๋Œ€๋น„)  (0) 2022.10.23
[Algorithm] ํž™ ์ •๋ ฌ (Heap Sort)  (0) 2022.09.03
[Alogrithm] ์‚ฝ์ž… ์ •๋ ฌ (Injection Sort)  (0) 2022.09.03
[Algorithm] ์„ ํƒ ์ •๋ ฌ (Selection Sort)  (0) 2022.09.03
    '๐Ÿงช ์ปดํ“จํ„ฐ๊ณผํ•™ : CS' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [์ž๋ฃŒ๊ตฌ์กฐ] Stack๊ณผ Queue์˜ ๋น„๊ต (์ธํ„ฐ๋ทฐ ๋Œ€๋น„)
    • [์ž๋ฃŒ๊ตฌ์กฐ] Array์™€ LinkedList์˜ ์ฐจ์ด (์ธํ„ฐ๋ทฐ ๋Œ€๋น„)
    • [Algorithm] ํž™ ์ •๋ ฌ (Heap Sort)
    • [Alogrithm] ์‚ฝ์ž… ์ •๋ ฌ (Injection Sort)
    ๊ฐœ๋ฐœ์ž HOON
    ๊ฐœ๋ฐœ์ž HOON
    ์ข‹์€ ๋ฐฑ์—”๋“œ ์—”์ง€๋‹ˆ์–ด๊ฐ€ ๋˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ก์„ ๋ชจ์•˜์Šต๋‹ˆ๋‹ค. # ์ฃผ๋‹ˆ์–ด # ๋ฐฑ์—”๋“œ # ๊ฐœ๋ฐœ์ž

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”