겉으로 보면 `new Integer(10)` 과 `Integer.valueOf(10)` 은 완전히 달라 보인다.
하지만 결과적으로 만들어지는 것은 둘 다 Integer 객체이다.
차이는 “객체를 어떻게 만들고 관리하느냐”에 있다.
new Integer(10)
Integer a = new Integer(10);
이 코드는 무조건 새로운 객체를 생성한다.
메모리 구조를 보면 이렇게 된다.
a ───▶ [ Integer 객체 (10) ]
같은 코드를 여러 번 실행하면
Integer a = new Integer(10);
Integer b = new Integer(10);
이렇게 된다.
a ───▶ [ 10 ]
b ───▶ [ 10 ]
✔ 값은 같지만
✔ 서로 다른 객체이다.
따라서
a == b // false
이다.
Integer.valueOf(10)
Integer a = Integer.valueOf(10);
이 방식은 내부적으로 캐시를 먼저 확인한다.
자바는 기본적으로
-128 ~ 127 범위의 Integer 객체를 미리 만들어둔다.
그래서
Integer a = Integer.valueOf(10);
Integer b = Integer.valueOf(10);
이렇게 하면
a ─┐
├──▶ [ 캐시에 있는 10 객체 ]
b ─┘
✔ 같은 객체를 재사용한다.
따라서
a == b // true
가 된다.
왜 new를 쓰지 말라고 하는가?
1) 불필요한 객체 생성
`new Integer()` 는 무조건 새 객체를 만든다.
이것은 메모리 낭비이다.
반면 `valueOf()` 는
- 캐시에 있으면 재사용
- 없으면 새로 생성
즉, 최적화된 방식이다.
2) 자바에서 공식적으로 권장하지 않는다
`new Integer(int)` 생성자는 deprecated(사용 권장 안함) 상태이다.
자바 설계 방향은 다음과 같다:
"래퍼 객체는 직접 만들지 말고, 팩토리 메서드를 사용해라."
그래서 `valueOf()` 를 사용하도록 설계했다.
두 방식이 완전히 다른가?
아니다.
결과 타입은 동일하다.
둘 다 `Integer` 객체이다.
하지만
| 구분 | new Integer | Integer.valueOf |
| 객체 생성 | 항상 새 객체 | 캐시 재사용 |
| 메모리 효율 | 낮음 | 높음 |
| 권장 여부 | ❌ deprecated | ✅ 권장 |
요즘은 어떻게 쓰는가?
사실 요즘은 이렇게도 거의 안 쓴다.
Integer a = 10; // 자동 박싱
이 코드는 내부적으로
Integer a = Integer.valueOf(10);
로 바뀐다.
즉,
✔ new는 거의 쓰지 않는다
✔ valueOf도 직접 잘 안 쓴다
✔ 자동 박싱을 사용한다
핵심 정리
- `new Integer()` → 무조건 새 객체
- `Integer.valueOf()` → 캐시 재사용
- 두 개는 타입은 같지만 동작 방식이 다르다
- 성능과 설계 방향 때문에 `valueOf()` 를 사용한다
- 요즘은 자동 박싱이 기본이다
'Java' 카테고리의 다른 글
| static (0) | 2026.02.05 |
|---|---|
| enum: 사용이유와 예시 (0) | 2026.02.04 |
| 쓰레드란? (0) | 2026.01.29 |