컴퓨터를 공부하는 사람이라면 한번쯤 들어봤을
Call by Value 와 Call by Reference
말 그대로 "값을 받아온다"와
"참조한다"인데 참조 하는 것은 "주소값을 참조한다"는 의미가 되겠다.
자바는 Call by Value이며 Call by Reference는 아니다라고 생각하는 사람들이 많은데
이는 잘못된 내용이다.
간단한 예를 들어 아래의 코드를 보자
위의 코드는 값을 swap해주는 함수에 넣어 확인하는 코드이다.
함수 호출 전엔 num1=10, num2=20이 나온다.
함수안엔 swap시키는 부분이 있으므로 함수 호출 후엔 스왑이 되어야 한다.
함수 후엔 무슨 값이 나올까?
아래의 결과를 보면 예상과는 다른 swap이 안된 결과를 확인 할 수 있다.
이런 경우를 Call by Value라고 한다.
변수에 저장된 값만을 함수의 인자로 넣어주어
main함수 안에 있는 num1이나 num2에는 영향을 주지 않는다.
함수안에서는 단순히 넣어준 값을 가지고만 처리를 하는 것이다.
그럼 다음의 경우를 봐 보자.
변수 대신에 배열을 이용해서 코드를 바꾼 예제이다.
변수대신 func함수에 인자로 배열을 넣어주어
num[]에 저장된 10,20이 넘어갔다.
변수를 사용한 코드와 크게 다를거 없는 예제이지만 결과는 완전히 다르게 나온다.
아래가 그 결과이다.
먼저 보여준 결과와는 다르게 swap된 결과를 알 수 있다.
과정을 설명하기 전에 위의 밑줄 쳐진 말은 잘 못 된 이해라고 할 수 있다.
정확히 말하면 num에 저장된 10,20값이 넘어간게 아니라
num이라는 배열을 "참조"할 수 있도록 num의 주소값이 인자값으로 들어간 것이다.
때문에,
함수에서는 인자값으로 넘어 온 num의 주소를 이용하여
1. temp = arr[0] ( temp = num[0] )
num의 주소를 참조하여(주소로 직접 가서) num의 0번지의 값을 temp를 넣어주고
2. arr[0] = arr[1] (num[0] = num[1])
num의 주소를 참조하여(주소로 직접 가서) "num 주소의 0번지"에
num의 주소를 참조하여(주소로 직접 가서) "num 주소의 1번지"의 값을 넣어주며
3. arr[1] = temp ( num[1] = temp )
첫번째로 저장한 num의 0번지의 값을
num의 주소를 참조하여(주소로 직접 가서) "num의 주소의 1번지"에 넣어준 것이다.
배열의 주소를 직접 참조에서 swap을 해주었으니 main에서도 swap된 결과를 볼 수 있는 것이다.
이렇게 직접 메모리로가서 참조하는 것이 Call by Reference로 java에서도 간단하게 참조되는 경우를 볼 수 있다.
배열말고도 객체에 관련된 것들은 다 Call by Reference라고 볼 수 있다.
'IT Study > etc' 카테고리의 다른 글
Observer Pattern (0) | 2018.06.11 |
---|---|
Factory pattern (0) | 2018.06.11 |
Singleton Pattern(싱글톤 패턴) (0) | 2018.06.07 |
DTO와 DAO 예제 (0) | 2018.05.28 |