본문 바로가기
Java의 정석/java.lang 패키지 & 유용한 클래스

문자열과 숫자 변환, 오토박싱 & 언박싱

by Hwanii_ 2023. 9. 2.
728x90
ch9 - 28 ~ 31
문자열과 숫자 변환, 오토박싱 & 언박싱

 

ch9 - 28
문자열을 숫자로 변환 하기.

- 문자열을 숫자 (or 래퍼클래스) 로 변환 하는 다양한 방법.

int i = new Integer("100").intValue();  //  floatValue(), longValue(), ..
>> 래퍼 클래스인 Integer 100 에 intValue() 메서드를 사용해서 원시타입인 int 형의 데이터로 바꿀 수 있다.

int i2 = Integer.parseInt("100");       //  주로 이 방법을 많이 사용 한다.

Integer i3 = Integer.valueOf("100");    //  parseXxx("str") 메서드가 귀찮으면, valueOf("str") 사용 하면 된다.

대신에,
parseXxx("str") 메서드를 사용 하면, 반환 값이 원시타입 인데,
valueOf("str") 메서드를 사용 하면, 반환 값이 래퍼 클래스 이다.
하지만, 타입은 래퍼 클래스 로 받는게 정석이지만, 그냥 원시타입 으로 받는것이 가능 하긴 하다.

Double i4 = Double.valueOf("500");

↓

double i4 = Double.valueOf("500");  //  원시타입 가능.

만약에, 숫자를 문자로 바꾸고 싶으면 .toString() 메서드를 사용 하면 된다.

- n진법의 문자열을 숫자로 변환 하는 방법.

int i4 = Integer.parseInt("100", 2);     2진수로 바꿔주기.     //  100(2) -> 4 (10진수로 보여 준다)
int i5 = Integer.parseInt("100", 8);     8진수로 바꿔주기.     //  100(8) -> 64 (10진수로 보여 준다)
int i6 = Integer.parseInt("100", 16);    16진수로 바꿔주기.    //  100(16) -> 256 (10진수로 보여 준다)
int i7 = Integer.parseInt("FF", 16);     16진수로 바꿔주기.    //  100(16) -> 255 (10진수로 보여 준다)

int i8 = Integer.parseInt("FF");         10진수로 바꿔주기. (인자에 n진수 작성을 안했으니까)
--> NumberFormatException 발생 한다.
--> why ?
--> FF를 10진수로 표현 할 수 없어서 ~

 

예제 01 )

 

class Ex9_15 {

    public static void main(String[] args) {

        int i = new Integer("100").intValue();
        int i2 = Integer.parseInt("100");
        Integer i3 = Integer.valueOf("100");

        int i4 = Integer.parseInt("100", 2);
        int i5 = Integer.parseInt("100", 8);
        int i6 = Integer.parseInt("100", 16);
        int i7 = Integer.parseInt("FF", 16);
//     int i8 = Integer.parseInt("FF");     // NumberFormatException 발생

        Integer i9 = Integer.valueOf("100", 2);
        Integer i10 = Integer.valueOf("100", 8);
        Integer i11 = Integer.valueOf("100", 16);
        Integer i12 = Integer.valueOf("FF", 16);
//     Integer i13 = Integer.valueOf("FF"); // NumberFormatException 발생

        System.out.println(i);
        System.out.println(i2);
        System.out.println(i3);
        System.out.println("100(2) -> " + i4);
        System.out.println("100(8) -> " + i5);
        System.out.println("100(16)-> " + i6);
        System.out.println("FF(16) -> " + i7);

        System.out.println("100(2) -> " + i9);
        System.out.println("100(8) -> " + i10);
        System.out.println("100(16)-> " + i11);
        System.out.println("FF(16) -> " + i12);

    }

}

  

[ console ]

 

 

ch9 - 30
오토박싱 & 언박싱

예시 )

int -> 기본 (원시) 타입

이것을
Integer -> 래퍼클래스
로 자동 변환 해주는 기능을 "오토박싱" 이라 한다.

반대로,
Integer을 int 타입으로 변환 해주는 기능을 "언박싱" 이라 한다.

기본형과 참조형 간의 자동 변환 >> 오토박싱 & 언박싱

- JDK 1.5 이전에는 기본형 (원시타입) 과 참조형 간의 연산이 불가능 했다.

int i = 5;
Integer iObj = new Integer(7);

int sum = i + iObj;     //  에러 : 기본형과 참조형 간의 연산 불가. (JDK 1.5 이전)

하지만, JDK 1.5 이후 부터는, 오토박싱 & 언박싱 기능을 제공해줘서 연산이 가능해졌다.

하지만, 자바의 기본 개념 자체가 바뀐게 아니라, 자바의 컴파일러가 코드를 변환 해주는 것이다.

컴파일 전의 코드
int i = 5;
Integer iObj = new Integer(7);
int sum = i + iObj; >> 불가능.

컴파일 후의 코드
int i = 5;
Integer iObj = new Integer(7);
int sum = i + iObj.intValue();  //  기본형으로 intValue() 메서드를 자동으로 사용해줘서 바꿔준다.
(언박싱)

- 기본형의 값을 객체로 자동 변환 하는 것을 오토박싱 이라 하고, 그 반대는 언박싱 이라 한다.

예시 )

List<Integer> list = new ArrayList<Integer>();

list.add(10);                   //  오토박싱. 10 -> new Integer(10)

즉, list.add(new Integer(10));

int value = list.get(0);        //  언박싱. new Integer(10) -> 10

value = 10;                     //  원래는 intValue() 메서드를 사용 해서 원시타입으로 바꿔줘야 한다.

원래는 제네릭을 Integer로 해줬기 때문에,
Integer 객체만 저장이 가능한 배열리스트 이다.

정리 : 개발자가 쉽게 개발 할 수 있도록, 컴파일러가 코드를 대신 자동으로 추가해주는것이다. (오토박싱 & 언박싱)

 

ch-9 - 31
오토박싱 & 언박싱 예제

 

class Ex9_16 {

    public static void main(String[] args) {

        int i = 10;

        // 기본형을 참조형으로 형변환 (형변환 생략 가능)
        Integer intg = (Integer) i; // Integer intg = Integer.valueOf(i);
        Object obj = (Object) i;    // Object obj = (Object)Integer.valueOf(i);

        Long lng = 100L;  // Long lng = new Long(100L); (기본형을 참조형에 저장 가능 => 오토박싱)

        int i2 = intg + 10;   // 참조형과 기본형 간의 연산 가능
        long l = intg + lng;  // 참조형 간의 덧셈도 가능

        Integer intg2 = new Integer(20);
        int i3 = (int) intg2;  // 참조형을 기본형으로 형변환도 가능 (형변환 생략 가능)

        Integer intg3 = intg2 + i3;

        System.out.println("i     = " + i);
        System.out.println("intg  = " + intg);
        System.out.println("obj   = " + obj);
        System.out.println("lng   = " + lng);
        System.out.println("intg + 10  = " + i2);
        System.out.println("intg + lng = " + l);
        System.out.println("intg2 = " + intg2);
        System.out.println("i3    = " + i3);
        System.out.println("intg2 + i3 = " + intg3);

    }

}

 

[ console ]

 

반응형