Java에서 int와 Integer 이해하기: 주요 차이점, 모범 사례 및 흔히 발생하는 함정

目次

1. 소개

Java에서 정수형 기본

Java에서 숫자를 다룰 때 가장 기본적인 데이터 타입 중 하나가 정수형(int)입니다. 이는 원시 타입으로, 프로그램 내에서 수치 연산을 빠르고 메모리 효율적으로 수행할 수 있게 해줍니다.
반면 Java는 Integer 라는 클래스를 제공하는데, 이는 래퍼 클래스로, int 값을 객체로 다룰 수 있게 해 주어 Java의 객체 지향 철학에 맞게 설계되었습니다.
이 두 타입은 겉보기엔 비슷해 보이지만, 목적과 동작 방식에 명확한 차이가 있습니다. 그래서 Java 초보자들은 종종 “intInteger의 차이는 무엇인가요?” 혹은 “각각을 언제, 어떻게 사용해야 할까요?” 라는 질문을 하게 됩니다.

Integer 클래스를 배워야 하는 이유

Java에서는 컬렉션 프레임워크(List, Map 등)를 사용할 때, null 값을 다룰 때, 혹은 제네릭스를 사용할 때와 같이 원시 int 타입만으로는 충분하지 않은 상황이 많이 있습니다. 이런 경우 Integer 클래스가 필수적이므로, 그 기본 개념을 이해하는 것이 중요합니다.
Integer 클래스는 문자열과 숫자 간 변환, 비교, 비트 연산 등 다양한 유용한 메서드를 제공하므로, 이를 잘 활용하면 보다 견고하고 가독성 높은 코드를 작성할 수 있습니다.
본 문서는 Integer 클래스를 중심으로 int와의 차이점, 사용 방법, 실용적인 활용 사례 등을 설명합니다. Java를 처음 배우는 분이든 어느 정도 경험이 있는 분이든, 여기서 도움이 되는 정보를 얻을 수 있으니 계속 읽어 보세요!

2. Integer 클래스란?

래퍼 클래스 역할

Java Integer 클래스는 래퍼 클래스로, 원시 int 타입을 객체로 취급할 수 있게 해 줍니다. 이름 그대로 래퍼는 무언가를 “감싸는” 역할을 하는데, 여기서는 원시 int 값을 Integer라는 “상자”에 포장해 객체로 사용할 수 있게 합니다.
예를 들어, Java 컬렉션(List, Map 등)은 객체만을 다룰 수 있기 때문에 원시 타입인 int를 직접 사용할 수 없으며, 대신 Integer가 필요합니다.

List<Integer> numbers = new ArrayList<>();
numbers.add(10); // The int value 10 is automatically converted to Integer and stored

int 값을 객체 형태(박싱)로 변환함으로써, 다양한 Java API와 프레임워크를 문제 없이 사용할 수 있습니다.

자동 박싱(Autoboxing)과 자동 언박싱(Unboxing)

Java 5부터는 자동 박싱자동 언박싱이라는 편리한 기능이 도입되었습니다.

  • 자동 박싱 : int 값이 자동으로 Integer 객체로 변환됩니다.
  • 자동 언박싱 : Integer 객체가 자동으로 int 값으로 변환됩니다.
    Integer num = 100; // Autoboxing
    int result = num + 50; // Unboxing occurs for the calculation
    

이 덕분에 개발자는 명시적인 변환 코드를 작성할 필요가 없으며, Java가 자동으로 변환을 처리해 코드가 더 간결하고 읽기 쉬워집니다.
다만, null 값을 언박싱하려고 하면 NullPointerException이 발생하므로 주의가 필요합니다.

Integer value = null;
int x = value; // This throws an exception

Integer의 의미

Integer 클래스는 단순히 int를 대체하는 것이 아닙니다. 객체로서 다음과 같은 특성을 가집니다:

  • null을 할당할 수 있어 “값이 설정되지 않음”을 표현할 수 있습니다.
  • 다양한 메서드를 제공해 유연한 연산이 가능합니다.
  • 컬렉션 및 기타 객체 기반 구조에서 사용할 수 있습니다.

요컨대, Java의 객체 지향 환경에서 Integerint보다 더 적합한 상황이 많이 존재합니다.

3. Integer 클래스의 주요 필드와 상수

Java Integer 클래스는 숫자와 관련된 유용한 상수정보를 조회할 수 있는 필드를 여러 개 정의하고 있습니다. 이를 활용하면 코드의 가독성과 유지 보수성이 크게 향상됩니다.
가장 많이 사용되는 필드들을 살펴보겠습니다.

MAX_VALUE와 MIN_VALUE

Integer.MAX_VALUEInteger.MIN_VALUEint 타입이 가질 수 있는 최대값최소값을 각각 나타내는 상수입니다.

  • MAX_VALUE : 2,147,483,647 (2의 31제곱에서 1을 뺀 값)
  • MIN_VALUE : -2,147,483,648 (2의 31제곱의 음수)

이 값들은 범위 확인이나 오버플로우 방지를 위해 자주 사용되며, 안전한 숫자 처리에 필수적입니다.

int max = Integer.MAX_VALUE;
int min = Integer.MIN_VALUE;

System.out.println("Max value: " + max); // 2147483647
System.out.println("Min value: " + min); // -2147483648

SIZE와 BYTES

SIZEBYTESint 타입이 사용하는 비트 수바이트 수를 나타내는 상수입니다.

  • Integer.SIZE : 32 (비트 수)
  • Integer.BYTES : 4 (바이트 수)

이것들은 바이너리 데이터 처리나 시스템 프로그래밍 시나리오에서 자주 사용되며, 데이터 크기 계산이나 암호화 목적으로 사용됩니다.

System.out.println("Number of bits in int: " + Integer.SIZE);   // 32
System.out.println("Number of bytes in int: " + Integer.BYTES); // 4

TYPE 필드

Integer.TYPEint 타입의 Class 객체를 반환하는 정적 필드입니다. 이는 리플렉션이나 제네릭스와 같은 고급 프로그래밍 기법에서 가끔 사용됩니다.

Class<?> clazz = Integer.TYPE;
System.out.println(clazz.getName()); // int

일상적인 개발에서는 자주 사용되지 않지만, Java 내부나 프레임워크 개발에 관심이 있다면 알아두는 것이 좋습니다. 이 모든 상수들은 static final로 정의되어 있으며, 인스턴스를 생성하지 않고 Integer 클래스에서 직접 접근할 수 있습니다. 이러한 타입 관련 상수를 아는 것은 Java에서 오류를 방지하고 성능을 향상시키는 좋은 첫걸음입니다.

4. Integer 클래스의 주요 메서드

Integer 클래스는 단순히 int의 래퍼 이상입니다. 문자열 변환, 숫자 비교, 비트 연산 등 실용적인 많은 메서드를 제공하여 일상적인 Java 개발에 매우 유용합니다. 여기서는 카테고리별로 가장 자주 사용되는 메서드를 소개하겠습니다.

변환 메서드

parseInt()

parseInt()문자열을 int 값으로 변환하는 정적 메서드입니다. 주로 사용자 입력이나 외부 파일에서 숫자로 처리해야 할 데이터를 다룰 때 사용됩니다.

String str = "123";
int number = Integer.parseInt(str); // 123

* 비숫자 문자열이 전달되면 NumberFormatException이 발생하므로, try-catch를 사용하는 것이 더 안전합니다.

valueOf()

valueOf()문자열이나 int 값을 Integer 객체로 변환하는 메서드입니다. parseInt()와 달리 반환 타입은 int가 아닌 Integer입니다.

Integer num1 = Integer.valueOf("456");
Integer num2 = Integer.valueOf(789);

Integer.valueOf()는 -128에서 127 사이의 값에 대해 캐시된 객체를 재사용하여 new로 새 인스턴스를 생성하는 것보다 더 효율적입니다.

표시 및 변환 메서드

toString()

toString()숫자 값을 문자열로 반환하는 메서드입니다. 문자열 연결이나 값 표시를 위해 일반적으로 사용됩니다.

int number = 100;
String str = Integer.toString(number); // "100"

바이너리나 16진수와 같은 다른 진법으로 변환하는 데도 사용할 수 있습니다.

System.out.println(Integer.toBinaryString(10));  // "1010"
System.out.println(Integer.toHexString(255));    // "ff"

비교 메서드

compareTo()

compareTo()두 Integer 객체를 비교하여 상대적인 순서를 나타내는 정수를 반환하는 메서드입니다.

Integer a = 10;
Integer b = 20;

int result = a.compareTo(b); // -1 (returns a negative value if a < b)

Collections.sort와 같은 메서드와 함께 자주 사용됩니다.

equals()

equals()두 값이 같은지 확인하는 메서드입니다. == 연산자는 참조를 비교하므로, 객체 값을 비교할 때는 equals()를 권장합니다.

Integer x = 100;
Integer y = 100;
System.out.println(x.equals(y)); // true

비트 연산 메서드

Uniquely among Java classes, the Integer class offers extensive support for low-level bitwise operations.
Java 클래스 중에서 Integer 클래스는 저수준 비트 연산에 대한 광범위한 지원을 제공합니다.

bitCount()

This method returns the number of bits set to 1 in the given int value.
이 메서드는 주어진 int 값에서 1로 설정된 비트 수를 반환합니다.

int count = Integer.bitCount(15); // 15 in binary is 1111 → 4 bits set to 1

highestOneBit()

This method returns the value with only the highest-order one bit set from the given int value.
이 메서드는 주어진 int 값에서 가장 높은 순서의 1비트만 설정된 값을 반환합니다.

int highest = Integer.highestOneBit(10); // 10 (1010) → 8 (1000)

Very useful for optimizations involving bitwise operations.
비트 연산을 포함한 최적화에 매우 유용합니다.

Other Handy Methods

기타 유용한 메서드

  • Integer.reverse(int) : Reverses the order of the bits
  • Integer.reverse(int) : 비트 순서를 뒤집습니다
  • Integer.signum(int) : Returns the sign (positive: 1, negative: -1, zero: 0)
  • Integer.signum(int) : 부호를 반환합니다 (양수: 1, 음수: -1, 0: 0)
  • Integer.hashCode() : Returns a hash code (important when using collections)
  • Integer.hashCode() : 해시 코드를 반환합니다 (컬렉션 사용 시 중요합니다)

Numbers are handled everywhere in Java. Just knowing these methods will help you write elegant and efficient code. In particular, conversion, comparison, and bitwise methods are commonly used in practice, so be sure to master them.
Java에서는 숫자가 어디에서든 사용됩니다. 이러한 메서드들을 알고 있으면 우아하고 효율적인 코드를 작성하는 데 도움이 됩니다. 특히 변환, 비교, 비트 연산 메서드는 실무에서 흔히 사용되므로 반드시 숙달하세요.

5. Choosing Between int and Integer

5. int와 Integer 선택하기

In Java, there are two types for representing integers: int and Integer. While you can convert between them, using them incorrectly can lead to performance issues or unexpected errors. Let’s review their characteristics and how to choose the right one for each scenario.
Java에서는 정수를 나타내는 두 가지 타입이 있습니다: intInteger. 이들 사이를 변환할 수 있지만, 잘못 사용하면 성능 문제나 예상치 못한 오류가 발생할 수 있습니다. 각 상황에 맞는 타입을 선택하는 방법과 특성을 살펴보겠습니다.

Differences in Terms of Performance

성능 측면의 차이

int is a primitive type, has a fixed memory size (4 bytes), and is very fast for calculations. Integer, on the other hand, is an object type, stored as an instance on the heap, and provides methods and additional features.
int는 원시 타입으로, 고정된 메모리 크기(4바이트)를 가지며 계산이 매우 빠릅니다. 반면 Integer는 객체 타입으로 힙에 인스턴스로 저장되며 메서드와 추가 기능을 제공합니다.

int a = 10;
Integer b = 10;

Even though you assign the same value, the internal handling differs. For intensive calculations or loops, using int is much faster and more memory-efficient.
같은 값을 할당하더라도 내부 처리 방식이 다릅니다. 연산이 집중되거나 루프를 돌릴 때 int를 사용하면 훨씬 빠르고 메모리 효율이 높습니다.

Example: Performance Difference in Loops

예시: 루프에서의 성능 차이

long startTime = System.nanoTime();
int sum = 0;
for (int i = 0; i < 1000000; i++) {
    sum += i;
}
long endTime = System.nanoTime();
System.out.println("Time for int: " + (endTime - startTime) + " ns");

Doing the same with Integer causes boxing and unboxing overhead, which can make it several times slower.
Integer를 사용하면 박싱과 언박싱 오버헤드가 발생해 몇 배 느려질 수 있습니다.

Nullability and Exception Handling Differences

널 가능성 및 예외 처리 차이

int cannot be assigned null. So it’s not suitable when you need to represent “no value” or “unset.”
intnull을 할당할 수 없습니다. 따라서 “값 없음”이나 “설정되지 않음”을 나타내야 할 경우 적합하지 않습니다.

Integer value = null;
if (value == null) {
    System.out.println("Value is unset");
}

With Integer, you can explicitly handle null, making it ideal for situations like form validation or database retrieval where a value might be missing.
However, unboxing a null Integer to int throws a NullPointerException, so caution is needed.
Integer를 사용하면 null을 명시적으로 처리할 수 있어 값이 없을 수 있는 폼 검증이나 데이터베이스 조회와 같은 상황에 이상적입니다.
하지만 nullIntegerint로 언박싱하면 NullPointerException이 발생하므로 주의가 필요합니다.

Compatibility with Collections

컬렉션과의 호환성

Java collections (like List and Map) can only store objects. That’s why you can’t use int directly; you need Integer instead.
Java 컬렉션(예: List와 Map)은 객체만 저장할 수 있습니다. 따라서 int를 직접 사용할 수 없고 Integer를 사용해야 합니다.

List<Integer> numbers = new ArrayList<>();
numbers.add(100); // int → Integer via autoboxing

Also, when working with generics, you can’t specify a primitive type as a type argument, so you must use Integer.
또한 제네릭을 사용할 때는 원시 타입을 타입 인자로 지정할 수 없으므로 Integer를 사용해야 합니다.

Summary: Guidelines for Choosing

요약: 선택 가이드라인

Use CaseRecommended TypeReason
Mainly numeric calculationsintFaster processing and better memory efficiency
Need to represent presence or absence of a valueIntegerCan handle null
Working with collections or genericsIntegerObject type required
Using numbers as Map keysIntegerint can’t be used

Basically, remember: “Use int for speed, Integer for flexibility.”
기본적으로 기억하세요: “속도는 int, 유연성은 Integer.”

6. Common Errors and How to Handle Them

6. 흔히 발생하는 오류와 처리 방법

NullPointerException

NullPointerException

Cause:
원인:

Because Integer is an object type, it can be assigned null, but if you try to unbox a null Integer to int, a NullPointerException occurs.
Integer는 객체 타입이므로 null을 할당할 수 있지만, null인 Integer를 int로 언박싱하려고 하면 NullPointerException이 발생합니다.

Integer value = null;
int x = value; // Exception thrown here
Solution:
해결책:

Always check for null before unboxing.
언박싱하기 전에 항상 null 여부를 확인하세요.

if (value != null) {
    int x = value;
} else {
    int x = 0; // Assign a default value
}

Alternatively, you can safely handle this using Optional (Java 8+):
또는 Optional(Java 8 이상)을 사용해 안전하게 처리할 수 있습니다:

int x = Optional.ofNullable(value).orElse(0);

NumberFormatException

NumberFormatException

Cause:
원인:

This exception is thrown when Integer.parseInt() or Integer.valueOf() is used to convert a non-numeric string.
Integer.parseInt() 또는 Integer.valueOf()를 사용해 숫자가 아닌 문자열을 변환하려 할 때 이 예외가 발생합니다.

String input = "abc";
int num = Integer.parseInt(input); // NumberFormatException
해결책:

입력이 숫자인지 미리 확인하십시오, 일반적으로 정규 표현식을 사용합니다.

if (input.matches("-?\d+")) {
    int num = Integer.parseInt(input);
} else {
    System.out.println("Not a numeric value");
}

또한, 예외를 처리하고 안전한 처리를 보장하기 위해 try-catch를 사용하십시오.

try {
    int num = Integer.parseInt(input);
} catch (NumberFormatException e) {
    System.out.println("Invalid number format: " + input);
}

==와 equals()의 오용

원인:

Integer 객체 두 개를 ==로 비교할 때, 값이 아니라 레퍼런스를 비교하게 됩니다. 따라서 값이 동일하더라도 서로 다른 객체라면 false가 반환될 수 있습니다.

Integer a = new Integer(128);
Integer b = new Integer(128);
System.out.println(a == b);       // false (different references)
System.out.println(a.equals(b)); // true (same value)

* -128에서 127 사이의 값에 대해서는 객체가 캐시되므로 ==가 true를 반환할 수 있습니다. 그러나 이는 구현에 따라 다릅니다.

해결책:

Integer 객체 두 개를 비교할 때는 항상 .equals()를 사용하십시오.

if (a.equals(b)) {
    System.out.println("Values are equal");
}

언박싱 후 원시 int 값으로 비교할 수도 있습니다.

if (a.intValue() == b.intValue()) {
    System.out.println("Equal as int values");
}

오버플로우 간과

원인:

intInteger는 32비트 값(±2,147,483,647)만 처리할 수 있습니다. 이 범위를 초과하면 올바르게 동작하지 않습니다.

int a = Integer.MAX_VALUE;
int b = a + 1;
System.out.println(b); // -2,147,483,648 (wraps around to negative)
해결책:

필요하다면 long이나 BigInteger를 사용하는 것을 고려하고, 항상 한계를 염두에 두십시오.

요약

Integer는 편리하고 유연하지만, null, 레퍼런스, 타입 변환에 관한 많은 주의사항이 있습니다. 특히 Java 초보자에게는 특정 예외가 발생하는 이유를 이해하는 것이 중요합니다. 이러한 일반적인 함정을 미리 알면 버그를 피하고 보다 안정적인 코드를 작성할 수 있습니다.

7. 실용적인 예제: Integer 클래스 사용 방법

이제 Integer 클래스의 특징, 차이점, 중요한 포인트에 대해 충분히 이해했을 것입니다. 다음으로, Integer가 일반적으로 적용되는 실제 사용 사례를 살펴보겠습니다.

사용자 입력을 숫자로 변환하기

웹 및 데스크톱 애플리케이션에서 사용자 입력은 보통 String으로 받습니다. 그러나 나이·수량과 같은 필드를 다룰 때는 이를 숫자로 처리해야 할 경우가 많으며, 이때 Integer가 변환에 유용합니다.

String input = "25"; // User input as a string

try {
    Integer age = Integer.valueOf(input); // Convert String → Integer
    System.out.println("Age: " + age);
} catch (NumberFormatException e) {
    System.out.println("Invalid input");
}

입력이 올바른 숫자인지 검증하고 오류를 처리함으로써 견고한 사용자 입력 처리를 구현할 수 있습니다.

구성 값 및 환경 변수 관리

시스템이나 구성 값을 문자열로 읽은 뒤 정수로 변환하는 경우가 흔합니다. 예를 들어 System.getProperty()를 사용할 때 결과를 파싱해야 할 때가 많습니다.

String maxConn = System.getProperty("app.maxConnections", "100");
int max = Integer.parseInt(maxConn);
System.out.println("Max connections: " + max);

이러한 경우 합리적인 기본값을 제공하고 유연한 구성 변경을 허용하는 것이 중요합니다.

컬렉션에서 숫자 다루기

컬렉션(예: List) 안에서 숫자를 다루려면 int 대신 Integer를 사용해야 합니다. 예를 들어, 사용자가 입력한 ID 목록을 일시적으로 저장할 수 있습니다.

List<Integer> ids = new ArrayList<>();
ids.add(101);
ids.add(205);
ids.add(309);

for (Integer id : ids) {
    System.out.println("Processing ID: " + id);
}

자동 박싱(autoboxing) 덕분에 int에서 Integer로의 변환이 자동으로 이루어지므로, 수동 변환에 신경 쓰지 않고 간결한 코드를 작성할 수 있습니다.

비트 연산을 이용한 플래그 관리

Integer 클래스는 비트 조작 메서드가 풍부하여 저수준 플래그 관리 및 상태 전환에 유용합니다.

int flags = 0;

// Set the 1st bit
flags |= 0b0001;

// Set the 2nd bit
flags |= 0b0010;

// Check if the 2nd bit is set
boolean isSet = (flags & 0b0010) != 0;

System.out.println("The 2nd bit is: " + (isSet ? "ON" : "OFF"));

Integer.toBinaryString(flags)를 사용하여 플래그 상태를 시각화할 수 있습니다:

System.out.println("Current flag state: " + Integer.toBinaryString(flags));

데이터베이스 작업

JDBC 또는 유사한 방법으로 데이터베이스와 상호 작용할 때, 숫자 컬럼에 int가 아니라 Integer를 사용하면 null 값을 안전하게 처리할 수 있습니다.

ResultSet rs = stmt.executeQuery("SELECT age FROM users WHERE id = 1");

if (rs.next()) {
    Integer age = (Integer) rs.getObject("age");
    System.out.println(age != null ? "Age: " + age : "Age not set");
}

원시 타입 int는 null이 될 수 없으므로, 여기서는 Integer가 적절한 선택입니다.

요약

Integer 클래스는 int의 단순 래퍼를 넘어 유연한 데이터 처리와 실제 개발에서의 안전성 보장에 핵심적인 역할을 합니다. 특히 다음 경우에 유용합니다:

  • 사용자 입력이나 외부 설정을 숫자로 변환
  • null일 수 있는 데이터를 처리
  • 컬렉션에 정수를 저장
  • 비트 연산으로 상태 관리

Integer를 마스터하면 보다 확장 가능하고, 유지 보수가 쉬우며, 안정적인 코드를 작성할 수 있습니다.

8. 결론

Java의 Integer 클래스는 int의 대체품에 불과하지 않으며—Java의 객체 지향 특성과 밀접하게 연관된 중요한 클래스입니다. 이 글에서는 초보자가 이해하기 쉬운 방식으로 다음 사항들을 설명하면서 실용적인 측면도 다루었습니다:

Integer 클래스의 장점은 무엇인가요?

  • 객체(object)로 취급될 수 있기 때문에 null 값을 다룰 수 있고 컬렉션에서도 사용할 수 있습니다.
  • 많은 편리한 메서드(문자열 변환, 비교, 비트 연산 등)를 제공합니다.
  • System.getProperty()와 데이터베이스 작업에 잘 작동하여 유연한 설계를 가능하게 합니다.
  • 객체 캐싱과 자동 박싱(autoboxing)으로 코드가 더 간단하고 간결해집니다.

이러한 장점은 원시 타입 int에서는 얻을 수 없습니다.

그러나 중요한 주의점도 있습니다

  • null Integer를 언박싱하면 NullPointerException이 발생합니다.
  • == 연산자를 사용하면 기대한 대로 값이 비교되지 않을 수 있습니다.
  • 성능 측면에서 대규모 숫자 연산에는 int가 훨씬 더 좋습니다.

이러한 점을 이해하지 못하면 예상치 못한 버그나 성능 문제가 발생할 수 있습니다.

올바른 타입 선택이 핵심

Use CaseRecommended TypeReason
When fast numeric processing is requiredintSuperior memory efficiency and calculation speed
When data may be nullIntegerSupports nullability and can be handled safely
When used with collections or genericsIntegerBecause an object type is required
When using numbers as Map keysIntegerint cannot be used

요약하면, intInteger단순히 다른 타입이 아니라 설계 목표와 사용 사례에 따라 적절히 선택해야 합니다.

최종 생각

Integer를 이해하는 것은 Java에서 데이터 타입을 다루는 기본일 뿐만 아니라 객체 지향 설계, 예외 처리, 성능 최적화와 같은 깊은 프로그래밍 기술을 개발하는 데도 기반이 됩니다. 정수 타입은 매우 흔히 사용되므로, 초기에 철저히 이해하면 향후 Java 개발 여정에서 큰 자산이 될 것입니다.

자주 묻는 질문 (FAQ)

Q1. intInteger의 차이점은 무엇인가요?

A. int는 정수 값을 효율적이고 빠르게 처리하기 위해 사용되는 Java 기본형(primitive type)입니다. Integer래퍼 클래스로, int를 객체로 취급할 수 있게 해 주어 null 값을 사용할 수 있고 다양한 메서드를 활용할 수 있습니다. 예를 들어 컬렉션에 값을 저장하거나 설정된 값과 설정되지 않은 값을 구분해야 할 때 Integer가 더 적합합니다.

Q2. parseInt()valueOf()의 차이점은 무엇인가요?

A. 두 메서드 모두 문자열을 숫자로 변환하지만 반환 타입이 다릅니다:

  • parseInt(String s)int(기본형) 반환
  • valueOf(String s)Integer(객체형) 반환

필요에 따라 선택하면 됩니다. 객체가 필요하거나 null 값을 다뤄야 할 경우 valueOf()가 더 유용합니다.

Q3. Integer 객체를 비교할 때 ==를 사용하면 안 되는 이유는 무엇인가요?

A. == 연산자는 객체 레퍼런스를 비교할 뿐, 실제 값을 비교하지 않습니다. 값이 동일하더라도 서로 다른 인스턴스라면 false가 반환될 수 있습니다. 128 이상의 값은 객체 캐싱이 적용되지 않으므로 예상치 못한 결과가 발생할 수 있습니다. 값 비교에는 항상 .equals()를 사용하세요.

Integer a = 128;
Integer b = 128;
System.out.println(a == b);       // false (different references)
System.out.println(a.equals(b)); // true (same value)

Q4. Integernull을 할당하면 어떻게 되나요?

A. Integer는 객체이므로 null을 할당할 수 있습니다. 하지만 null인 상태에서 이를 int로 변환(언박싱)하면 NullPointerException이 발생합니다.

Integer val = null;
int num = val; // Exception thrown here

null 여부를 반드시 확인하거나 Optional을 사용해 보다 안전한 코드를 작성하세요.

Q5. Integer의 최대값과 최소값을 어떻게 찾나요?

A. Java에서는 Integer.MAX_VALUEInteger.MIN_VALUE를 사용하면 손쉽게 해당 한계를 얻을 수 있습니다.

System.out.println(Integer.MAX_VALUE); // 2147483647
System.out.println(Integer.MIN_VALUE); // -2147483648

범위 검사와 오버플로우 방지에 유용합니다.

Q6. 컬렉션에서 int를 사용할 수 없는 이유는 무엇인가요?

A. Java 컬렉션(List, Map 등)은 객체만을 다루며 기본형은 지원하지 않습니다. 따라서 int 대신 Integer를 사용해야 합니다.

List<Integer> list = new ArrayList<>();
list.add(123); // int is automatically converted to Integer

Q7. 성능 면에서 intInteger 중 어느 것이 더 좋나요?

A. 루프에서 대량의 숫자를 고속으로 계산하거나 처리할 때는 int가 훨씬 빠르고 메모리 효율이 높습니다. Integer는 편리하고 유연하지만, 추가 객체 생성 및 박싱(boxing)으로 인해 무거운 작업에는 적합하지 않을 수 있습니다.