자바는 기본적으로 값에 의한 전달(Pass-by-value)을 한다.

발생일: 2009.12.03

문제:
javascript 의 변수 참조에 대한 예제 파일을 작성해보다가,
(변수는 참조 링크의 마지막 값에 대한 참조를 갖는다. 에 대한 예제였다)
문득 자바에서도 그렇겠지.. 란 생각이 들어 테스트 해보던 중이었다.

String a = "abc";
String b = a;
a = "def";

System.out.println(b); // "abc" 가 출력된다.


a 는 "abc" 에 대한 주소값을 가지고 있고,
String b = a 부분에서 b 역시 "abc" 에 대한 주소값을 가지게 된다.
(중간에 String c = b; 가 들어있었다면, c 역시 "abc" 에 대한 주소값을 가지게 된다.)
a = "def' 부분에서는 a 에 새로운 주소값이 할당되게 되고,
b 의 참조는 변함이 없다.

사실 변수가 주소값을 가진다는 것 외에는 특별한 것 없는 예제다.
(나는 처음에 '마지막 참조를 갖는다'라는 개념에 대해 좀 헷갈렸는데,
  c --> b ---> a ---> "abc" 란 식으로 링크를 쫓아가는 쪽으로 이해하는 것보다는,
  a = 1010(주소값), b = a = 1010, c = b = 1010 과 같은 형태로 주소값을 전달해주는 것으로 이해하면 더 쉽겠다)


물론, primitive type 일 경우에는 값 자체를 설정해준다.

int a = 7;
int b = a;
a = 5;

System.out.println(b); // 7이 출력된다.

위에서와 달리 int b = a; 에서는 a 의 값인 7이 할당되는 것이다.


그러다가 문득, call by value, call by reference 같은 문구가 생각났고,
자바는 값에 의한 전달(pass by value)을 한다...라는 개념이 생각났다.

위에서 작성했던 예제는 단순히 변수 할당의 문제였지만,
메서드의 패러미터 전달일 경우 약간 더 생각이 필요하다.
(난 Java로 프로그래밍을 시작하다보니 C 의 포인터 개념을 몰라 오히려 더 잘 이해가 된 것 같기도 하다.)


위 예제와는 좀 다른 얘기이긴 하지만,
메서드에서의 패러미터 전달에 대해 잘 설명해 놓은 포스트가 있을까?


(서론이 너무 길었지만, 주소값을 전달한다 라는 개념을 보여주기 위함이었다.)


해결책:
JavaDude.com 에 이에 대해 매우 잘 정리해놓은 포스트가 있다.
천천히 잘 읽어보자.


결론은 이렇다.

자바는 기본적으로 값에 의한 전달(pass by value)을 사용한다.
단, 객체일 경우, 객체의 참조가 값으로 전달된다. (주소값이 전달된다)





* 쓸데없이 내용이 너무 산만하다... -_-;;
  두 가지 주제를 나눠쓸 걸 그랬나보다...

카테고리

분류 전체보기 (710)
About me. (6)
Daylogs (675)
영어공부 (0)
My works - 추억 (29)
비공개 (0)