넘어졌으면 일어서서 다시 걷자 🐈My GitHub🐈

Projects/Resolve Problems

UnSupportedException

YongE 2024. 9. 6. 09:37

UnSupportedException 발생


우테코의 프리코스 중 하나로 로또를 정해서 진행했다. 한동안 슬럼프(...)가 와서 기능명세서와 패키지 구조까지만 정리하고 나머지는 크게 생각 없이 진행했다. 어찌저찌 빠르게 완성하고 올렸는데 리뷰에서 많은 문제와 의문점을 제기 받았다.

 

 

정신없이 개인적인 일들을 처리하고, 기본적으로 주어지는 Test 코드에서 발생한 에러를 처리하기 위해 빠르게 진행했는데 UnSupportedException가 발생했다.

 

 

 

UnSupportedException 원인


java.lang.UnsupportedOperationException
	at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:142)
	at java.base/java.util.ImmutableCollections$AbstractImmutableList.sort(ImmutableCollections.java:261)
	at lotto.model.RandomNumbers.generateRandomNumbers(RandomNumbers.java:19)
	at lotto.controller.LottoController.createLottos(LottoController.java:40)

 

자세히 봐보자!

직접 구현한 메소드는 밑에서 2번째 줄까지고, 그 줄의 at lotto.model.RandomNumbers.generateRandomNumbers(RandomNumbers.java:19)에서 에러가 발생했다는 것을 알 수 있다. 다시 말해, RandomNumbers 클래스의 generateRandomNumbers는 메서드에서 문제가 생겼다.

 

  public static List<Integer> generateRandomNumbers() {
        List<Integer> randomNumbers = Randoms.pickUniqueNumbersInRange(FIRST_NUMBER, LAST_NUMBER, COUNT_OF_NUMBERS);
        Collections.sort(randomNumbers);
        return randomNumbers;
    }

 

이 메소드는 1~45까지의 로또 번호 6자리를 생성해서 오름차순으로 정렬하고 반환하는 메소드다. 이 메소드에서 UnSupportedException 에러가 발생했다는 것인데 실제로 보면 아무 문제 없는 것 같다.

 

다만 UnSupportedException는 Java에서 불변(Immutable) 객체에 대해 지원되지 않는 작업을 수행하려고 할 때 발생한다.

이 메소드에서 반환하는 Integer 타입의 List 객체가 불변 객체라는 말이다. 이 객체를 수정 및 변경하는 작업을 진행하려 할 경우 에러가 발생한다. 그 작업은 애초에 수행될 수 없기 때문이다.

 

아이러니하게도 우테코에서 제공하는 Randoms 클래스의 pickUniqueNumbersInRange static 메소드는 특정 갯수의 숫자를 범위만큼 무작위로 반환한다. 불변 리스트로써 말이다. 그렇기에 Sort 메소드를 실행하려 해도 작업이 수행될 수 없었던 것이다.

 

UnSupportedException 해결


답은 간단하다. pickUniqueNumbersInRange static 메소드가 반환한 불변 리스트를 변경 가능한(mutable) 리스트로 반환하는 것이다. 위 메소드를 다음과 같이 변경할 수 있다.

public static List<Integer> generateRandomNumbers() {
    List<Integer> randomNumbers = new ArrayList<>(Randoms.pickUniqueNumbersInRange(FIRST_NUMBER, LAST_NUMBER, COUNT_OF_NUMBERS));
    randomNumbers.sort(Comparator.comparingInt(o -> o));
    return randomNumbers;
}

 

위와 같이 변경한다면 pickUniqueNumbersInRange 메소드에 의해 반환된 리스트를, 변경가능한 새 리스트로 복사할 수 있다.

728x90
반응형