๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’กCS/Java

[Java] Call by value vs Call by reference

by hyeon-z 2023. 6. 8.

 

๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” 2๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

๐Ÿ‘† Call by value

๐Ÿ‘† Call by reference

 

Java์—์„œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์ „๋‹ฌ ๋ฐฉ๋ฒ•

 

Java์—์„œ๋Š” ์ด ๋‘ ๊ฐ€์ง€์˜ ๋ฐฉ๋ฒ• ์ค‘ Call by value๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.

 

Call by value (๊ฐ’์— ์˜ํ•œ ํ˜ธ์ถœ)

๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ์— ์‚ฌ์šฉ๋˜๋Š” ์ธ์ž์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฐ’(value)๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ๋ณด๋‚ธ๋‹ค.

 

์›์‹œ ํƒ€์ž…

 

public class Main {
    public static void main(String[] args) {
        int a = 1;
        int b = 2;

        modify(a, b);

        System.out.println(a);
        System.out.println(b);
    }

    static void modify(int a, int b) {
        a = 10;
        b = 20;
    }
}

ํ•ด๋‹น ์ฝ”๋“œ์—์„œ modify(a, b) ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ํ›„ ์šฐ๋ฆฌ๊ฐ€ ๊ธฐ๋Œ€ํ•œ ๊ฒฐ๊ณผ ๊ฐ’์€ 10, 20์ด์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” 1, 2๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

๊ทธ ์ด์œ ๋Š” modify๋ฉ”์„œ๋“œ์˜ ๋ณ€์ˆ˜ a์™€ b๋Š” mainํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜ a, b์™€ ์ด๋ฆ„๋งŒ ๊ฐ™์„ ๋ฟ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

Stack ๋‚ด๋ถ€์— main๋ฉ”์„œ๋“œ, modify๋ฉ”์„œ๋“œ ๋ณ„๋กœ ๊ฐ๊ฐ a, b๋ณ€์ˆ˜๊ฐ€ ์กด์žฌํ•œ๋‹ค.

๋”ฐ๋ผ์„œ modify๋ฉ”์„œ๋“œ์˜ a, b์˜ ๊ฐ’์„ ๋ฐ”๊ฟ”๋„ main๋ฉ”์„œ๋“œ์˜ a, b๋ณ€์ˆ˜์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค.

์ด ์˜ˆ์‹œ๋Š” ์›์‹œํƒ€์ž… ์ค‘ ํ•˜๋‚˜์ธ intํ˜•์˜ ์˜ˆ์‹œ์˜€๋‹ค.

 

์ฐธ์กฐ ํƒ€์ž…

 

public class Main {
    static class Person {
        int age;

        public Person(int age) {
            this.age = age;
        }
    }

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

        modify(p);

        System.out.println(p.age);
    }

    static void modify(Person p) {
        p = new Person(20);
    }
}

20์ด๋ผ๋Š” ๊ฒฐ๊ด๊ฐ’์ด ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋ผ ์˜ˆ์ธกํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” 10์ด ์ถœ๋ ฅ๋œ๋‹ค.

 

๐Ÿ‘†Step 1 (main๋ฉ”์„œ๋“œ ํ˜ธ์ถœ)

 

๐Ÿ‘†Step 2 (modify๋ฉ”์„œ๋“œ ํ˜ธ์ถœ)

ํ˜ธ์ถœ ๋‹น์‹œ์—๋Š” modify๋ฉ”์„œ๋“œ์˜ ์ธ์ž๋กœ ๋„˜๊ฒจ์ค€ Person์˜ ์ฃผ์†Œ ๊ฐ’(value)์„ ํ•จ๊ป˜ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค.

 

๐Ÿ‘†Step 3 (modify๋ฉ”์„œ๋“œ ์‹คํ–‰)

modify๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ p๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ธฐ์กด๊ณผ ๋‹ค๋ฅธ ์ƒˆ๋กœ์šด ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋œ๋‹ค.

 

์ž๋ฐ”๋Š” ๋ชจ๋‘ Call by value๋กœ ๋™์ž‘ํ•˜์ง€๋งŒ
Call by reference ๋ฐฉ์‹์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
(์ฐธ์กฐ ํƒ€์ž…์˜ ํŠน์„ฑ ์‚ฌ์šฉ)

 

 

Call by reference (์ฐธ์กฐ์— ์˜ํ•œ ํ˜ธ์ถœ)์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ

 

Call by reference: ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ ์ธ์ž๋กœ ์ „๋‹ฌ๋˜๋Š” ๋ณ€์ˆ˜์˜ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.  (java๋Š” ์ฃผ์†Œ๊ฐ’ ์ „๋‹ฌ์ด๋ฏ€๋กœ ํ•ด๋‹น ์•ˆ๋จ)

 

public class Main {
    static class Person {
        int age;

        public Person(int age) {
            this.age = age;
        }
    }

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

        modify(p);

        System.out.println(p.age);
    }

    static void modify(Person p) {
        p.age = 20;
    }
}

 

๐Ÿ‘†Step 1 (main๋ฉ”์„œ๋“œ ํ˜ธ์ถœ)

 

๐Ÿ‘†Step 2 (modify๋ฉ”์„œ๋“œ ํ˜ธ์ถœ)

 

๐Ÿ‘†Step 3 (modify๋ฉ”์„œ๋“œ ์‹คํ–‰)

์ฐธ์กฐ ํƒ€์ž…์€ Heap Memory ์˜์—ญ์— ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— '์ฐธ์กฐ ํƒ€์ž…'์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

main๋ฉ”์„œ๋“œ์—์„œ modify๋ฉ”์„œ๋“œ๋กœ ๋„˜๊ฒจ์ค€ ๊ฑด Person์˜ ์ฃผ์†Œ๊ฐ’์ด๊ณ , modify๋ฉ”์„œ๋“œ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ฃผ์†Œ๊ฐ’๊ณผ ๋™์ผํ•œ ์ฃผ์†Œ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์ด ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ์ด ๋‘˜์€ ๋™์ผํ•œ ์ฃผ์†Œ๊ฐ’์„ ์ฐธ์กฐํ•˜๋ฏ€๋กœ ์ˆ˜์ •์ด ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค.

 

์ด๊ฒƒ์€ ์ฐธ์กฐ ํƒ€์ž…์˜ ํŠน์„ฑ ๋•Œ๋ฌธ์ด์ง€ Call by reference๊ฐ€ ์•„๋‹˜์„ ์ฃผ์˜ํ•˜์ž!

 

โœ… ์ •๋ฆฌ

์ž๋ฐ”๋Š” Call by value๋กœ๋งŒ ๋™์ž‘ํ•œ๋‹ค.

Call by value์˜ ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ ๊ฐ’์„ ๋ณต์‚ฌํ•ด์„œ ํ•จ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์›๋ณธ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋‹ค. 
ํ•˜์ง€๋งŒ ์ธ์ž๋ฅผ ๋„˜๊ฒจ์ค„ ๋•Œ๋งˆ๋‹ค ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ• ๋‹นํ•ด์•ผ ํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋” ์žก์•„๋จน๋Š”๋‹ค.
Call by reference์˜ ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ํ• ๋‹น ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐํ–ˆ์ง€๋งŒ, ์›๋ณธ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์œ„ํ—˜์ด ์กด์žฌํ•œ๋‹ค.

 

Reference

Java์˜ Call by Value, Call by Reference

Call by value์™€ Call by reference

[Java] Call by Value, Call by Reference

JAVA - Call By Value? Call By Reference?

๋Œ“๊ธ€