Java๋ pass by value?? ๐
๐ ์ฌ๋ฌ ์๋ฃ๋ค์ ํ์ํ๊ณ , ๊ฐ์ธ ํ์ต ์ฉ๋๋ก ์ ๋ฆฌํ ํฌ์คํธ์ ๋๋ค.
์๋ชป๋ ์ ์ด ์๋ค๋ฉด ํผ๋๋ฐฑ ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค!
๐ป ๋ฐฐ๊ฒฝ์ง์
pass by reference๋?
- ์ฐธ์กฐ์
๋ณต์ฌ
๊ฐ ์์ต๋๋ค. - ๋จ์ผ ์ฐธ์กฐ๋ ํธ์ถํจ์์ ํธ์ถ๋ ํจ์ ๋ชจ๋์์ ๊ณต์ ๋ฉ๋๋ค.
- ์ด๋ค
์ฐธ์กฐ์ ๋ณํ
๋๊ฐ์ฒด ๋ฐ์ดํฐ์ ๋ณํ
๋ caller scope์๋ฐ์
๋ ๊ฒ์ ๋๋ค. - C++์์
&
๋ฅผ ์ฌ์ฉํ์ฌpass by reference
๋ฅผ ํ์ฉํ๋ค. - args์ parm๊ฐ ๋์ผํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒ์ด ์๋,
๋์ผํ ๋ณ์
์ด๋ค.
Passing (Object references) By Value ๋?
- ์ฐธ์กฐ์ ๋ณ๊ฒฝ์ caller scope์ ๋ฐ์๋์ง ์์ต๋๋ค, ํ์ง๋ง ๊ทธ ๊ฐ์ฒด์ ๋ณํ๋ ๋ฐ์๋ฉ๋๋ค.
- ์๋ํ๋ฉด, ์ฐธ์กฐ๊ฐ ๋ณต์ฌ๋์์ง๋ง ๋ชจ๋ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
- argument์ ๊ฐ์
๋ณต์ฌ
ํ๋ ๊ฒ์ ์๋ฏธํ๋ค. - args์ parm๊ฐ ๋์ผํ์ง ์๋ค.
call by value
์๋์์ด
- method ๋๋ argument์
์์ผ
์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๋ถ๋ฆฌ๋ ๊ฒ ๊ฐ๋ค.
- method ๋๋ argument์
๐ฅ Java๊ฐ pass by reference๋ผ๊ณ ์คํด๋ฅผ ์ฌ๋ ์ด์ .
๐จ1. Reference(์ฐธ์กฐ) ์ฉ์ด์ ํผ๋
-
์ฐธ์กฐ
๋ผ๋ ์ฉ์ด๋ ๊ฐ๋ณ์ ์ธ ์๋ฏธ๋ก์ค๋ฒ๋ก๋
๋ ๊ฒ์ด๋ค. -
Java์์
Reference
๋ ๋จ์ํํฌ์ธํฐ
๋ฅผ ์๋ฏธ- C์ธ์ด์ ํ์์ธ Java๋
ํฌ์ธํฐ
๋ฅผ์ฐธ์กฐ
๋ก ํธ์ถํ๋ค๋ ์ ์ ์ ์ธํ๊ณ ๋ํฌ์ธํฐ
๋ฅผ ๋ฉ์๋์ ์ ๋ฌํ๋ค๋ ์ ์ ์ฐจ์ฉํ๋ค๊ณ ํ๋ค.
- C์ธ์ด์ ํ์์ธ Java๋
-
Java์
์ฐธ์กฐํ์ (Reference Type)
- ๊ฐ์ฒด์ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๋ ํ์ ์ผ๋ก๋ฐฐ์ด
,์ด๊ฑฐ
,ํด๋์ค
,์ธํฐํ์ด์ค ํ์
-
C++์
์ฐธ์กฐ๋ณ์(&)
-
Pass-by-reference
์ ๋งฅ๋ฝ์์๋์ค๋ฆฌ์ง๋
๋ณ์์ํธ๋ค๋ง
์ ์๋ฏธ -
์ด๋ฌํ
์ฉ์ด์ ํผ๋
์ผ๋กcall by sharing
์ด๋ผ๋ ์ฉ์ด๊ฐ ์๊ธฐ๊ธฐ๋ ํจ.call by value
์call by reference
์ ๊ฐ๊ฐ ํน์ง์ด ์์ฌ์๋ ๊ฒ์ ๋งํ๋ ๊ฒ ๊ฐ๋ค.- args๋ฅผ parm์ผ๋ก ๋ณต์ฌ๋ ํ๋๋ฐ, ์๋ณธ ๊ฐ์ฒด์ ์ ๊ทผ์
๊ณต์
ํด์ ์๋ณต ๊ฐ์ฒด์์ํ ๋ณ๊ฒฝ ๊ฐ๋ฅ
ํ๋ค. - ์ด๋ฌํ ์ด์ค๊ฐํ? ํผํฉ๋? Java์ ๊ฐ์ ์ผ์ด์ค๋ฅผ ์ค๋ช ํ๊ธฐ ์ํด ์๊ธด ์ฉ์ด ๊ฐ์๋ฐ, ์์ฐ์ด์ง ์๋๋ค๊ณ ํ๋ค.
๐จ2. Java๋ ์ฐธ์กฐ ํ์ ์ call by reference "์ฒ๋ผ" ๋์
์๋ฐ๋ argument๋ก reference type์ ๋ณด๋ผ ์ ์๋๋ฐ?์์ ์์๋ ํผ๋ ๊ฐ๋ค.
-
์ ๋ฌ๋ ๊ฐ์ฒด์
์ํ
๋ฅผ ๋ณ๊ฒฝ์ํฌ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.- ์) setter ํจ์
-
ํ์ง๋ง, ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด
์ฐธ์กฐ๋ณ์ a
๊ฐ ๊ฐ๋ฆฌํค๋ ์ธ์คํด์ค์ ์ฃผ์๊ฐ์๋ณต์ฌ
ํ์ฌ, -
๋์ผํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋
์ฐธ์กฐ๋ณ์ b
๋ผ๋ ๊ณต๊ฐ์ด์ถ๊ฐ๋ก
์์ฑ๋ ๊ฒ์ด๋ค. -
๋ฐ๋ผ์, ์ฐธ์กฐ๋ณ์๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ณ๊ฒฝ์ ํ๋ ๊ฒ์ ๊ฐ๋ฅํ๋ค.
-
ํ์ง๋ง
์ฐธ์กฐ๋ณ์ b
์์ฐธ์กฐ๋ณ์ a
๋ ๊ด๊ณ๊ฐ ์๋ ๊ฐ๋ณ์ ์ธ ์์์ด๋ค. -
์ฆ, ์ ๋ฌ๋ ์ฐธ์กฐ๋ณ์ a ์์ฒด๋ฅผ ๋ณ๊ฒฝํ ์๋ ์๋ค.
- ์๋ฅผ๋ค์ด, new ์์ฑ์๋ฅผ ํตํด b์ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ํ๋ค๋ฉด?
- b์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋๋ผ๋, a๊ฐ ๊ฐ๋ฆฌํค๊ณ ์๋ ์ธ์คํด์ค์ ์ํ๋ ๋ฐ๋์ง ์๋๋ค.
๊ฒฐ๋ก
- Java๋ C์ธ์ด์ฒ๋ผ ์ฃผ์๊ฐ์ ๋ค๋ฃฐ ์ ์๋ค.
- ๋ณ๊ฑฐ ์๋๋ ๊ฐ๊ฐ์ ์ธ์ด์์ ๋งํ๋ ์ฐธ์กฐ(Reference)์ ์ ์๊ฐ ์กฐ๊ธ์ฉ ๋ฌ๋ผ์ ์๊ธด
ํผ๋
์ด๋ค. ์๋ฐ๋ Passing object references by value
Pyro
๋ ์๋ฃ ์คํฌ๋จ
์๋ฐ์์ pass by value ๋ง์ ํ์ฉํ๊ณ ,
call by reference ๋ฅผ ํ์ฉํ์ง ์๊ฒ ๋ค๋ ์๋ฆฌ๋,
function call ๋ก ์ธํside effect
๋ฅผ ํ์ฉํ์ง ์๊ฒ ๋ค๋ ์ธ์ด ์ค๊ณ ์ฒ ํ์ ์ด์ผ๊ธฐํ ๊ฒ์ด๋ค.
๊ทธ๋ฅ swap ์ด ๋ถ๊ฐ๋ฅํ๋ฉด ์ ๋ถ call by value ๋ผ๊ณ ์๊ฐ์ ํ์.
๋ถ๋ก
C++ ์์
#include <iostream>
using namespace std;
void foo(int &x) { //์ฐธ์กฐ ์ฐ์ฐ์
x *= 10;
}
void bar(int *x) {
*x *= 10;
}
int main(int argc, char const *argv[])
{
int x = 10;
int y = 10;
foo(x); //call by reference
bar(&y); //call by addresss
cout << x << endl;
cout << y << endl;
return 0;
}
output
> 100
> 100
Java ํ๊ฐ๋ฆฌ๋ ์์
class Company{
private String name;
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
}
public class copyEx2{
public static void main(String[] args){
Company com1 = new Company();
com1.setName("Google");
show(com1);
System.out.println("main(): "+com1.getName());
}
public static void show(Company com){
com = new Comapny(); // ๐ ์ฃผ๋ชฉ!
com.setName("Yahoo");
System.out.println("show(): "+com.getName());
}
}
output
> show():yahoo
> main():Google
๐ฅ ์๋ฐ๊ฐ ์ ๋ง๋ก call by reference ์๋ค๋ฉด main():yahoo ์ด์ด์ผ ํ๋ค.
์ฐธ๊ณ
- ์ํ์ฝ๋ฉ JAVA - ์ฐธ์กฐ
- https://blog.penjee.com/passing-by-value-vs-by-reference-java-graphical/
- https://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value
- https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing
- https://velog.io/@aiden/call-by-value-vs-call-by-reference-feat.-call-by-sharing
- https://www.youtube.com/watch?v=1It6RGBCDso&ab_channel=ProjectRin
- https://www.notion.so/Function-Call-Arugmetn-vs-Parameter-bef816be67974d4d8118f56fcafe4136
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(Java๋ pass by value?? ๐), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@san/Java๋-pass-by-reference์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค