Syncope.T-*
Published 2016. 5. 11. 06:53
Call By Value, Call By Reference BackEnd/Java
728x90

Java에서는 함수로 인자를 전달 할때의 주의사항이 있습니다.

바로, Value값이 넘겨지느냐, Reference값이 넘겨지느냐 인데요.

보통 데이터 타입(int, char .......)들은 Value로 넘겨지지만, 배열이나 객체는 Reference로 넘겨집니다.

의미가 제대로 와 닿지 않으시다면, 아래의 예제를 보시면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
public run()
{
    int a = 1;
    int b = 2;
    System.out.println("a : " + a + " b : " + b + " a+b : " + testFunction(a,b));
    System.out.println("a : " + a);
}
 
int testFunction(int a, int b)
{
    a = a + 1;
    return a + b;
}
cs

위 예제에서는, 

a : 1, b : 2, a+b : 4 , a : 1 가 출력됩니다. 왜 a : 2가 아니냐고 물으신다면, CallbyValue로 넘겨준 testFunction의 인자 a에는 아무런 영향을 끼치지 않지요.


하지만 아래의 예제에서는 영향을 끼치는걸 볼 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
public run()
{
    int a[2= {12};
    System.out.println("a[0] : " + a[0+ " a[1] : " + a[1+ " a sum : " + testFunction(a));
    System.out.println("after a[0]: " + a[0]);
    
}
 
int testFunction(int a[])
{
    a[0= a[0+ 1;
    return a[0+ a[1];
}
cs

출력결과 마지막 a[0]가 2로 변경된 것을 볼 수 있습니다.

함수 인자에 배열이나 객체로 넘겨질 경우, 값이 변경된답니다. 이는 깊은복사, 얕은복사에 대해 참으로 신경을 써야하는데요.


<결론>

객체의 경우, 각 객체에 대한 복사를 원한다면 (깊은 복사), clone이란 함수를 만드시는게 좋고,

배열의 경우 깊은 복사를 원한다면, 일일이 반복문으로 각 원소에 대하여 값을 대입해주시는게 맞습니다.


profile

Syncope.T-*

@Syncope

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...