본문 바로가기
얄코의 제대로 파는 자바/섹션7 클래스와 자료형

Wrapper 클래스들

by 백엔드 개발자 2024. 6. 23.

 

 

  • 원시자료형에 각각 대응되는 클래스. 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