본문 바로가기
Today I Learned 2024. 5. 7.

(24.05.07)[4주차] 오버플로우 처리, Collections 클래스의 sort() 와 Comparator

 

4주차가 하루 늦게 시작이 되었다.

주말에 일이 많아 쉬지를 못해서 거의 평소와 똑같지만,

그래도 팀 과제와 개인 학습까지 꾸준히 블로그에 정리할 것.


CODE KATA 이슈 정리

 

정수 범위의 오버플로우 이슈

더보기
class Solution {
    public long solution(int price, int money, int count) {
        long answer = 0;
        long totalCost = 0;
   
        for(int usage = 1 ; usage <= count; usage++) {
            totalCost += price * usage;
        }
        
        answer = money - totalCost; // 이슈부분 해결부분
        
        answer = (answer>=0) ?  0 : -answer;
        return answer;
        
    }
}

이슈

  • 모든 테스트에서 값은 정확한데, 테스트의 money 값이 양수/음수로 커질 때, 정답과 불일치

원인

  • 반복문에서 money -= price * usage, 그리고 조건문에서는 answer 대신 money를 사용
  • answer은 long 타입으로 int 타입의 -2,147,483,648부터 2,147,483,647까지의 범위에서 연산결과가 넘어가버리면 answer로 재정의 해주기 전까지 오버플로우가 나버릴 가능성이 있음

해결

  • long타입의 totalCost 변수를 새로 선언을 해서, long타입 answer에 저장할 수 있도록 해서, int 타입 범위내 money -= price * usage에서 연산이 일어나지 않도록 함

코멘트

  • 계속 Stream 람다 이런 쪽으로만 신경을 쓰다보니까 진짜 기본중에 기본인 타입별 오버플로우를 전혀 고려하지 못한 코드를 짜버렸음
  • int double 외에도 long float 도 사용 가능하다는 사실을 항상 인지하기 위해 단순한 실수임에도 블로그에 기록해서 한번 더 리마인드

 

 

Collections 클래스의 sort() 와 Comparator 

더보기
...
String str = "example";
List<Character> charList = toCharacterList(str);
Collections.sort(charList, Collections.reverseOrder());
...
  • 문자열을 크기별(Java기준아스키코드 기준) 역순으로 정렬
  •  import java.util.Collections; 를 통해 Collections의 sort를 사용하여 Collections.sort(charList); Collections.reverse(charList);  하여 크기 역순으로 사용해서 이미 정답을 반환, sort() 메서드의 Comparator를 활용해서 작성하는 연습
    • sortCollections.sort(charList, Collections.reverseOrder()); 에서 Collections.reverseOrder()Comparator를 생성해서, Comparator reverseOrder() 를 사용한다는 의미
    • sortCollections.sort(charList, Comparator.reverseOrder()); 로 사용해도 상관 없음

Comparator 클래스

  • Comparator 인터페이스와 다른 Comparator 사용을 위한 일종의 uility 클래스
    • import java.util.Comparator; 또는 import java.util.*; 써서 앞에 넣어줘야.
  • Comparator 클래스 메서드
    • comparing(Function<? super T,? extends U> keyExtractor) : 주어진 키 추출 함수를 기반으로 객체를 비교하는 비교자를 생성
    • comparingInt(ToIntFunction<? super T> keyExtractor) : 주어진 정수 키 추출 함수를 기반으로 객체를 비교하는 비교자를 생성
    • comparingLong(ToLongFunction<? super T> keyExtractor) : 주어진 long형 키 추출 함수를 기반으로 객체를 비교하는 비교자를 생성
    • comparingDouble(ToDoubleFunction<? super T> keyExtractor) : 주어진 double형 키 추출 함수를 기반으로 객체를 비교하는 비교자를 생성합니다.
    • naturalOrder() : 자연 순서에 따라 객체를 비교하는 비교자를 반환
    • nullsFirst(Comparator<? super T> comparator) : null 값을 허용하며, null 값을 가장 먼저 위치시키고 그 다음 비교자에 따라 정렬하는 비교자를 생성
    • nullsLast(Comparator<? super T> comparator) : null 값을 허용하며, null 값을 가장 마지막에 위치시키고 그 전 비교자에 따라 정렬하는 비교자를 생성
    • reverseOrder() : 기본 순서의 반대 순서로 객체를 비교하는 비교자를 반환

 


이번 주 내로 팀 과제 마무리 + 쓰레드 관련 정리를 마무리 하고

다음주 Spring으로 넘어가야할 것.