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

(24.05.02)[3주차] Array의 스트림과 Optional을 활용 & 조건절과 예외


CODE KATA 정리

Array의 스트림과 Optional을 활용

더보기
import java.util.ArrayList;
import java.util.stream.*;

class Solution {
    public int[] solution(int[] arr) {
        int minIndex = 0;
        ArrayList<Integer> answerlist = new ArrayList<>();
       
        if(arr.length==1) {
              answerlist.add(-1);
        } else {
            //Stream Optional을 이용해서배열의 최솟값 찾기
            int min = IntStream.of(arr).min().getAsInt();
            for(int i : arr){
                if(i != min) {
                    answerlist.add(i);
                }
            }
            
        }
    
        // ArrayList 배열로변환
        int[] answer = new int[answerlist.size()];
        for(int i =0 ; i<answerlist.size(); i++) {
            answer[i]=answerlist.get(i);
        }
    
        return answer;
    }
}

 

  • Stream의 최종연산인 min 메서드를 활용하여 최솟값을 구하는 방법 연습
    • Stream을 사용하지 않을 경우에는 그냥 다중 for문을 활용해서 인데스값을 모두 서로 비교하는 로직을 사용해야- 

순서

  • Stream 만들기
    • 컬렉션이 아닌 배열을 스트림으로 만들기 위해선느 Arrays.stream(배열) 또는 Stream.of(배열)
      • 단! Stream.of를 사용하기 위해서는 int long double 타입일 경우 IntStream, LongStream, DoubleStream을 활용해야 당연히 import java.util.stream.IntStream; 도써줘야함
      • Arrays.stream(배열)을 사용할 경우에는 Arrays클래스에서 가져오는 것이기 때문에 import java.util.Arrays; 사용
  • Stream 최종연산
    • min() 메서드를 활용해서 스트림중 가장 작은 값을 반환하지만, stream의 min, max 메서드는 comparator를 매개변수로 받고 Optional<T> 타입으로 반환하는데, 여기에서는 IntStream 기본형 스트림에서 받아서 반환해야하 때문에 OptionalInt 타입으로 반환이 됨
  • Optional
    •  getAsInt 메서드를 통해 OptionalInt 클래스로 묶여진 int값 즉 최솟값은 다시 int타입으로 빼내줄 수 있음

코멘트

  • 처음 스스로 작성했을 때는 int min = IntStream.of(arr).min(); 까지 작성을 했기 때문에 계속 오류가 발생, min 메서드가 Optinal 타입으로 반환한다는 것을 공부할 때 잠깐 넘겼지 실제로 사용을 한적이 없기 때문에 이번에 일부러 실습을 하면서 익힐 수 있도록

 

과제 이슈

스트림과 람다식(메서드참조)을 활용

더보기
  /**
     * char operator 값을 받아 해당 OperatorType 반환 메서드
     *
     * @return OperatorType
     * @parma char : operator
     */
    public static OperatorType fromOperator(char operator) throws CalculationException { // 일단 초기화, enum은 새로운 객체생성 불가

        for (OperatorType op : OperatorType.values()) { // 입력된 operator와 enum의 symbol을 비교
            if (op.symbol == operator) { // enum에서 저장된 필드변수를 바로 불러올 수 있음 getter 필요 X
                return op;
            }
        } // missing return 오류발생
    }

이슈

  • OperatorType enum 안의 fromOperator 메서드로, 매개변수로 들어온 char타입 변수와 enum의 symbol로 지정된 값을 비교해서 해당 상수를 반환하는 메서드
  • 향상된 for문 안에 if조건절을 잘 맞춰주고 return값역시 OperatorType enum의 상수론 맞췄지만, missing return오류가 계속 발생

원인

  • if의 조건절에서 boolean 타입이 false가 없을 경우, 즉, else를 사용해도 오류가 발생
    • for 문을 돌면서 if절에서 반환하는 값이 정확하게 OperatorType이라고 확정을 지을 수 없음
    • 조건에 부합하지 않는다면, 아무런 값도 반환하지 않고 종료되기 때문에 결론적으로 반환값이 아무것도 없음
      • else를 상용해도, for문에서 또 아무런 값이 없다면 null을 반환

해결

  • for문이 다 돌아도, 반환값이 없을 때, 강제로 예외를 발생시키게 하기위해서 예외를 발생한다면, 메서드가 정상적으로 닫힘
    • 따라서, for문이 끝났을 때, 아래 예외발생문을 넣어서 아무것도 없을 때 메서드 자체에서 예외를 발생시키고 끝낸다는 의미
throw new CalculationException("잘못 입력된 연산기호 입니다.");

 


팀 과제가 시작이 되었느데 왜인지 모르게 git 설정부터 애를 먹고 있다. 진짜 화가난다.