ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스 1단계] 알고리즘 14. 문자열 숫자로 바꾸기
    레거시/레거시-알고리즘(3) 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 찬양하자!

Designed by Tistory.