Call by value, Call by reference ?

 

 위 두 내용은 메소드(함수)에서 인자값을 받을 때 어떤식으로 받아 올 것 인지에 대한 방식이다.

 뜻 그대로 '값에 의한 호출' 그리고 '참조에 의한 호출' 인데 그 내용은 예시를 들어 설명해보겠다.


 

 Call by value


메소드 호출 시에 사용되는 인자의 메모리에 저장되어 있는 값(value)을 복사하여 보낸다.

무슨 뜻이냐면 int a =3 이라는 문구가 있으면 

메소드에서 인자값을 받을 때 a라는 자체에 주소를 받는게 아니라 a의 값인 3을 받아 처리하는 방식이다.


 Call by reference


메소드 호출 시 사용되는 인자 값의 메모리에 저장되어있는 주소(Address)를 복사하여 보낸다.

값이 아니라 인자 그자체에 주소 값을 보낸다. 




결론을 먼저 말하자면 자바는 Call by value  방식으로 인자값을 받는다.





결과 값은 이렇다
비포
안녕잘가
에프터
안녕잘가


 왜 스왑 메소드를 이용해서 서로를 바꿔준 것 같지만 바뀌지 않았을까?? Call by value 방식이기 때문이다. 

스왑 메소드가 받는 두 인자는 인자값에 주소 즉 인자 그자체를 받는 것이 아니라 인자의 값을 복사해서 받는다.

즉 String one 에는 a에 값인 "안녕" 에 값이 (String 은 참조 변수 이므로 "안녕" 에 주소 값이 복사)

마찬가지로 two 에도 b의 주소가아닌 b값에 주소가 복사 되어진다.




 이렇게 메인 메소드의 a, b와 swapS 메소드의 one two는 서로 같은 값을 참조할 뿐 이다.

 이렇게 메소드 내에서는 변화가 이루어 지지만 메소드가 닫히면 swapS에 있던 정보는 다 사라지므로 메인 메소드에 영향을 주지 못한다.

만약 위 코드에 있는 //주석문을 활성화 시키면 바뀐 값을 출력 할 것이다.



 만약 call by Reference 방식 이였으면 메소드내에서 one two가 a, b의 주소값을 받아 곧 a=one b=two 이고 메소드 수행으로 서로값이 바뀌니 메소드 수행을 하고 나서도 a, b가 바뀌어 있을 것이다. 



하지만 이러한 효과를 내는 방법은 있다.





swap() 호출 전 : a = 10, b = 20

swap() 호출 전 : a = 20, b = 10


이렇게 값이 바뀌는 걸 볼 수 있다.


그림으로 보자

 

마찬가지로 one과 two는 값의 주소를(call by value) 복사받아 같은 인스턴스를 참조하는 것 이지만..



이렇게 참조 되어지는 값을 바꾸어 주어 마치 call by reference 가 이루어진 것 처럼 보인다.


비슷한 예로 


1 8
8 1

이렇게 가르키고 있는 공간의 값을 바꾸어 주면 된다.




정리하자면 !!

자바는 !

기본형 타입 변수와 참조형 타입 변수가 있는데 

둘 다! 상관없이 call by value 방식으로 메소드에서 받아진다 !


대신 기본형 타입은 그 값을 복사 해서 주지만

참조형 타입은 값의 래퍼런스(주소)가 저장되는 것이므로 그 값의  래퍼런스가 복사 되어진다 !


즉 값의 래퍼런스가 call by value 방식으로 넘어간다!.


말이 긴데 어찌되었든 call by value 방식이다 자바는..



참조

http://hyoje420.tistory.com/6

http://re-build.tistory.com/3#comment14570096

http://purple-dev.tistory.com/36

https://brunch.co.kr/@kd4/2

https://muckycode.blogspot.com/2017/07/java-paratmeter-call-by-reference-vs.html

http://history1994.tistory.com/8?category=668240


JVM 

 

  JVM(Java Virtual Machine) 자바 가상 머신 이라 불리며 컴파일된 바이트코드 파일을  읽어 실행 시키는 역할을 한다.

  

우선 대략적인 자바 실행 과정을 설명하면 사용자가 1.텍스트형태에 자바코드를 만들면 (.java)  2.컴파일러에 의해서 바이트코드로 컴파일 되고(.class) 3.이는 각각의 os에 맞는 JVM(자바 가상 머신)이 메모리를 할당 받고 실행 가능하도록 기계어로 해석하여 준다.

  JVM 부분을 조금더 자세히 설명하면 Runtime Data Area(JVM 메모리 영역)에 메모리가 할당되면 Class Loader가 Byte Code(.class)파일을 그곳에 로드하고 배치한다. 그리고 Execution Engine가 그것을 해석하고 실행시킨다.


 메모리는 한정되어 있으며 메모리의 효율적인 관리는 프로그램에 성능을 좌우하기 때문에 메모리 구조를 정확히 이해하고 메모리 관리를 하는 것이 필요하다.



JVM 메모리 구조


Runtime Data Area영역은 크게 3가지로 나뉘어 진다. 


1. 메소드 영역 (Method Area) 

같은 뜻으로 Class Area, Code Area, Static Area가 있다.

 여기에는 런타임 상수풀, 멤버 변수, 클래스 변수, 생성자와 메소드와 같이 클래스와 인터페이스에 관련된 데이터를 분류하고 저장한다.

JVM 시작시 생성 되며 프로그램 종료시까지 유지된다. 그러므로 멤버 변수는 어디에서든 사용이 가능하다. 


2. 힙 영역 (Heap Area)

 실행시 동적으로 할당하여 사용하는 영역이다. New 연산자로 생성된 객체나 배열을 저장한다. 여기에 생성된 객체와 배열은 스택 영역의 변수나 다른 객체의 필드에서 참조한다. 만약 참조하는 변수,필드가 없으면 Garbage Collector에 의해 메모리 반환된다.


3. 스택 영역(Stack Area) 혹은 call stack

 메소드 호출 시 생성되어지는 영역이다. 지역변수, 매개변수, 연산중 나오는 임시데이터 등이 저장된다. 메소드가 종료되면 해당 영역은 비워진다. 기본 타입 변수는 스택 영역에 직접 값을 가지며 참조 타입 변수는 힙 영역이나 메소드 영역의 객체 주소를 가진다. 

 

각 메소드당 메모리상의 공간은 구별되며 처음 호출된 메소드의 공간이 마련되고 그 메소드 수행 중에 다른 메소드가  호출되면 첫번째 메소드 수행을 멈추고 그위에 두번째 메소드를 위한 공간이 마련되고 두번째 메소드를 우선 수행한다. 수행을 마치게 되면 그 메소드를 위한 공간이 비워지고 아까 수행중이던 메소드를 다시 수행한다. 




예를 들어 보면은~




//1 번 까지의 상황이다 



args[]에 값 두개를 넣었다 10,20 

args 라는 자체는 스택영역에 있지만 참조 되어지는 배열은 힙영역에 들어간다.


//2 번 까지의 상황이다


 add메소드는 이미 수행이 끝나고 multi메소드가 수행된 상태이다.

 

 total 변수는 클래스 변수로 메소드 영역에 있어 어느 메소드에서나 접근이 가능하다 add()와 muiti() 메소드들의 ++total 을 수행하여 2가 되었다.

 add()의 수행값을 sum에 넣어 sum값이 30 multi()의 수행값을 multi에 넣어 multi값이 200이 되었다.

 multi메소드가 수행할때에는 매개변수 a,b에 메인 메소드의 지역변수 x,y 값이 대입되어 각각 10 20 값을 가졌다. 이는 종료후 사라질 것 이다.



번외)

이클립스에서 인자값 주는법


위 사진처럼 Program arguments 칸에 넣으면 된다.


추가적인 내용으로 위에 사진에 보이는 VM arguments 칸은 사용자가 직접 JVM메모리의 용량을 설정해 주는 것이다.

-Xmx<size> 초기의 Heap size   -Xms<size> 최고 Heap size    -Xss<size> Stack size   

 설정값의 종류이다. 힙사이즈는 초기값과 최고값이 정해져있다. 동적으로 크기가 변함을 알 수 있다. 하지만 최초 크기와 최대 크기를 동일하게 부여할 것을 권장한다. 크기의 동적인 변경에 의한 오버 헤들를 최소화하기 위해서이다

 -Xms1024m-Xmx1024m-Xss512m  과같이 넣으면 된다.


참조:  http://hoonmaro.tistory.com/19

        http://limkydev.tistory.com/51

        http://atin.tistory.com/625

  https://blog.naver.com/kimso612/110028382119

  http://hyoje420.tistory.com/2



+ Recent posts