본문 바로가기
Project/소경관

[소경관] : 로직에서 if문 지양하기 도전..

by 오주현 2022. 6. 18.
반응형

로직을 짜면서 if문을 남발하다 보니 알아보기 어려운 코드가 되가고 수정하기가 어려워지고 있다. 일단, 로직 자체가 길어지는 문제도 있는 것 같아 줄여보고자 여러 방법을 찾아봤다. 그 중에서 제일 간단한 따로 메소드를 만들어 빼보는 코드를 먼저 구현했다. 

 

사실 이게 맞는지 모르겠지만 일단 뭐라도 해보자는 생각에 함수로 빼는 것을 했지만 다시 enum을 사용해 보는 것을 고려하고 있다. 우선 코드를 적어본다.

 

// 파싱 데이터 뺴기
List<String> list = new ArrayList<String>();

// list에 JSON -> String으로 타입 변경해서 담기
for(int i=0 ; i<resultArray.size() ; i++){

    JSONObject tempObj = (JSONObject) resultArray.get(i);
    System.out.println(""+(i+1)+"번호 : "+tempObj.get("recognition_words"));

    String res[] = tempObj.get("recognition_words").toString().split("\"");

    list.add(res[1]);
}

log.debug("### list : {}", list);
            
            
if (list.get(0).length() == 3 || list.get(1).length() == 4) {

    log.debug("### 1번 문항");
    carNumber = list.get(0) + list.get(1);
    mav.addObject("msg", "자동차 번호는" + carNumber + "입니다.");

} else if (list.get(0).length() == 4 || list.get(1).length() == 4) {

    log.debug("### 2번 문항");
    carNumber = list.get(0) + list.get(1);
    mav.addObject("msg", "자동차 번호는" + carNumber + "입니다.");


} else if (list.get(0).length() == 7) {

    log.debug("### 3번 문항");
    carNumber = list.get(0);
    mav.addObject("msg", "자동차 번호는" + carNumber + "입니다.");

} else if (list.get(0).length() == 8) {

    log.debug("### 4번 문항");
    carNumber = list.get(0);
    mav.addObject("msg", "자동차 번호는" + carNumber + "입니다.");

} else if (list.get(1).length() == 8) {

    log.debug("### 5번 문항");
    carNumber = list.get(1);
    mav.addObject("msg", "자동차 번호는" + carNumber + "입니다.");

} else {

    log.debug("### 6번 문항");
    mav.addObject("msg", "자동차 번호를 인식할 수 없습니다. 다른 사진으로 시도해주세요.");
}

OCR에서 자동차 번호를 인식해 올 때 앰블럼 로고까지 인식하는 문제 때문에 여러 상황에 맞춰 자동차 번호로 재배열해주는 로직을 짜려고 if를 이렇게 넣었다. 본 로직이 길어지고 복잡해 지는 경향이 있어서 if를 어떻게 처리하고 싶어졌다.

 

일단, 여러 효과적인 방법이 있겠지만 본 로직에서 if문단을 제외하자는 생각에 먼저 메소드로 뺴주는 것을 먼저 했다.

 

private ArrayList<String> carNumberCheck(List<String> list)

같은 클래스 아래 위와 같은 메소드를 만들어 주었다.

 

Model에 들어가는 msg값과 carNumber를 담기 위해 ArrayList로 리턴 타입을 정의해주고 받아오는 값은 뒤죽 박죽 섞여 있는 자동차 번호와 앰블럼까지 인식된 OCR 결과 list로 받아준다.

 

private ArrayList<String> carNumberCheck(List<String> list) {

    String carNumber = null;
    String msg;

    if (list.get(0).length() == 3 || list.get(1).length() == 4) {

        log.debug("### 1번 문항");
        carNumber = list.get(0) + list.get(1);
        msg = "자동차 번호는" + carNumber + "입니다.";

    } else if (list.get(0).length() == 4 || list.get(1).length() == 4) {

        log.debug("### 2번 문항");
        carNumber = list.get(0) + list.get(1);
        msg = "자동차 번호는" + carNumber + "입니다.";

    } else if (list.get(0).length() == 7) {

        log.debug("### 3번 문항");
        carNumber = list.get(0);
        msg = "자동차 번호는" + carNumber + "입니다.";

    } else if (list.get(0).length() == 8) {

        log.debug("### 4번 문항");
        carNumber = list.get(0);
        msg = "자동차 번호는" + carNumber + "입니다.";

    } else if (list.get(1).length() == 8) {

        log.debug("### 5번 문항");
        carNumber = list.get(1);
        msg = "자동차 번호는" + carNumber + "입니다.";

    } else {

        log.debug("### 6번 문항");
        msg = "자동차 번호를 인식할 수 없습니다. 다른 사진으로 시도해주세요.";
    }

    ArrayList<String> msgAndNumber = new ArrayList<>();
    msgAndNumber.add(msg);
    msgAndNumber.add(carNumber);


    return msgAndNumber;

}

그리고 if문을 싹 긁어와서 넣어주고 모델 값에 담는 대신에 String msg에 담아주고 ArrayList에 담아 리턴해주었다.

 

ArrayList<String> msgAndNumber = carNumberCheck(list);
mav.addObject("msg", msgAndNumber.get(0));
carNumber = msgAndNumber.get(1);

본 로직에서는 코드를 이렇게 수정해 주었다. 인식 list를 carNumberCheck 메소드로 넘겨주고 msgAndNumber로 받아 안에서 msg와 carNumber를 꺼내어 사용했다.

 

수정 후 전체적인 본 로직 코드만 보면 아래와 같다.

    // 파싱 데이터 뺴기
    List<String> list = new ArrayList<String>();

    // list에 JSON -> String으로 타입 변경해서 담기
    for(int i=0 ; i<resultArray.size() ; i++){

        JSONObject tempObj = (JSONObject) resultArray.get(i);
        System.out.println(""+(i+1)+"번호 : "+tempObj.get("recognition_words"));

        String res[] = tempObj.get("recognition_words").toString().split("\"");

        list.add(res[1]);
    }
    log.debug("### list : {}", list);

    // 로직 실행 ( 메소드로 만들어서 따로 빼야함)
    ArrayList<String> msgAndNumber = carNumberCheck(list);
    mav.addObject("msg", msgAndNumber.get(0));
    carNumber = msgAndNumber.get(1);

}

긴 if문장을 따로 빼서 일단, 본 로직의 길이는 짧아졌다. 하지만 메소드 내에서 if문을 남발하는 것은 변하지 않은 약간 눈 가리는 식의 포장인 것 같다.

 

if문을 효과적으로 줄이기 위해서 enum 클래스에 대해 공부해 보려고 한다. 

 

https://techblog.woowahan.com/2527/

 

Java Enum 활용기 | 우아한형제들 기술블로그

{{item.name}} 안녕하세요? 우아한 형제들에서 결제/정산 시스템을 개발하고 있는 이동욱입니다. 이번 사내 블로그 포스팅 주제로 저는 Java Enum 활용 경험을 선택하였습니다. 이전에 개인 블로그에 E

techblog.woowahan.com

우아한형제들 기술 블로그에서도 enum을 잘 사용했다고 하니 이것을 토대로 공부하고 다시 적용해서 이 다음에는 if문을 퇴치하는 것을 목표로 해보겠다.

반응형

댓글