Java : Primitive Type / Reference Type
- 프로그래밍 언어/JAVA
- 2023. 2. 5.
자바 Primitive Type / Reference Type
데이터 타입은 데이터가 메모리에 어떻게 저장되고, 프로그램에서 어떻게 처리되어야 하는지를 명시적으로 알려준다. 자바에는 크게 Primitive Type(기본형 타입)과 Reference Type(참조형 타입)이 존재한다. 그렇다면 각 타입은 어떤 차이점을 가지고 있을까?
기본형 타입(Primitive Type)
- 기본형 타입은 기본값을 가지고 있다. 기본값이 존재하기 때문에 Null이 존재하지 않는다.
- 기본형 타입은 8가지가 존재한다.
- 기본형 타입은 실제 값을 스택(Stack) 메모리에 저장한다.
- 변수의 선언과 동시에 메모리에 생성됨.
- 컴파일 시점에 담을 수 없는 값을 담으려 하는 경우 컴파일 에러가 발생한다. Null을 넣을 수 없기 때문에 Null을 할당하는 경우 컴파일 에러가 발생한다.
타입 | 할당되는 메모리 크기 | 기본값 | 저장 공간 | |
논리형 | boolean | 1 byte | false | Stack Memory |
정수형 | byte | 1 byte | 0 | Stack Memory |
short | 2 byte | 0 | Stack Memory | |
int(기본) | 4 byte | 0 | Stack Memory | |
long | 8 byte | 0L | Stack Memory | |
실수형 | float | 4 byte | 0.0F | Stack Memory |
double | 8 byte | 0.0 | Stack Memory | |
문자형 | char | 2 byte | Stack Memory |
참조형 타입(Reference Type)
- 기본형 타입을 제외한 타입들이 모두 참조형 타입이다.
- 빈 객체를 의미하는 Null이 존재한다. 즉, 런타임에 Null Pointer Exception이 발생할 수 있다.
- 참조형 타입은 어떤 값이 저장되어 있는 주소를 값으로 갖는다.
- 객체의 값이 저장되어 있는 곳의 주소값을 힙(Heap) 메모리에 저장한다.
- 힙 메모리 영역에서 GC가 동작하며 불필요한 객체들을 삭제한다.
- 참조형 변수 간의 연산은 불가능하다.
- 참조형 변수의 값 자체는 주소값을 의미하기 때문이다. 참조형 변수끼리 더한다는 것은 주소 값이 가리키고 있는 기본형 변수끼리 연산된다.
타입 | 예시 | 기본값 | 할당되는 메모리 크기 |
Array | int[] arr = new int[5]; | Null | 4 byte (객체의 주소값) |
Enum | Null | ||
Class | String str = "test" | Null | |
Interface | Null |
Primitive Type vs Reference Type의 비교
아래 그림으로 살펴볼 수 있다.
- Primitive Type
- n = 10을 하면 현재 호출된 메서드의 Stack 영역에서 바로 생성된다. 즉, Stack 메모리 영역에는 n이라는 변수가 선언되어 있고, n은 10을 가진다.
- Reference Type
- Reference Type은 생성될 때 힙(Heap) 메모리 영역에서 생성된다. 생성된 인스턴스가 필드를 가지고 있다면, 그 값은 인스턴스에게 배정된 메모리에 할당된다.
- new String()을 하면 인스턴스가 생성된다. 이 때, 리턴값은 생성된 인스턴스의 힙 메모리의 주소다.
- A = new String()일 때, A는 현재 메서드가 호출된 Stack 메모리 영역에 할당된 변수(주소)다. 그리고 이 변수(주소)는 힙 메모리에 생성된 인스턴스 주소를 가리킨다.
기본형 매개변수(Primitive Type)와 참조형(Reference Type) 매개 변수
자바에서 메서드를 호출할 때 매개변수로 지정한 값을 메서드의 매개변수에 복사해서 넘겨준다. 매개변수의 타입에 따라서 어떻게 값이 복사되어 전달되는지가 결정된다.
- 기본형(Primitive Type, CallByValue로 동작) : 기본형 타입은 Stack 영역에서 값을 직접 가지고 있다. 따라서 매개변수로 값을 넘겨준다면, 값이 직접 복사되어 전달된다. 즉, 매개변수로 전달되는 값의 주소와 전달된 곳에서의 값의 주소가 서로 다르다. CallByValue를 의미한다.
- 참조형(Reference Type, CallByReference로 동작) : 참조형 타입은 힙 메모리 영역의 인스턴스 주소를 가리킨다. 매개변수로 넘기게 되면, 힙 메모리 영역의 인스턴스 주소를 복사해서 넘기게 된다. 매개변수로 전달되는 값이 주소와 전달된 곳에서의 값의 주소가 동일하다. 즉, 힙 메모리에 존재하는 동일한 객체를 가리키기 때문에 값을 읽어오고 변경하는 것이 가능해진다. CallByReference를 의미한다.
출처
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
Effective Java : 아이템3 완벽 공략 (0) | 2023.02.25 |
---|---|
Effective Java : 아이템3. 생성자나 열거 타입으로 싱글턴임을 보증하라. (0) | 2023.02.25 |
Java의 상속 (0) | 2023.01.20 |
Java Stream과 Stream 활용한 예시 (0) | 2022.02.25 |
멀티 쓰레드 관련 공부 (0) | 2022.02.25 |