๐ 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์์ ์ฆ๋ช ํ๋ ํ ์คํธ์ฝ๋์ด๋ค.
๋ด๋ถ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ํ์ธํด๋ณด์.
์ฒ์ ๊ธฐ๋ณธํ ๋ณ์๋ฅผ ์์ฑํ๋ฉด 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 |