[프로그래머스 1단계] 알고리즘 14. 문자열 숫자로 바꾸기
문제 출처는 프로그래머스 알고리즘 연습 에서 볼 수 있습니다!(https://programmers.co.kr/learn/challenges)
알고리즘 14. 문자열 숫자로 바꾸기
strToInt 메소드는 String형 str을 매개변수로 받습니다. str을 숫자로 변환한 결과를 반환하도록 strToInt를 완성하세요. 예를들어 str이 1234
이면 1234를 반환하고, -1234
이면 -1234를 반환하면 됩니다. str은 부호(+,-)와 숫자로만 구성되어 있고, 잘못된 값이 입력되는 경우는 없습니다.
풀이:
이 문제의 해답은 다음과 같다.
문제에서 예외 사항을 제외하였기에 따로 처리해야할 필요 없이 Integer.parseInt() 정적 메소드를 통해서 문자열을 숫자로 바꿔주면 된다, 이렇게 하면 별로 알려줄 것이 없기 때문에 문제를 str이 null일 수도 있고 숫자가 입력이 안 될 수도 있는 상황이 있다는 가정을 추가하려한다. 먼저 일반적으로 푸는 방법이다.
먼저 str이 널일 경우를 처리해야하기 때문에 try-catch로 감싸주어야 한다. 그 후 Integer.parseInt에서 문자열이 숫자가 아닐 때 예외가 발생하기 때문에 try-catch로 또 감싸주어야 한다. 이렇게 쉽게 풀 수 있다. 하지만 문제의 핵심은 parseInt와 그에 따른 예외처리만 있으면 되는데 이를 처리하기 위해서 이중으로 try-catch로 코드를 감싸면서 코드가 더러워지는 것을 확인할 수 있다. 이를 자바 8의 Optional을 이용하여 해결하려 한다. Optional 클래스는 null이 될 수 있는 객체를 감싸는 래퍼 클래스이다. Optional류의 클래스들은 자신이 담고 있는 null이 될 수 있는 객체가 야기시키는 NullPointException을 더 쉽고 명확하게 해결하기 위해 만들어졌다. 단적인 예로 위의 방식처럼 여러 try-catch로 감싸는 코드가 어떻게 깔끔해지게 바뀌는지 아래에 Optional을 활용하여 문제를 푼 코드를 보면서 확인해보자.
먼저 첫 번째 코드 Optional.ofNullable() 이 코드는 널이 될 수 있는 객체를 받아 Optional 클래스로 감싼다. 두번째 map(Integer::parseInt)을 통해서 그 객체를 파싱한다. 그리고 세번째 그에 따른 예외처리를 orElseThrow(()->new ...)로 처리한다. 문제의 주어진 예외 상황도 처리하면서 굉장히 깔끔한 코드를 얻을 수 있다. 결론은 자바8 찬양하자!