강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

kn_horizon님의 프로필 이미지
kn_horizon

작성한 질문수

(2026) 일주일만에 합격하는 정보처리기사 실기

같지만 다른 것들

JAVA- 같아보이지만 다른 객체 질의

해결된 질문

작성

·

15

0

같지만 다른 것들 강의 6분29초

Double 사용시 d1==d2는 false이 나옵니다.

그리고 역시 d4==d5도 false이 나옵니다.

그런데, 설명에는 integer와 다르게 캐싱을 사용하지 않아서 라고 말씀주셨는데,

정수, 실수들은 캐싱을 사용하지 않고, 캐싱을 사용하지 않으면 같은 곳에 저장하는 것이 아니라서 false 나온다고 이해하면 되는건가요?

  • 질문은 동영상 강의에 들어가서 오른쪽에 커뮤니티 버튼을 통해 해주세요. 그래야

    어떤 강좌에서 질문하셨는지 알 수 있습니다.

  • 영상에서 몇 분 몇 초 대를 알려주셔야 제가 한 번에 질문 내용 확인이 가능합니다.

  • 이미 다른 누군가가 질문을 한 이력이 있을 수 있습니다. 질문 게시판을 한 번 확인 부탁 드립니다.

  • 학교의 과제나 타 강사의 코드 등 외부 수업 자료에 대해서는 답변하지 않습니다.

  • 제가 다루는 커리큘럼 외의 이론이나, 너무 디테일한 컴퓨터 이론에 대해서는 답변 드리지 않습니다.

    • 시험에 안 나오는 경우가 많고, 나와 봤자 1문제 나오는데 외워야 할 부분이 많은 것 등 (예시: 서브넷 마스크 계산)

  • 질문을 올릴 때 이 글은 모두 지우고 내용을 입력해주세요.

답변 3

0

주말코딩님의 프로필 이미지
주말코딩
지식공유자

네, 큰 방향은 맞지만 정확히는 조금 더 구분해서 이해하시는 게 좋습니다.

double을 자세하게 설명드리지 않는 이유는, 굳이 이렇게까지 공부하실 필요가 없어서인데..

설명은 드려보도록 할게요.

 

핵심은 이것입니다.

Double에서 == 는 “값 비교”가 아니라 “같은 객체인지 비교”입니다.
즉, 둘의 내부 숫자가 같은지가 아니라, 메모리에서 동일한 객체를 가리키는지를 봅니다.

그래서

Double d1 = 128.0;
Double d2 = 128.0;

이 경우 d1 == d2 가 false인 이유는,
두 변수에 들어 있는 값이 둘 다 128.0이어도, 보통 각각 별도의 Double 객체로 박싱되어 들어가기 때문입니다.

 

정리하면 이렇게 보시면 됩니다.

  1. 기본형 double 은 객체가 아닙니다.
    double a = 128.0;
    double b = 128.0;
    여기서는 a == b 가 값 비교이므로 true입니다.

  2. 래퍼 클래스 Double 은 객체입니다.
    Double a = 128.0;
    Double b = 128.0;
    여기서 a == b 는 객체 참조 비교이므로, 같은 객체가 아니면 false입니다.

  3. equals() 는 객체 안의 값 비교입니다.
    그래서 a.equals(b) 는 true가 됩니다.

 

이제 질문하신 “캐싱” 부분을 정확히 짚어보면,

Integer 는 자주 쓰는 작은 정수 범위에 대해 내부적으로 캐시를 둡니다.
대표적으로 -128 ~ 127 범위는 같은 값을 박싱하면 같은 객체를 재사용할 수 있습니다.

예를 들어

Integer x = 127;
Integer y = 127;

이 경우 x == y 가 true일 수 있습니다.
둘이 같은 값을 가져서가 아니라, JVM이 같은 캐시 객체를 재사용했기 때문입니다.

(JVM은 Java의 코드를 동작하게 해석해주는 가상머신으로 알고 계시면 됩니다)

 

하지만

Integer x = 128;
Integer y = 128;

이 경우는 보통 캐시 범위를 벗어나므로 x == y 가 false가 됩니다.

 

반면 Double 은 이런 식의 일반적인 캐시를 기대하면 안 됩니다.
그래서 같은 리터럴을 써도 대체로 서로 다른 객체가 만들어지고,
d1 == d2 는 false가 나옵니다.

즉, 질문하신 문장을 더 정확하게 바꾸면 이렇게 됩니다.

 

“캐싱을 사용하지 않으면 항상 false다”가 아니라,
“래퍼 객체에서 == 는 같은 객체인지 비교하는데, 캐싱이 없으면 같은 값이어도 같은 객체로 재사용되지 않아서 false가 나오기 쉽다”가 맞습니다.

 

그리고 “정수, 실수는 캐싱을 사용하지 않는다”도 정확히는 아닙니다.

 

정확한 표현은:

기본형 int, double 자체는 캐싱 개념으로 비교하지 않습니다.
래퍼 클래스인 Integer, Double 같은 객체에서 박싱 시 캐시 여부가 문제가 됩니다.
Integer 는 일부 캐시가 있고, Double 은 일반적으로 그런 캐시를 기대하지 않습니다.

 


 

정리하자면, 간단하게 외우기만 하세요.

기본형 비교
== → 값 비교

객체 비교
== → 주소(참조) 비교
equals() → 값 비교

그래서 실무에서는 Double, Integer, Long 같은 래퍼 클래스끼리 값 비교할 때 == 를 쓰지 않는 것이 안전합니다. 대부분 equals() 를 쓰거나, 언박싱해서 기본형으로 비교합니다.

Double d1 = 128.0;
Double d2 = 128.0;

System.out.println(d1.equals(d2));   // true
System.out.println(d1.doubleValue() == d2.doubleValue()); // true

다만 부동소수점은 오차 문제가 있어서, double 값 비교는 상황에 따라 조심해야 합니다.

 

예를 들어 0.1 + 0.2 == 0.3 은 false가 나올 수 있습니다.
이건 캐싱 문제가 아니라 부동소수점 표현 문제입니다.

 

Double 에서 == 가 false인 이유는 “캐싱이 없어서”가 본질이라기보다,

“객체 비교인데 서로 다른 객체이기 때문”이고, 캐싱 유무는 그 결과에 영향을 주는 부가 요소입니다.

0

kn_horizon님의 프로필 이미지
kn_horizon
질문자

답변이 이해가 가지 않아요. AI가 생성하는건가요?

0

안녕하세요, 인프런 AI 인턴입니다. kn_horizon님.

Java에서 Double 객체를 비교할 때 d1 == d2 또는 d4 == d5false를 반환하는 이유에 대해 질문해 주셨군요. 이는 Java에서 참조 타입(객체) 비교에서는 == 연산자가 같은 객체를 가리키는지를 확인하기 때문입니다. Integer과는 달리 Double은 특정 범위에 대한 캐싱(예: -128~127)이 없으므로, 동일한 값을 갖더라도 서로 다른 객체로 생성될 수 있습니다.

캐싱이란 특정 범위의 객체를 재사용하는 것을 말합니다. 이것은 메모리 사용 효율을 높이기 위해 기본적으로 Integer의 경우에만 제한된 범위 내에서 적용됩니다. 따라서 Integer는 작은 범위의 값에 대해서는 == 연산자로 비교해도 true를 반환할 수 있지만 Double은 그렇지 않습니다.

관련하여 아래 링크에서 유사한 질문에 대한 설명을 확인하실 수 있습니다:
- Java에서 Double 객체 비교 관련 질문

이 질문에서는 DoubleInteger 객체의 비교 시 캐싱이 어떻게 영향을 미치는지에 대해 논의합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

kn_horizon님의 프로필 이미지
kn_horizon

작성한 질문수

질문하기