이전에도 앞으로도 계속될 논쟁..

Call by Value와 Call by Reference에 대한 개념을 알고 있다고 가정하고 시작해봅니다.

소스코드의 일부는 http://egloos.zum.com/Dplex/v/4312931 여기서 가져왔습니다.


1. 기본자료형

일단 기본 자료형인 int ... 등의 값은 세가지 모두 Call by Value.


2. Class

2-1. Call by Value

C++의 예제

결과

0082B618:Jindo

003FFAA8:Max

003FFAA8:Fifi

003FFAA8:Rowlf

0082B618:Jindo


값을 복사해서 새로운 Class를 만들기 때문에 마지막 결과가 Jindo가 나옴을 알 수 있습니다.



2-2. Call by Address

설명하기에 앞서 Call by Address라는 단어를 알려드리고 싶어요

Call by Reference는 의미를 보자면 "함수내에서 변수값을 바꾸었더니 함수 밖에서도 값이 변한다." 는 겁니다.

call by value니 call by reference가 맞다느니... 왜 싸우는 걸까요? 


Java는 Call by Reference이라고 말하는 사람은 아래의 첫번째 정의를 보고 있기 때문이고

Call by Value 라고 하는 사람들은 두번째 정의로 보고 있기 때문입니다.


아래의 미묘한 차이점을 확인해주세요

- 변수 안에 저장되어 있던 주소값을 넘기는 것.

- 별명의 개념


쉽게 설명하면

첫번째 정의는 새로운 변수를 생성하여 저장되어있던 주소값 복사하여 담아두는 것을 말하고, 

두번째 정의는 해당 변수 자체의 주소라고 봅니다. 별명을 만든다고나 할까요, 다른 이름이지만 같은 변수를 가리키도록 말이에요.


첫번째 정의를 개념적으로 보았을때 주소값을 통해 Class를 접근하기 때문에 Call by Address 라고 말씀드리고 싶군요. 단어를 새롭게 정의!


Call by Address의 경우에는 아래의 설명을 참고하세요.

위의 사진처럼 함수에서 someDog이라는 주소값을 할당할 수 있는 공간이 생성되고 5000이라는 값이 복사 됩니다. 따라서 pointer 혹은 hash값이 다릅니다.


만약 함수 안에서 새로 인스턴스를 생성한다면 아래의 그림으로 바뀌게 됩니다.

변수 자체가 다르기 때문에 new Dog를 통해 새로운 인스턴스를 생성하게 되면 가리키는 메모리가 다르게 됩니다.


C++의 예제

결과

007BB618:Jindo

007BB618:Max

007BC990:Fifi

007BC990:Rowlf

007BB618:Max


Java의 예제

결과

Dog@659e0bfd : Jindo

Dog@659e0bfd : Max

Dog@2a139a55 : Fifi

Dog@2a139a55 : Rowlf

Dog@659e0bfd : Max


C#의 예제

결과

46104728 : Jindo

46104728 : Max

12289376 : Fifi

12289376 : Rowlf

46104728 : Max


2-3. Call by Reference는 아래의 설명을 참고하세요.

myDog라는 변수가 main 함수 안에 선언되어있으며 주소값은 1000입니다.

new Dog("Jindo");를 하게 되면서 5000이라는 메모리가 할당되고 name 변수에 "Jindo"의 주소값을 갖습니다.

C++의 경우에는 포인터를 통해 값을 넘기면 1000이라는 주소값을 넘깁니다.



만약 함수 안에서 새로 인스턴스를 생성한다면 아래의 그림으로 바뀌게 됩니다.

따라서 함수 안에서 값을 변경하게되면 main의 myDog값에 직접 쓰이게 되는 겁니다.


C++의 예제


결과

005CB618:Jindo

005CB618:Max

005CB618:Fifi

005CB618:Rowlf

005CB618:Rowlf


C#의 예제

결과

0076B618:Jindo
0076B618:Max
0076B618:Fifi
0076B618:Rowlf
0076B618:Rowlf



아래의 예제 결과로 글작성을 마칩니다!


Call by Value

Jindo

Max

Fifi

Rowlf

Jindo


Call by Address

Jindo

Max

Fifi

Rowlf

Max


Call by Reference

Jindo

Max

Fifi

Rowlf

Rowlf


이견이 있으신 분께서는 댓글을..

by 개발자가 되자! 2015. 4. 14. 17:11