CS/Java

자료형(기본 자료형, 참조 자료형, Wrapper Class, 박싱과 언박싱)

MinCodeHub 2025. 10. 15. 17:29

기본 자료형

자바에서 가장 기본적인 데이터 타입이며, 값 자체를 저장합니다.

 

정수형: byte, short, int, long

실수형: float, double

문자형: char

논리형: boolean

 

기본 자료형은 메모리에서 고정된 크기의 공간을 차지하며, 실제 데이터 값을 저장합니다.

 

특징

  • 총 8가지의 기본형을 미리 정의하고 제공합니다.
  • 기본 자료형은 반드시 사용하기 전에 선언되어야 합니다.
  • 운영체제에 따라 자료형의 길이가 변하지 않습니다.
  • 값을 직접 저장하기 때문에 null을 허용하지 않습니다. 만약 기본형에 null을 넣고싶다면, Wrapper Class를 활용해야합니다.
  • 스택(Stack)메모리에 저장됩니다.

 

참조 자료형

참조 자료형은 객체의 주소를 저장합니다.

참조형은 Java에서 최상인 java.lang.Object클래스를 상속하는 모든 클래스들을 말합니다.

 

클래스 타입(class type), 배열 타입(array type), 인터페이스 타입(interface type), 열거 타입(enum type)

 

원본데이터의 주소(참조값)만 가지고 있기에 모든 참조자료형의 크기는 같습니다.

String s;
int[] nums;
List<String> list;
User user;

위의 변수들은 전부 주소값만 들고있기 때문에 변수 자체가 차지하는 크기는 모두 동일합니다.

 

특징

  • null을 허용합니다.
  • Heap 영역에는 객체를 저장하고, Stack 메모리 영역에는 객체의 주소(참조)를 저장합니다.
  • new로 생성된 객체들은 메모리 영역인 Heap영역에 생성되고, Garbage Collector가 돌면서 메모리를 해제합니다.
String name = new String("Minyoung");

 

Stack 영역

  • 변수 name이 만들어집니다.
  • 변수에 Heap에 있는 객체의 주소값(참조)이 저장됩니다.

Heap 영역

  • "Minyoung"이라는 문자열 객체가 생성됩니다.

 

기본형

int a = 10;
int b = a;
  • a와 b는 둘 다 stack에 있고,
  • 값 10이 각각 복사되어 저장됩니다.
  • a를 바꿔도 b에 영향이 없습니다.

 

참조형

User u1 = new User("Heo");
User u2 = u1;
  • 둘다 Stack에 있지만, 같은 Heap 객체의 주소를 공유합니다.
  • 즉, u1과 u2는 같은 객체를 가리킵니다. 
  • u1.setName("Kim")을 하면 u2.getName()도 "Kim"이 됩니다.

 

기본자료형은 null이 허용되지 않지만, 참조 자료형은 null이 허용되는 이유

int, boolean같은 기본 자료형은 실제 값이 메모리에 직접 저장되기 때문에 값이 없다는 개념인 null을 가질 수 없습니다.

 

반면에 String, Object같은 참조 자료형은 객체의 메모리 주소를 저장하는 변수입니다.

따라서 참조할 객체가 없거나 아직 할당하지 않은 경우, 해당 메모리 주소가 없다는 의미로 null을 가질 수 있습니다.

null은 어떤 객체도 참조하고 있지 않음을 나타냅니다.

 

 

Wrapper Class

자바는 대신 기본 자료형을 객체처럼 다룰 수 있는 래퍼 클래스를 제공합니다.

레퍼 클래스는 기본 자료형을 객체로 감싸 참조 자료형처럼 사용할 수 있게 해주며, null값을 가질 수 있게 해줍니다.

기본 자료형인 int에 빨간줄이 쳐져있는 것을 확인할 수 있습니다.

 

  • int -> Integer
  • char -> Character
  • boolean -> Boolean
  • float -> Float
  • double -> Double
  • byte -> Byte
  • short -> Short
  • long -> Long

언제 사용하는가?

프로그래밍을 하다보면 기본 타입의 데이터를 객체로 표형해야 하는 경우가 종종 생깁니다.

예를 들어 메소드 인수로 객체 타입만이 요구되면, 기본 타입의 데이터를 그대로 사용할 수 없기 때문에 변환 작업이 필요합니다.

또한 멀티스레드 환경에서 동기화 데이터를 사용해야 할 경우 이를 객체화 해야할 필요성이 생깁니다.

auto-boxing과 auto-unboxing

자바5(JDK 1.5)부터 오토박싱과 언박싱 기능이 도입되어 기본 자료형과 래퍼 클래스 간의 변환이 자동으로 이뤄지게 되었습니다.

 

auto-boxing

  • 기본 자료형을 래퍼 클래스로 자동 변환하는 것
int a = 10;
Integer b = a; //오토박싱: int -> Integer

 

auto-unboxing

  • 래퍼 클래스를 기본 자료형으로 자동 변환하는 것
Integer a = new Integer(10);
int b = a; //언박싱: Integer -> int

 

이는 기본자료형과 참조 자료형 간의 변환을 쉽게 해주지만, 여전히 기본 자료형은 null값을 가질 수 없습니다.

 

null값을 가진 래퍼 클래스를 기본 자료형으로 언박싱하려고 하면 NPE가 발생합니다.

박싱과 언박싱 - 언제 사용하는가?

래퍼 클래스는 산술 연산을 위해 정의된 클래스가 아닙니다.

생성된 인스턴스의 값만을 참조할 수 있기 때문에 래퍼 클래스 인스턴스에 저장된 값을 직접 변경할 수는 없습니다.

그래서 래퍼 클래스를 언박싱 한 뒤에 값을 변경한 뒤 박싱해야하는 중간 단계를 거칠 필요가 있습니다.

 

 

auto-boxing, auto-unboxing기능을 이용해 래퍼 클래스 연산

오토 박싱 & 언박싱 기능을 이용해 래퍼 객체를 직접 연산이 가능해집니다.

원래는 래퍼 클래스는 직접 연산이 불가능하지만 컴파일러가 스스로 판단해 자동으로 언박싱하여 연산하기 때문에 가능해지는것입니다.

 

Wrapper 클래스 동등 비교

객체 값을 비교할 때는 동등 연산자 == 로는 값을 비교하는게 아닌 객체의 주소값을 비교해서 의도적이지 않은 작동이 일어나기 때문에 조심해야합니다.

 

-128 ~ 127 에 대해서는 새로운 Integer 객체를 매번 생성하지 않고 캐시된 객체를 재사용하기 때문에 

true로 나오지만 200은 그 범위를 벗어나기 때문에 새로운 객체를 생성하며 다른 메모리 주소에 저장이 됩니다.

 

캐싱이 안되는 범위 내에서는 의도치 않은 결과가 나올 수 있기 때문에 래퍼 클래스의 객체 값 비교는 

직접 언박싱해서 비교하던가,

equals() 메소드를 통해 비교를 해야합니다.

 

동등 비교 외의 연산은 문제 없습니다.

 

래퍼클래스와 기본 자료형과의 비교는 자동으로 오토박싱과 언박싱을 해주기 때문에 == 연산과 equals연산 모두 가능합니다.

 

'CS > Java' 카테고리의 다른 글

Call By Value와 Call By Reference  (0) 2025.10.14
Generic  (0) 2025.10.13