자바

[JAVA] Int & Integer 차이점 그리고 wrapper 클래스

gitofjy 2024. 8. 22. 16:02

실무를 하다보니 Integer와 Int의 차이점을 제대로 몰라 막힌적이 있었다. 어쨌든 업무를 빨리 끝내는게 우선이니 컴파일 오류가 나지 않도록 코드를 작성했고 이제서야 정리를 해본다.

 

기본형(Primitive Type)

기본형은 객체가 아니기 때문에 다음과 같은 한계가 있다.

1) 객체가 아님: 기본형 데이터는 객체가 아니기 때문에, 객체 지향 프로그래밍의 장점을 살릴 수 없다.

2) null 값을 가질 수 없음: 기본형 데이터 타입은 null 값을 가질 수 없다. 때로는 데이터가 없음 이라는 상태를 나타내야 할 필요가 있는데, 기본형은 항상 값을 가지기 때문에 이런 표현을 할 수 없다.

 

 

래퍼 클래스 - 자바 래퍼 클래스

쉽게 이야기해서 래퍼 클래스는 기본형의 객체 버전이다.

자바는 기본형에 대응하는 래퍼 클래스를 기본으로 제공한다.

래퍼 클래스는 불변이면서 equals 로 비교해야 한다.

public class WrapperClassMain {
    public static void main(String[] args) {
 
        Integer integerObj = Integer.valueOf(10); //-128 ~ 127 자주 사용하는 숫자 값 재사용, 불변
        Long longObj = Long.valueOf(100);
        Double doubleObj = Double.valueOf(10.5);
        
        System.out.println("integerObj = " + integerObj);
        System.out.println("longObj = " + longObj);
        System.out.println("doubleObj = " + doubleObj);
        
        System.out.println("내부 값 읽기");
        int intValue = integerObj.intValue();
        System.out.println("intValue = " + intValue);
        long longValue = longObj.longValue();
        System.out.println("longObj = " + longValue);
        
        System.out.println("비교");
        System.out.println("==: " + (newInteger == integerObj));
        System.out.println("equals: " + newInteger.equals(integerObj));
        
    }
}

래퍼 클래스 생성 - 박싱(Boxing)

기본형을 래퍼 클래스로 변경하는 것을 마치 박스에 물건을 넣은 것 같다고 해서 박싱(Boxing)이라 한다. 내부에서 new Integer(10)을 사용해서 객체를 생성하고 돌려준다. 추가로 Integer.valueOf()에는 성능 최적화 기능이 있다. 개발자들이 일반적으로 자주 사용하는 -128 ~ 127 범위의 Integer 클래스를 미리 생성해준다. 해당 범위의 값을 조회하면 미리 생성된 Integer 객체를 반 환한다. 해당 범위의 값이 없으면 new Integer()를 호출한다. 마치 문자열 풀과 비슷하게 자주 사용하는 숫자를 미리 생성해두고 재사용한다.

intValue() - 언박싱(Unboxing)

래퍼 클래스에 들어있는 기본형 값을 다시 꺼내는 메서드이다. 박스에 들어있는 물건을 꺼내는 것 같다고 해서 언박싱(Unboxing)이라 한다.

비교는 equals() 사용

래퍼 클래스는 객체이기 때문에 == 비교를 하면 인스턴스의 참조값을 비교한다. 래퍼 클래스는 내부의 값을 비교하도록 equals()를 재정의 해두었다. 따라서 값을 비교하려면 equals()를 사용해야 한다.

 

 

래퍼 클래스 - 오토 박싱, 오토 언박싱

자바 1.5부터 오토 박싱(Auto-boxing), 오토 언박싱(Auto-Unboxing)을 지원한다.

오토 박싱과 오토 언박싱은 컴파일러가 개발자 대신 valueOf , xxxValue() 등의 코드를 추가해주는 기능이다. 덕분에 기본형과 래퍼형을 서로 편리하게 변환할 수 있다.

public class AutoboxingMain2 {
    public static void main(String[] args) {
 
    // Primitive -> Wrapper
    int value = 7;
    Integer boxedValue = value; // 오토 박싱(Auto-boxing)
    // Wrapper -> Primitive
    int unboxedValue = boxedValue; // 오토 언박싱(Auto-Unboxing)
    
    System.out.println("boxedValue = " + boxedValue);
    System.out.println("unboxedValue = " + unboxedValue);
    
    }
}

 

 

래퍼 클래스 - 주요 메서드

public class WrapperUtilsMain {
    public static void main(String[] args) {
    
    Integer i1 = Integer.valueOf(10);      // 숫자, 래퍼 객체 반환
    Integer i2 = Integer.valueOf("10");    // 문자열, 래퍼 객체 반환
    int intValue = Integer.parseInt("10"); // 문자열 전용, 기본형 반환
    
    //비교
    int compareResult = i1.compareTo(20);
    System.out.println("compareResult = " + compareResult);
    
    //산술 연산
    System.out.println("sum: " + Integer.sum(10, 20));
    System.out.println("min: " + Integer.min(10, 20));
    System.out.println("max: " + Integer.max(10, 20));
    
    }
}

valueOf() : 래퍼 타입을 반환한다. 숫자, 문자열을 모두 지원한다.

parseInt() : 문자열을 기본형으로 변환한다.

compareTo() : 내 값과 인수로 넘어온 값을 비교한다. 내 값이 크면 1 , 같으면 0 , 내 값이 작으면 -1 을 반환 한다. Integer.sum() , Integer.min() , Integer.max() : static 메서드이다. 간단한 덧셈, 작은 값, 큰 값 연산을 수행한다.

 

 

결론적으로 Int는 기본형, Int 기본형의 객체 버전이 Integer

성능은 당연히 기본형인 int가 좋지만 요즘의 환경에서는 고려할 사항이 아니다.

성능 보다는 유지보수에 초점을 맞춰 코드를 작성해야 한다.

 

 

 

 

 


(참고) 김영한의 실전자바 - 중급 1편 (섹션4. 래퍼, Class 클래스)

728x90