https://www.acmicpc.net/problem/3009
문제를 풀다 새로운 것을 이해했다.
public class Main {
public static void main(String[] args){
Integer A = 3;
Integer B = 3;
System.out.println("A == B ? "+(A==B));
Integer C = 128;
Integer D = 128;
System.out.println("C == D ? "+(C==D));
}
}
두개의 결과는 모두 참일까? 그렇지 않다.
첫 번째의 비교는 True, 두 번째의 비교는 False가 나온다.
늘 자바에서 문자열이 아닐 때에는 ==비교를 했는데, 이상하게도 결과가 false가 나왔다.
왜 그럴까?
자바에서 int는 primitive type이고, Integer는 객체다.
그래서 primitive type끼리는 ==를 해도 되지만, 객체끼리의 비교는 ==을 쓰면 안된다.(String에서 ==를 안 쓰고 equals를 쓰는 이유와 동일하다.)
그런데, 자바의 내부 동작 구조 원리상 Integer는 -128 ~ 127까지만 동일 객체의 캐시를 가져다 쓰기 때문에
그 전과 그 후의 값들은 주소값이 달라 ==비교가 불가능한 것이다.
참고)
https://romcanrom.tistory.com/177
'자바' 카테고리의 다른 글
먼저 곱하고 나중에 나눠줄까, 먼저 나누고 나중에 곱해줄까?(백준/1072) (0) | 2024.04.08 |
---|---|
break; continue; return; 무슨 차이일까? (0) | 2023.09.23 |
자바 성능 튜닝 이야기(1) (0) | 2023.07.28 |
TIL - 좋은 객체지향적 설계원칙, SOLID(4) : ISP (0) | 2023.01.28 |
TIL - 좋은 객체지향적 설계원칙, SOLID(3) : LSP (0) | 2023.01.27 |