24년 11월 이전/레거시-알고리즘(3)

[프로그래머스 1단계] 알고리즘 14. 문자열 숫자로 바꾸기

Gurumee 2018. 3. 27. 12:46
반응형

문제 출처는 프로그래머스 알고리즘 연습 에서 볼 수 있습니다!(https://programmers.co.kr/learn/challenges)


알고리즘 14. 문자열 숫자로 바꾸기

strToInt 메소드는 String형 str을 매개변수로 받습니다. str을 숫자로 변환한 결과를 반환하도록 strToInt를 완성하세요. 예를들어 str이 1234이면 1234를 반환하고, -1234이면 -1234를 반환하면 됩니다. str은 부호(+,-)와 숫자로만 구성되어 있고, 잘못된 값이 입력되는 경우는 없습니다.


public class StrToInt {
public int getStrToInt(String str) {

return 0;
}
//아래는 테스트로 출력해 보기 위한 코드입니다.
public static void main(String args[]) {
StrToInt strToInt = new StrToInt();
System.out.println(strToInt.getStrToInt("-1234"));
}
}


풀이:

이 문제의 해답은 다음과 같다.


public int getStrToInt(String str) {
return Integer.parseInt(str);
}


문제에서 예외 사항을 제외하였기에 따로 처리해야할 필요 없이 Integer.parseInt() 정적 메소드를 통해서 문자열을 숫자로 바꿔주면 된다, 이렇게 하면 별로 알려줄 것이 없기 때문에 문제를 str이 null일 수도 있고 숫자가 입력이 안 될 수도 있는 상황이 있다는 가정을 추가하려한다. 먼저 일반적으로 푸는 방법이다.


public int getStrToInt(String str) {
try{
try{
if(str == null)
throw new Exception("str is null");
return Integer.parseInt(str);
}catch(Exception e){
e.printStackTrace();
}
}catch(Exception e){
e.printStackTrace();
}
return 0;
}


먼저 str이 널일 경우를 처리해야하기 때문에 try-catch로 감싸주어야 한다. 그 후 Integer.parseInt에서 문자열이 숫자가 아닐 때 예외가 발생하기 때문에 try-catch로 또 감싸주어야 한다. 이렇게 쉽게 풀 수 있다. 하지만 문제의 핵심은 parseInt와 그에 따른 예외처리만 있으면 되는데 이를 처리하기 위해서 이중으로 try-catch로 코드를 감싸면서 코드가 더러워지는 것을 확인할 수 있다. 이를 자바 8의 Optional을 이용하여 해결하려 한다. Optional 클래스는 null이 될 수 있는 객체를 감싸는 래퍼 클래스이다. Optional류의 클래스들은 자신이 담고 있는 null이 될 수 있는 객체가 야기시키는 NullPointException을 더 쉽고 명확하게 해결하기 위해 만들어졌다. 단적인 예로 위의 방식처럼 여러 try-catch로 감싸는 코드가 어떻게 깔끔해지게 바뀌는지 아래에 Optional을 활용하여 문제를 푼 코드를 보면서 확인해보자.


public int getStrToInt(String str) {

return Optional.ofNullable(str)
.map(Integer::parseInt)
.orElseThrow(() -> new RuntimeException("No data!"));
}



먼저 첫 번째 코드 Optional.ofNullable() 이 코드는 널이 될 수 있는 객체를 받아 Optional 클래스로 감싼다. 두번째 map(Integer::parseInt)을 통해서 그 객체를 파싱한다. 그리고 세번째 그에 따른 예외처리를 orElseThrow(()->new ...)로 처리한다. 문제의 주어진 예외 상황도 처리하면서 굉장히 깔끔한 코드를 얻을 수 있다. 결론은 자바8 찬양하자!

728x90
반응형