๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์๋ 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
'๐กCS > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] String, StringBuffer, StringBuilder (0) | 2023.06.09 |
---|---|
[Java] equals()์ hashCode()(+ ๋์ผ์ฑ, ๋๋ฑ์ฑ) (0) | 2023.06.09 |
์์ ํ์ (Primitive), ์ฐธ์กฐ ํ์ (Reference) (0) | 2023.06.07 |
์ ๊ทผ ์ ์ด์(private, default, protected, public) (0) | 2023.06.07 |
ํด๋์ค, ๊ฐ์ฒด, ์ธ์คํด์ค๋? (0) | 2023.06.07 |
๋๊ธ