public class Main {
public static void main(String[] args) {
int primitive = 1; // 기본 타입 변수 선언 및 초기화
Object reference = new Object(); // 참조 타입 변수 선언 및 초기화
System.out.println(primitive);
System.out.println(reference);
}
}
결과
1
java.lang.Object@7a81197
Q1. 왜 변수 'reference' 에는 값을 할당하지 않았는데, 결과 값이 'java.lang.Object@7a81197' 가 나왔는가?
Answer : 기본 변수는 데이터의 실제 값 '1' 을 저장한 반면, 참조 변수인 'reference' 는 해당 객체의 주소 값(메모리 주소)를 저장했기 때문이다.
위 코드에서, 'reference' 변수를 선언하고 초기화 했다.
하지만 'new Object()' 를 통해 생성된 객체는 'Object' 클래스의 기본 생성자를 통해 생성된 후 아무런 값도 할당해 주지 않았다. 따라서 해당 객체는 초기값이 'null' 인 빈 객체일 것이며, 참조변수 'reference'는 이 빈 객체의 주소 값을 불러와 'java.lang.Object@7a81197' 라는 결과가 나왔다.
Q1_1. 왜 이런 서로 다른 두 가지 방식으로 데이터를 저장하는가?
Answer : 프로그램의 효율성과 메모리 사용량을 최적화하기 위해서이다.
기본 변수는 데이터의 값을 직접 저장하기 때문에, 단순한 데이터를 읽고 쓰는데 있어서 빠르고 효율적이다. 하지만 데이터의 크기가 커지면 데이터를 직접 저장하는 것이 메모리 사용량 측면에서 비효율적일 수 있다.
또한 값이 복사될 때마다 메모리의 여러 곳에 복사가 되기 때문에, 값의 복사가 빈번히 일어나는 경우 객체 생성에 따른 메모리 부하가 발생할 수 있다.
참조 변수는 객체의 주소를 저장하기 때문에, 여러 번 객체를 사용해야 할 경우 새로운 객체를 생성할 필요 없이 참조된 메모리 주소의 값을 불러오면 된다. 그러므로 복잡한 값, 크기를 알 수 없는 데이터, 다양한 종류의 데이터를 다룰 때 등의 상황에 효율적이다.
따라서 기본 변수는 직접 저장한 값을 바로 불러오기 때문에, 기본적으로는 추가적인 연산과정을 거치는 참조 변수보다 메모리 사용량이 적다.
하지만 데이터의 값이 커질 경우 변수의 빈번한 값 복사와 정적 할당으로 인한 메모리 공간 낭비가 일어날 수 있고, 다양한 종류의 데이터를 동시에 다루거나 크기를 알 수 없는 데이터를 다룰 때 등 참조 변수가 더 효율적일 때가 있다.
결론적으로, 기본 변수와 참조 변수라는 두 가지 타입을 사용하는 이유는 상황과 환경에 맞게 적절히 두 변수를 사용하여 프로그램의 효율성과 메모리 사용량을 최적화하기 위해서이다.
** 아래는 같은 함수를 기본 변수와 참조 변수를 사용했을 때의 메모리 사용량의 차이이다.
기본 변수 사용(int)
public static int add(int x, int y) {
int result = x + y;
return result;
}
public static void main(String[] args) {
int a = 10;
int b = 20;
int sum = add(a, b);
System.out.println(sum);
Runtime.getRuntime().gc(); //메모리 사용량 측정
long usedMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
System.out.print(usedMemory + " bytes");
}
결과
참조 변수 사용(Integer)
public static Integer add(Integer x, Integer y) {
Integer result = x + y;
return result;
}
public static void main(String[] args) {
Integer a = 10;
Integer b = 20;
Integer sum = add(a, b);
System.out.println(sum);
Runtime.getRuntime().gc(); //메모리 사용량 측정
long usedMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
System.out.print(usedMemory + " bytes");
}
결과
=> 추가적인 연산 과정 등의 이유로 기본 변수 사용시 보다 참조 변수 사용시 메모리 소모량이 더 큼을 볼 수 있다.
Q1_1_1. 기본 변수와 참조 변수의 메모리 저장 및 처리 과정은?
Answer : 기본 변수는 스택 메모리에 값을 직접 저장한다. 함수의 호출 시 메모리에 할당되며, 함수의 호출이 완료되면 소멸한다.
참조 변수 또한 스택 메모리에 저장된다. 하지만 참조 변수는 기본 변수처럼 그 값을 직접 저장하는게 아닌, 힙(Heap) 영역에 저장된 객체의 주소값이 저장된다.
Q1_2. 'java.lang.Object@7a81197' 이 무엇을 의미하는가?
Answer : 'java.lang.Object' 클래스의 'hashcode()' 메소드가 'java.lang.Object@7a81197' 이라는 값을 반환했다는 것이다.
'Java' 카테고리의 다른 글
Java - 부모 생성자 호출 (0) | 2023.12.20 |
---|---|
Java - StringTokenizer 클래스 (+ vs split() 메소드 ) (1) | 2023.12.19 |
Java - 타입 (0) | 2023.12.19 |
Java - 상수 (0) | 2023.12.19 |
Java - 변수 (0) | 2023.12.19 |