본문 바로가기
🔓 영구 노트

if문 중첩 시 간결하게 보이는 법

by 파랭이가 룰루랄라 2022. 7. 6.

상태를 관리해야 하는 서비스를 제공하는 경우 예를 들어 플레이어의 상태, 주문 상태, 배송 상태 등에서는 조건문을 사용하지 않을 수 없다. 다음은 마인크래프트 모드 개발을 하던 중에 작성한 코드이다.

@EventHandler
public void onRightClick(PlayerInteractEvent event) {
    if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
        if (event.getItem() != null) {
            if (event.getItem().getItemMeta().equals(gamblingObject.getOakWood().getItemMeta())) {
                Player player = event.getPlayer();
                ItemStack item = getItemBy(random.nextInt(100));
                player.getInventory().addItem(item);
            }
        }
    }
}

코드에서는 플레이어가 인벤토리의 아이템을 오른쪽 클릭을 했는지 이때, 아이템이 없는 게 아닌지 해당 아이템이 gamblingObject에 정의되어 있는 oakwood 아이템인지 확인하는 조건을 확인한다.

 

3개의 조건에 대해서 if문을 중첩하여 코드가 작성되어 있다. 이때, 만약 2개 조건이 추가되고, 조건문 사이사이에 연산이 추가된다면 어떤 조건을 확인해야 하는지 확인하기 힘들 정도로 코드가 복잡해질 수 있다.

 

따라서, 조금 더 보기 좋은 코드를 작성하기 위해 조건문 하나만 사용하여 코드를 정리해보겠다. 다음은 정리된 코드이다.

@EventHandler
public void onRightClick(PlayerInteractEvent event) {
    if (isValidEvent(event) && isEventItemAndCustomItemEqual(event)) {
        Player player = event.getPlayer();

        ItemStack item = getItemBy(random.nextInt(100));
        player.getInventory().addItem(item);
        player.getInventory().removeItem(gamblingObject.getOakWood());
    }
}

private Boolean isValidEvent(PlayerInteractEvent event) {
    return event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getItem() != null;
}

private Boolean isEventItemAndCustomItemEqual(PlayerInteractEvent event) {
    ItemMeta itemMeta = event.getItem().getItemMeta();
    if (itemMeta == null) return false;
    return Objects.equals(itemMeta, gamblingObject.getOakWood().getItemMeta());
}

3개의 조건문을 2개의 함수에 정리하였다.

  • 첫번째, isValidEvent는 유효한 이벤트인지 확인하는 함수로 인벤토리의 빈칸이 아닌 아이템을 우클릭했는지 확인한다.
  • 두 번째, isEventItemAndCustomItemEqual은 이름은 길지만 이벤트의 아이템과 커스텀 아이템이 같은 아이템인지 확인한다는 의미로 함수명을 지었다. 함수의 역할은 이벤트 아이템의 메타 정보와 gameblingObject의 oakwood의 메타 정보를 비교하여 같은지 확인한다.

3개 조건에 대해서 3개의 함수를 작성하지 않은 이유는 오른쪽 클릭과 빈칸에 대한 조건을 분리하는 것은 쓸데없는 함수와 코드 수를 늘린다고 생각했기 때문이다. 생각해보면 유효한 이벤트를 위해서는 2개 조건 중에 하나만 만족할 수 없다. 따라서 2개를 하나로 묶어 함수로 만드는 것이 코드를 더 잘 이해할 수 있다고 생각한다.

 

위 방법이 최선의 방법은 아닐 수 있지만 if문을 중첩하여 작성하는게 최선이 아니라는 것은 알 수 있다. 개발을 공부하고, 프로젝트를 진행하면서 "왜 깔끔한 코드를 작성해야 할까?"라는 질문에 느낀 점이 있다면 다음 2가지를 말할 수 있을 것 같다.

  • 서비스 요구사항은 언제든 변할 수 있다.
  • 내가 짠 코드를 누군가 볼 수 있고, 1달 혹은 2달 후에 봐도 이해할 수 있어야한다.

첫 번째는 해커톤과 같은 대회에서 두드러지게 보이는데 짧은 기간 동안에 많은 코드를 작성해야 하는 대회인 만큼 시시각각으로 요구사항이 변한다. 따라서 기획자 혹은 다른 개발자의 피드백을 잘 적용하기 위해서는 깔끔한 코드를 작성하는 것이 도움이 될 수 있다. 두 번째, 혼자 모든 것을 개발했다면 다를 수 있지만 대부분 협업을 하여 개발을 한다. 이때, 내가 맡고 있던 기능을 다른 사람이 맡게 될 때에 코드가 깔끔하다면 인수인계에 도움이 될 것이다. 물론 반대의 경우도 마찬가지이다.

댓글