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] = {1, 2}; 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이란 함수를 만드시는게 좋고,
배열의 경우 깊은 복사를 원한다면, 일일이 반복문으로 각 원소에 대하여 값을 대입해주시는게 맞습니다.