담비의 개발블로그

[CS] 원시타입 참조타입 본문

CS(컴퓨터과학)

[CS] 원시타입 참조타입

담비12 2025. 10. 21. 20:43
원시 타입 (Primitive Type)

 

원시 타입은 정수, 실수, 문자, 논리값 등 실제 데이터 값을 저장하는 가장 기본적인 데이터 타입이다.

 

  주요 특징

값 저장 방식: 변수 선언 시 확보된 메모리 공간(주로 스택(Stack) 메모리 영역)에 실제 값 자체가 저장다.

크기: 각 타입별로 메모리 크기가 고정되어 있다. (예: int는 4바이트).

NULL 허용 불가능: null 값을 가질 수 없습니다. (값을 저장하는 공간이므로). 만약 초기화하지 않으면 각 타입의 기본값(0, false 등)이 할당된다.

성능/효율성: 실제 값에 직접 접근하므로 참조 타입에 비해 접근 속도가 빠르며 메모리 사용량이 효율적이다.

종류 (자바 기준)

- 정수: byte, short, int, long

- 실수: float, double

- 문자: char

- 논리: boolean

 

◆ 값의 복사 (할당) 예시

원시 타입 변수를 다른 변수에 할당할 때, 값이 복사되어 전달된다. 따라서 두 변수는 완전히 독립적이다.

int a = 10;
int b = a;  // b에 a의 값 10이 복사됨
a = 20;     // a의 값만 변경
System.out.println(b); // 결과: 10 (b는 그대로)

 

 

참조 타입 (Reference Type)


참조 타입은 객체(Object)의 주소(Reference)를 저장하는 타입이다. 실제 데이터는 별도의 메모리 공간에 저장되고, 변수는 그 데이터가 위치한 곳을 가리킨다.

◆ 주요 특징
값 저장 방식: 변수 자체(스택 메모리)에는 객체의 실제 값이 아닌, 객체가 저장된 메모리 공간(주로 힙(Heap) 메모리 영역)의 주소(참조값)가 저장된다.
크기: 객체의 크기가 동적으로 변하기 때문에 미리 정해져 있지 않는다. 변수 자체의 크기는 주소(참조값)를 저장하는 데 필요한 크기이다.
NULL 허용: 객체를 참조하지 않는다는 의미로 null 값을 가질 수 있다. 이 때문에 NullPointerException이 발생할 수 있다.
성능/효율성: 실제 값을 얻으려면 참조 주소를 따라가야 하므로 원시 타입에 비해 접근 속도가 느릴 수 있고 메모리 사용량이 상대적으로 클 수 있다.

◆ 종류 (자바 기준): 원시 타입 8개를 제외한 모든 타입
- 클래스: String, Integer (래퍼 클래스), 사용자 정의 클래스 등
- 인터페이스
- 배열
- 열거(Enum)

 

 참조의 복사 (할당) 예시
참조 타입 변수를 다른 변수에 할당할 때, 주소(참조값)가 복사되어 전달된다. 따라서 두 변수는 같은 객체를 가리키게 된다. 한 변수를 통해 객체의 내용을 변경하면, 다른 변수에도 영향을 미친다.

// 자바에서 배열은 참조 타입
int[] arr1 = {1, 2};
int[] arr2 = arr1; // arr2에 arr1의 주소가 복사됨 (같은 객체 참조)
arr1[0] = 99;      // arr1을 통해 객체 내부 값 변경
System.out.println(arr2[0]); // 결과: 99 (arr2도 변경된 객체를 참조)

 

 

원시타입과 참조타입의 차이점
항목 원시타입(Primitive Type) 참조타입(Reference Type)
저장 값 실제 데이터 값 객체의 메모리 주소(참조값)
저장 위치 스택(Stack) 메모리 객체는 힙(Heap) 메모리, 변수는 스택에 주소 저장
NULL 허용 불가능 (기본값 존재) 가능 (null은 객체를 참조하지 않음을 의미)
데이터 크기 고정 크기 가변 크기 (객체 구조에 따라 다름)
할당/복사 시 값 복사 (서로 독립적) 참조(주소) 복사 (같은 객체를 공유)
성능 빠름 (직접 접근) 느릴 수 있음 (주소를 찾아가야 함)
제네릭 사용 불가능 (예: List<int>) 가능 (예: List<Integer>)

 

 

◆ 래퍼 클래스와 오토 박싱/언박싱
- 자바에서는 원시 타입(int, char 등)에 대응하는 참조 타입(Integer, Character 등)인 래퍼 클래스(Wrapper Class)를 제공한다. 이는 참조 타입만 사용할 수 있는 컬렉션(List, Map 등)이나 제네릭에서 원시 타입을 객체처럼 다룰 수 있게 해준다.

▶ 오토 박싱 (Auto-Boxing): 원시 타입을 자동으로 래퍼 클래스 객체로 변환 (int => Integer).
▶ 오토 언박싱 (Auto-Unboxing): 래퍼 클래스 객체를 자동으로 원시 타입으로 변환 (Integer => int).