
👾 문제점
코테 문제 풀다가 발견한 다른 사람 코드와 내 코드의 차이점
내가 쓴 코드 (하수의 코드)
Arrays.sort(targets, (o1, o2) -> o1[1] - o2[1]);
남이 쓴 코드 (고수의 코드)
Arrays.sort(targets, (a, b) -> Integer.compare(a[1], b[1]));
왜 이 분은 Integer.compare() 메서드를 썼을까?
🧐 원인
`Arrays.sort(targets, (o1, o2) -> o1[1] - o2[1])` 방식은 두 정수의 뺄셈 결과를 정렬 기준으로 사용한다. 하지만 이 방식은 약간의 문제점을 가지고 있다. 위 코드를 사용하면 int형의 뺄셈 연산 과정에서 오버플로우(overflow)가 발생할 가능성이 있다.
예를 들어, o1[1] = Integer.MAX_VALUE이고 o2[1] = Integer.MIN_VALUE이면 이 경우, 음수가 나와 정렬이 비정상적으로 동작할 가능성이 있다.
Integer.MAX_VALUE - Integer.MIN_VALUE // 오버플로우 발생
🔹 오버플로우(Overflow)란?
자바에서 int 타입은 32비트 정수이며, 범위는 아래와 같다.
Integer.MIN_VALUE = -2,147,483,648
Integer.MAX_VALUE = 2,147,483,647
만약 큰 값에서 작은 값을 뺄 때, 결과가 int 범위를 초과하면 ?
✔️ 예상값: 2147483647 - (-2147483648) = 4294967295 (int 범위초과)
✔️ 실제값: -1 (오버플로우 발생)
👉 오버플로우로 인해 원래는 양수여야 할 값이 음수가 됨.
👉 따라서 배열이 잘못된 순서로 정렬될 가능성이 높다.
int[][] targets = {
{1, Integer.MAX_VALUE}, // 2147483647
{2, Integer.MIN_VALUE} // -2147483648
};
// a - b;
// 2147483647 - (-2147483648) = 4294967295 (int 범위 초과)
⚡ 해결법
🔹 `Integer.compare(x, y)` 사용하기
Arrays.sort(targets, (a, b) -> Integer.compare(a[1], b[1]));
🔹 `Integer.compare(x, y)` 내부 구현 로직
public static int compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
📌 정리
✔️ 항상 Integer.compare(x, y)을 사용하는 것이 안전하다.
✔️ o1[1] - o2[1] 방식은 오버플로우 위험이 있어 피해야한다.
'Java' 카테고리의 다른 글
[Eclipse] 내가 보려고 만든 이클립스 유용한 단축키 (12) | 2025.02.05 |
---|---|
[Java] 자바 Runtime addShutdownHook() 에 대해 알아보자 (16) | 2025.02.04 |
[Spring] 스프링 Spring MVC 흐름 완벽 정리: 초보자도 이해하는 MVC 패턴 (19) | 2025.01.28 |
[JSP & Servlet] URL 매핑 (9) | 2025.01.28 |
[Java] 쿼리스트링 으로 값 넘겨서 화면에 출력하기 (15) | 2025.01.26 |

👾 문제점
코테 문제 풀다가 발견한 다른 사람 코드와 내 코드의 차이점
내가 쓴 코드 (하수의 코드)
Arrays.sort(targets, (o1, o2) -> o1[1] - o2[1]);
남이 쓴 코드 (고수의 코드)
Arrays.sort(targets, (a, b) -> Integer.compare(a[1], b[1]));
왜 이 분은 Integer.compare() 메서드를 썼을까?
🧐 원인
Arrays.sort(targets, (o1, o2) -> o1[1] - o2[1])
방식은 두 정수의 뺄셈 결과를 정렬 기준으로 사용한다. 하지만 이 방식은 약간의 문제점을 가지고 있다. 위 코드를 사용하면 int형의 뺄셈 연산 과정에서 오버플로우(overflow)가 발생할 가능성이 있다.
예를 들어, o1[1] = Integer.MAX_VALUE이고 o2[1] = Integer.MIN_VALUE이면 이 경우, 음수가 나와 정렬이 비정상적으로 동작할 가능성이 있다.
Integer.MAX_VALUE - Integer.MIN_VALUE // 오버플로우 발생
🔹 오버플로우(Overflow)란?
자바에서 int 타입은 32비트 정수이며, 범위는 아래와 같다.
Integer.MIN_VALUE = -2,147,483,648 Integer.MAX_VALUE = 2,147,483,647
만약 큰 값에서 작은 값을 뺄 때, 결과가 int 범위를 초과하면 ?
✔️ 예상값: 2147483647 - (-2147483648) = 4294967295 (int 범위초과)
✔️ 실제값: -1 (오버플로우 발생)
👉 오버플로우로 인해 원래는 양수여야 할 값이 음수가 됨.
👉 따라서 배열이 잘못된 순서로 정렬될 가능성이 높다.
int[][] targets = { {1, Integer.MAX_VALUE}, // 2147483647 {2, Integer.MIN_VALUE} // -2147483648 }; // a - b; // 2147483647 - (-2147483648) = 4294967295 (int 범위 초과)
⚡ 해결법
🔹 Integer.compare(x, y)
사용하기
Arrays.sort(targets, (a, b) -> Integer.compare(a[1], b[1]));
🔹 Integer.compare(x, y)
내부 구현 로직
public static int compare(int x, int y) { return (x < y) ? -1 : ((x == y) ? 0 : 1); }
📌 정리
✔️ 항상 Integer.compare(x, y)을 사용하는 것이 안전하다.
✔️ o1[1] - o2[1] 방식은 오버플로우 위험이 있어 피해야한다.
'Java' 카테고리의 다른 글
[Eclipse] 내가 보려고 만든 이클립스 유용한 단축키 (12) | 2025.02.05 |
---|---|
[Java] 자바 Runtime addShutdownHook() 에 대해 알아보자 (16) | 2025.02.04 |
[Spring] 스프링 Spring MVC 흐름 완벽 정리: 초보자도 이해하는 MVC 패턴 (19) | 2025.01.28 |
[JSP & Servlet] URL 매핑 (9) | 2025.01.28 |
[Java] 쿼리스트링 으로 값 넘겨서 화면에 출력하기 (15) | 2025.01.26 |