- 원시자료형에 각각 대응되는 클래스. int면 Integer, float이면 Float등등
- 해당 자료형과 관련된 클래스/인스턴스 기능들을 제공해준다. 제네릭에서도 중요하게 쓰인다.
- 원시값과 래퍼클래스의 인스턴스와 변환 가능하다.
- wrapper클래스 기능이 더 많은데 원시값이 존재하는 이유 : 성능이 더 좋아서.
- 객체의 인스턴스가 아닌 데이터가 있어서 자바가 순수한 객체지향 언어는 아니게 된다. 알아만 둘 것 .
원시- 래퍼 자료형 매핑
원시 자료형
|
래퍼 자료
|
byte
|
Byte
|
short
|
Short
|
int
|
Integer
|
long
|
Long
|
float
|
Float
|
double
|
Double
|
char
|
Character
|
boolean
|
Boolean
|
래퍼 클래스의 인스턴스
// 원시 자료형
int int1 = 123;
double dbl1 = 3.14;
char chr1 = 'A';
boolean bln1 = true;
// ⭐ 해당 래퍼 클래스의 인스턴스
// 기존의 생성자 방식
// ⚠️ 오늘날에는 deprecated - 성능상 좋지 않음
Integer int2 = new Integer(123);
Double dbl2 = new Double(3.14);
Character chr2 = new Character('A');
Boolean bln2 = new Boolean(true);
// 💡 아래의 클래스 메소드들이 권장됨
Integer int3 = Integer.valueOf(123);
Double dbl3 = Double.valueOf(3.14);
Character chr3 = Character.valueOf('A');
Boolean bln3 = Boolean.valueOf(true);
- 과거에는 생성자를 사용하였지만, 성능상문제로 deprecated 되었고, valueOf라는 메서드를 사용하는 것을 권장하고 있다.
- deprecated되도 기능을 바로 지우지 않는 이유는, 버전업등으로 jdk버전이 달라졌을때 기능이 없어서 에러가 생기는 일을 방지하게 위해서이다.
Number
숫자 자료형들을 전부 받아줄 수 있다.
int int1 = 123;
double dbl1 = 3.14;
Number num1 = int1;
Number num2 = dbl1;
박싱과 언박싱
박싱 : 원시값을 래퍼클래스 인스턴스로 변환한다.( int -> Integer 형으로 변환) = 아이언맨 변신
언박싱 : 래퍼클래스 인스턴스를 원시값으로 변환(Integer -> int 형으로 변환) = 수트 해제
명시적으로 박싱/언박싱 안해도 컴파일러가 자동으로 처리해준다.
성능상으로 떨어져서 자주 사용하는 것은 지양한다.
static int add(Integer a, Integer b) { return a + b; }
// 💡 오토박싱
Integer intInst2 = 234;
Double dblInst2 = 1.414213;
// 💡 오토언박싱
char chrPrim2 = Character.valueOf('B');
boolean blnPrim2 = Boolean.valueOf(false);
// 원시값과 래핑 클래스 인스턴스끼리의 연산
int intPrim2 = intPrim1 + intInst2;
Integer intInst3 = intPrim2 + intInst2;
// 메소드 등 사용처들에 혼용 가능
Integer intInst4 = add(3, 5);
특정 데이터가 원시값인지 래퍼클래스 인스턴스인지 신경 쓰지 말자. 알아서 컴파일러가 자동 변환해주니까.
다만, 오토로 하는것도 성능에는 좋지는 않기 때문에 반복문 등 자주 사용은 지양.
래퍼 클래스의 대표적/유용한 메소드들
valueOf | 박싱 해주는 메소드(원시값-> 래퍼클래스). Integer.valueOf("123")처럼 숫자로 변경가능한 문자열도 박싱해준다. |
parseInt, parseDouble .. | 원시값을 반환하는 메서드 |
isLetter(Character) | 문자여부 반환메서드 |
isUpperCase(Character) | 대문자여부 반환 |
isLowerCase(Character) | 소문자여부 반환 |
isDigit(Character) | 숫자로 된 문자 여부 반환 |
isSpaceChar(Character) | 공백인지 여부 반환 |
toString | 문자열 반환.(Object에서 오버라이드 되었다.) |
인스턴스 value 비교
// 인스턴스끼리의 value 비교
Integer intA = 12345;
Integer intB = 12345;
boolean compByOp1 = intA == intB; // ⚠️ 값은 같으나 다른 참조
boolean compByEq1 = intA.equals(intB);
Short srtA = 12345;
// ⚠️ 자료형이 다르면 false 반환 (메소드 코드 확인)
boolean compByOp2 = intA.equals(srtA);
- 원시형은 데이터에 직접쓰는 방식이라 인스턴스가 없어서 ==으로 되지만, 래퍼클래스는 인스턴스 생성이라 참조값이 존재한다. 그래서 ==을 쓰면 값이 달라도 참조가 같으면 true가 나올 수 있고 값이 같아도 참조가 다르면 false가 나오니 equals를 써주어야 한다.
- 값이 같아도 자료형이 다르면 false가 나온다. ( 원리만 이해하기.)
// 숫자 자료형 간 변환 - Number의 추상 메소드들
Byte int1Byt = int1.byteValue();
Double int1Dbl = int1.doubleValue();
Integer int4 = 123456789;
Byte int4Byt = int4.byteValue(); // ⚠️ 자료형보다 값이 큼
Float flt1 = 1234.5678f;
Integer flt1Int = flt1.intValue(); // ⚠️ 소수점 이하 버림
Short int1DblSrt = int1Dbl.shortValue();
- Number 클래스는 숫자 자료형관 변환하는 메서드들을 제공하는데, Byte <- Integer 처럼 자료형보다 값이 커지는 경우에는 엉뚱한 값이 담길 수 있다.
- float도 int로 바뀌면서 강제로 소수점 이하가 버려지는 경우가 생길 수 있다.
출처
학습 페이지
www.inflearn.com
'얄코의 제대로 파는 자바 > 섹션7 클래스와 자료형' 카테고리의 다른 글
다음 섹션용 게임 예제 (0) | 2024.07.06 |
---|---|
제네릭 (0) | 2024.06.24 |
Object (0) | 2024.05.27 |