안녕하세요 푸드 테크팀 백엔드 개발자 박형민입니다.
오늘은 자바의 자료형 타입 중 Wrapper Class 에 대해서 포스팅 해보고자 합니다.
자바에서 자료형의 타입 2가지가 존재합니다.
두 자료형의 가장 큰 차이점 값을 저장하는가(기본타입), 주소를 참조하는가(참조타입) 입니다.
혹은, jvm내부에서 메모리가 어디 영역에 저장되는가로 구분할 수 있습니다.
(stack - 기본형이 저장됨, heap - 객체들이 저장됨)
자바에서 객체들이 생성될 때는, 그 객체가 힙영역에 생성되어, 생성된 주소를 참조하게됩니다.
//생성되는 순간, heap 영역에 Car객체가 생성되고
// myCar 는 그 주소값을 참조합니다.
Car myCar = new Car()
래퍼클래스도 마찬가지 입니다. 생성할 때 기본타입을 객체로 감싸서 생성주기 때문에 힙영역에 생성되고 그 주소값을 참조하는, 참조타입 자료형 입니다.
//래퍼클래스 또한 객체의 형식으로 기본타입을 감싸서 생성 -> 참조타입
Integer a = new Integer(1);
래퍼클래스란(Wrapper Class), 기본타입(primitive Type) 데이터를 객체로 다뤄야할 때, 참조 타입으로 다루기위해 객체로 감싸 다루는 것을 래퍼클래스라고 합니다.
== 비교 연산자는 비교하는 2 값들이 같은지를 비교합니다.
ex)
Integer a = new Integer(10);
Integer b = new Integer(10);
참조타입의 값을 비교하기 위해서는, equals 함수를 이용해야합니다.
String 또한, 래퍼클래스입니다. 즉 참조형 데이터 타입인데
String은 특이하게 "==" 연산으로 비교를 하곤 합니다. 왜 String만 다를까요?
그 이유는 스트링의 생성과 연관이 있습니다.
String의 생성 방식은
1. 리터럴 방식과
2. 객체 생성 방식 이 있습니다.
고정 데이터 값을 생성하는 방식으로 위처럼 String 변수에 값을 대입해주는 것을 말합니다.
String은 참조 데이터 타입이지만, 그 객체의 주소가 jvm heap 메모리 영역 내부에, 별도의 String Context Pool 영역을 가집니다.
String이 리터럴 방식으로 생성될 때, String 내부에서 Intern() 메소드가 호출됩니다.
Intern() 메소드는 그 값이 String pool 에 존재하면, 새로운 객체를 생성하지 않고, String pool에 미리 존재하는 문자열 객체의 주소값을 할당해 줍니다.
하지만 리터럴 방식이 아닌 new 연산자로 새로운 객체를 할당한다면,
참조 타입 객체 생성과 똑같이 새로운 객체로 생성됩니다.
따라서, 값이 같더라도 다른 객체를 생성해주기 때문에, 주소값이 달라 "=="비교를 할 수 없습니다.
오늘은 래퍼 클래스에 대해서 포스팅 해보았습니다.
래퍼 클래스는, Null 값을 받을 수 있기 때문에 어쩔 수 없이 Null을 허용해 주어야할 때 (Null 이 들어오는지 아닌지 모를 때? 라고 해야하나요...??) 주로 사용되는데
개인적인 생각으로는, Null 이라는게 굉장히 무서운 녀석이기에 신중하게 사용할 필요가 있다고 생각합니다.
또한, 기본 타입 변수에 비해서 객체를 생성해주는 것이기 때문에 작지만 불필요한 메모리를 차지할 수 도 있기에 명확하게 기본 타입 변수를 사용해줄 수 있는 상황에서는 Primitive Type 변수를 사용하는 것이 좋다고 생각됩니다!
좋은 글 잘 봤습니다.
Integer integer = 3;
int integer2 = integer;
위처럼 리털럴 <->Wrapper Class 는 자동으로 형변환이 되지만 null point error와
메모리를 많이 사용함으로 주의 해서 사용해야 합니다.