자바&스프링

[자바] java 기본 타입와 wapper(래퍼) 클래스, 박싱과 언박싱

내가 그린 코딩 그림 2023. 4. 12. 23:34
반응형

자바에서 타입은 기본 타입과 wapper타입(클래스)로 나뉘게 됩니다. 이는 언뜻보면 비슷하지만 차이가 있으며 wrapper 클래스를 사용하므로서 더 객체지향적인 프로그래밍이 가능하다는 장점이 있습니다.

 

wrapper 클래스란?

실제 값을 가지는 것이 아니고 그 값을 가리키는 주소 값을 가진 껍데기입니다. 기본 타입을 참조 타입으로 사용하려고 할 때 쓰이는게 wrapper 클래스입니다. 계란과 계란껍데기로 비유를 하면 계란이라는 기본 타입이 존재하고 이를 감싸는게 래퍼 클래스인 계란 껍데기입니다. 이를 통해 기본 타입을 객체로 사용할 수 있습니다.

 

굳이 왜 이렇게 사용할까요? 그건 밑에서 보겠습니다.

 

wrapper 클래스의 특성

==으로 값을 비교할 수 없습니다. 실제 값을 가지고 있는게 아닌 주소를 가지고 있고 이는 각 고유한 값을 가지기 때문에 비교를 한다고 하더라도 다른 값이라고 판단하게 됩니다.(다르다의 의미로 false 출력)

 

만약 이 껍데기를 뚫고 숨어있는 값을 비교하고 싶다면? 내면을 들여다 볼 수 있는 equals를 사용하면 됩니다.

 

 

기본 타입와 wapprer 클래스

기본타입 wapper 타입 가질 수 있는 값(역할)
boolean Boolean true 또는 false 값
byte Byte 8비트의 정수값
short Short 16비트의 정수 값
int Integer 32비트의 정수 값
long Long 64비트의 정수 값
float Float 32비트의 부동 소수점 값
double Double 64비트의 부동 소수점 값
char Charater 16비트의 유니코드 문자 값

String은 애초에 참조타입이기 때문에 기본 타입에 포함되지 않습니다.

 

 

wrapper 클래스(참조 타입)의 사용 이유

1. Null 값을 편하게 처리

기본 타입의 경우는 null 값이 허용되지 않지만 wrapper 클래스를 사용하게 되면 null 값을 허용할 수 있습니다. 물론 null을 유도하는 경우는 많지 않겠지만 checked error에서 unchecked error로 에러 타입을 전환시킬 수 있습니다.(프로그램이 중지되는 에러에서 중지되지는 않는 에러로)

 

2. 제네릭 프로그래밍

제네릭 클래스는 참조 타입만을 허용합니다. 기본 타입은 제네릭 클래스의 인자로 허용이 안되는데 wrapper 클래스를 활용하면 가능해집니다.

 

3. 컬렉션 프레임 워크

컬렉션에서는 객체만 저장이 가능합니다. wrapper 클래스를 사용하면 기본 타입도 컬렉션 프레임워크에서 객체 형태로 저장이 가능합니다.

 

4. 객체지향적인 프로그래밍

자바는 객체지향 프로그래밍언어입니다. 기본 타입도 객체로 다룰 수 있게 해줌으로써, 객체지향적인 프로그래밍이 가능하게 해줍니다.

 

 

박싱(boxing)과 언방식(unBoxing)

기본 타입을 wapper 클래스를 활용하여 객체화 하는 것을 박싱이라고 하며, 그 반대를 언박싱이라고 표현합니다. 같은 형태의 기본 타입과 wrapper 클래스를 변환한다면 박싱과 자동 언방식이 일어나게 됩니다.

 

 

자동박싱(autoBoxing), 자동언박싱(autoUnBoxing)

자동 박싱과 언방식이 일어나 Integer a에 실제 값인 412를 넣어도 오류가 발생하지는 않습니다(주황색 저 줄은 오류는 아닙니다) 그걸 다시 b라는 변수에 담아서 출력할수도 잇는데 이 과정에서 이미 자동 박싱과 언박싱이 일어난것을 확인할 수 있습니다.

 

하지만 c와 d의 케이스는 이미 c에서 대입되는 값부터 자동 방식이 불가능하다고 자바가 판단하고 오류를 뱉어내는 것을 확인할 수 있습니다.

실제 에러를 보면 그 위에 에러는 얘기하지 않고 7번째 줄이 잘못 되었다고 알려주고 있습니다. String을 Integer로 변환할 수 없다는 것입니다.

 

참조 타입의 값을 읽어오기

위처럼 abc에 "412"라는 문자열을 넣었는데도 Integer.parseInt를 사용하면 이를 기본 값으로 바꾸고 int값으로 읽을 수 있다면 변수에 넣을 수 있습니다. 참조 타입을 변환할 때는 parse를 사용하여 이를 기본 값으로 변환이 가능하다는 것을 알 수 있습니다.

 

그러면 이런 경우는 어떨까요? abc에 int값도 있고 문자열도 있습니다. 이런경우 bb에 담지 못하게 됩니다. Intger.parseInt를 하는 순간 정수 값으로 읽을 수 없는 형태이기 때문에 오류를 반환하게 됩니다.

 

읽어보니 number 즉, 숫자의 형태가 아니라고 오류를 주네요

반응형