Today I Learned
(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으로 넘어가야할 것.
'Today I Learned' 카테고리의 다른 글
(24.05.09)[4주차] 유클리드 호세법 최대공약수, 최소공배수 (0) | 2024.05.09 |
---|---|
(24.05.08)[4주차] java.util.regex 패키지 정규식 확용 (0) | 2024.05.08 |
(24.05.04)[3주차] WIL (0) | 2024.05.04 |
(24.05.03)[3주차] 0/0 NaN , Stream -> List 변환 (0) | 2024.05.03 |
(24.05.02)[3주차] Array의 스트림과 Optional을 활용 & 조건절과 예외 (0) | 2024.05.02 |