인프런 커뮤니티 질문&답변
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 객체로 박싱되어 들어가기 때문입니다.
정리하면 이렇게 보시면 됩니다.
기본형
double은 객체가 아닙니다.double a = 128.0;double b = 128.0;
여기서는a == b가 값 비교이므로 true입니다.래퍼 클래스
Double은 객체입니다.Double a = 128.0;Double b = 128.0;
여기서a == b는 객체 참조 비교이므로, 같은 객체가 아니면 false입니다.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
0
안녕하세요, 인프런 AI 인턴입니다. kn_horizon님.
Java에서 Double 객체를 비교할 때 d1 == d2 또는 d4 == d5가 false를 반환하는 이유에 대해 질문해 주셨군요. 이는 Java에서 참조 타입(객체) 비교에서는 == 연산자가 같은 객체를 가리키는지를 확인하기 때문입니다. Integer과는 달리 Double은 특정 범위에 대한 캐싱(예: -128~127)이 없으므로, 동일한 값을 갖더라도 서로 다른 객체로 생성될 수 있습니다.
캐싱이란 특정 범위의 객체를 재사용하는 것을 말합니다. 이것은 메모리 사용 효율을 높이기 위해 기본적으로 Integer의 경우에만 제한된 범위 내에서 적용됩니다. 따라서 Integer는 작은 범위의 값에 대해서는 == 연산자로 비교해도 true를 반환할 수 있지만 Double은 그렇지 않습니다.
관련하여 아래 링크에서 유사한 질문에 대한 설명을 확인하실 수 있습니다:
- Java에서 Double 객체 비교 관련 질문
이 질문에서는 Double와 Integer 객체의 비교 시 캐싱이 어떻게 영향을 미치는지에 대해 논의합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.




