상세 컨텐츠

본문 제목

[JAVA] 변수, 객체의 메모리 관리 (Call By Value, Call By Reference)

Spring/JAVA

by Chan.94 2022. 5. 14. 17:28

본문

반응형

프로그래밍언어로 개발시 Call By Value, Call By Reference에 대한 개념이 정립되지 않는다면 알수없는 오류에 빠지는 상황이 발생하게 될 것이다.

 

Call By Value, Call By Refernce 개념

  Call By Value Call By Reference
의미 값을 호출 참조에 의한 호출
처리방법 전달받은 값을 복사하여 처리
즉, 전달받은 값을 변경하여도 원본은 변경되지 않음
전달받은 값을 직접 참조
즉, 전달받은 값을 변경 할 경우 원본도 함께 변경됨 참조에 의한 호출

우리는 JAVA에서 객체를 전달받고, 그 객체를 수정하면 원본도 같이 수정되니 이것이 Call by Reference라고 생각하는 경우가 많지만 그것은 잘못된 생각이다. 

 

JAVA는 전달받은 값을 복사하여 처리하기 때문에 Call By Value 방식이다.

 

변수와 객체가 어떻게 메모리(Stack, Heap 영역)에 관리되는지를 통해 JAVA는 Call By Value방식이다라는 것을 정리하려고 한다.


우선, 아래의 출력결과가 어떻게 나오는지 생각해보자.

변수와 객체가 메모리에서 어떻게 관리되고있는지를 이해하고 있지 않다면 쉽지 않을 것이다.

public class DevLog {

	public static void main(String[] args) {

		int a = 1;
		int b[] = {1,2,3};
		Developer developer1 = new Developer("홍길동");
		Developer developer2 = new Developer("이순신");
		
		programing(a, b, developer1, developer2);
		
		System.out.println("a : " + a);
		System.out.println("b[0] : " + b[0]);
		System.out.println("developer1_name : " + developer1.getName());
		System.out.println("developer2_name : " + developer2.getName());
	}

	private static void programing(int a, int[] b, Developer developer1, Developer developer2) {
		a++;
		b[0]++;
		developer1 = new Developer("손흥민");
		developer2.setName("박지성");
	}
	

}

class Developer {
	private String name;

	public Developer() {}
	
	public Developer(String name) {
		this.name = name;
	}
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
}
a : 1
b[0] : 2
developer1_name : 홍길동
developer2_name : 박지성

 

 

 

출력결과를 맞추신 분들은 아래 내용에 대해 더이상 보실 필요가 없는 사람들이다. (필자는 틀렸기 때문에 정리한다..)

 

필자의 예상 답은 아래와 같았다. 

a : 2
b[0] : 2
developer1_name : 손흥민
developer2_name : 박지성

Stack과 Heap영역의 간단한 특징이다.

Stack

- 개별Thread가 관리하는 영역이다.

- 지역변수, 매개변수등이 할당된다.

 

Heap

- Thread들이 함께 사용하는 영역이다.

- 상수, 객체등이 할당되며 무질서하게 메모리가 할당된다.

 


이제 Stack과 Heap영역에서 변수와 객체가 어떻게 관리되고있는지 그림으로서 한단계씩 정리해보겠다.

 

1. programing 메소드 호출 전

변수는 Stack영역에 변수는 값(Value)가 저장되고 배열, 객체는 주소지값(Reference)이 저장된다.

 

2. a변수

 

2 - 1. 매개변수로 전달받은 a

2 - 2. a++

기존의 a가 변경되는 것이 아닌 새로운 a가 Stack영역에 쌓이게 된다.

 

3. b배열

 

3 - 1. 매개변수로 전달받은 b

3 - 2. b[0]++

4. Developer객체 developer1

 

4 - 1. 매개변수로 전달받은 developer1

4 - 2. devleoper1 = new Developer("손흥민")

 

5. Developer객체 developer2

 

5 - 1. 매개변수로 전달받은 developer2

5 - 2. developer2.setName("박지성")

 

6. programing 함수 종료

함수가 종료되면서 함수안에서 사용하던 변수들은 Stack영역에서 없어지게된다.

위와같은 과정을 통해 아래와 같이 출력이 되게 되는것이다.

a : 1
b[0] : 2
developer1_name : 홍길동
developer2_name : 박지성

정리

Call By Value, Call By Refernce 개념

  Call By Value Call By Reference
의미 값을 호출 참조에 의한 호출
처리방법 전달받은 값을 복사하여 처리
즉, 전달받은 값을 변경하여도 원본은 변경되지 않음
전달받은 값을 직접 참조
즉, 전달받은 값을 변경 할 경우 원본도 함께 변경됨 참조에 의한 호출

JAVA는 전달받은 값을 복사하여 처리하기 때문에 Call By Value 방식이다.

반응형

관련글 더보기

댓글 영역

>