Comparable, Stream을 사용하여 뱃지 부여하기

2024. 10. 10. 00:01·Langauge/Java

 

❒ Description


우테코 6기 프리코스를 연습 삼아 해보는 과정에서 작성한 코드를 리펙토링 해봤다.

※ Commit link

 

 

 

 

❒ 요구 사항 및 로직 분석


1. Requirements

특정 금액 이상 사용을 하면 뱃지를 부여하는 요구사항이 있었다.

해당 요구사항을 충족하기 위해 Comparable, Stream API(sorted, reduce)를 사용해서 기능을 구현했다.

  • NONE : 5000원 미만 ("없음")
  • STAR : 5000원 이상
  • TREE : 10000원 이상
  • SANTA : 20000원 이상

 

2. Logic

  • Badge를 부여하는 역할은 Badge Enum 클래스가 담당한다.
  • 비교를 위해 Money 클래스의 크기를 내림차순 비교해야 한다.
    • Comparable 인터페이스, Stream API - sorted
  • 후보군 중 가장 높은 등급을 반환 해야한다.
    • Stream API - reduce

구매 금액이 12000원 이라면 뱃지 후보는 NONE, STAR, TREE가 된다. 그 중 가장 높은 등급인 TREE를

구매자에게 부여해야 한다.

 

 

 

 

 

❒ 구현


1. Money implements Comparable

pubic class Money implements Comparable<Money> {
    
    private long val;
    
    //... 생략
    
    @Override
    public int compareTo(Money o) {
        if (this.val - o.val) {
            return -1;
        }
        if (this.val == o.val) {
            return 0;
        }
        return 1;
    }
}

 

2. 'assignBy' method (using Stream API - sorted, reduce)

더보기
public static Badge assignBy(Money money) {
    return Arrays.stream(Badge.values())
            .filter(badge -> money.boeThan(badge.limitMoney))
            .sorted(Comparator.comparingLong(badge -> badge.limitMoney.getVal()))
            .reduce((first, second) -> second)
            .orElse(NONE);
}
public enum Badge {
    NONE(Money.newOne(0), "없음"),
    STAR(Money.newOne(5000), "별"),
    TREE(Money.newOne(10000), "나무"),
    SANTA(Money.newOne(20000), "산타")
    ;
    
    private final Money limitPrice;
    private final String name;
    
    public static Badge assignBy(Money price) {
        return Arrays.stream(Badge.values())
                .filter(badge -> price.boeThan(badge.limitPrice))
                .sorted(Comparator.comparing(badge -> badge.limitPrice))
                .reduce((high, low) -> high)
                .orElse(NONE);
    }
}

 

리팩토링 전과 후를 비교 했을 때 아래의 점이 개선되었다.

  1. Money를 비교하는 역할 compareTo(Money money)를 Money가 가져가게 된다.
  2. 파라미터 변수명을 money -> price 로 변경하였다.
  3. reduce 변수명을 등급의 높고 낮음을 나타내기 위해 first, secound -> high,low로 변경하였다.

 

 

 

 

 


'Langauge > Java' 카테고리의 다른 글

직렬화 & 역직렬화  (0) 2025.01.05
Generic 제대로 알아보기.  (0) 2024.06.16
'Langauge/Java' 카테고리의 다른 글
  • 직렬화 & 역직렬화
  • Generic 제대로 알아보기.
gilbert9172
gilbert9172
gilbert9172 님의 블로그 입니다.
  • gilbert9172
    バックエンド
    gilbert9172
  • 전체
    오늘
    어제
    • All Categories (166)
      • 우테코 7기 (21)
        • 1주차 (8)
        • 2주차 (5)
        • 3주차 (6)
      • Langauge (4)
        • Java (3)
        • Kotlin (1)
      • Back-End (13)
        • SpringBoot (1)
        • Trouble Shooting (0)
        • Setup & Configuration (1)
        • SQL (3)
        • Redis (8)
      • Architecture (6)
        • Multi Module (1)
        • DDD (5)
      • CS (30)
        • Data Structure (6)
        • Operating System (0)
        • Network (12)
        • Database (10)
        • Design Pattern (2)
      • Algorithm (78)
        • 내용 정리 (18)
        • 문제풀이 (60)
      • DevOps (6)
        • AWS (5)
        • Git (1)
      • Front-End (1)
        • Trouble Shooting (1)
      • Project (6)
        • 페이스콕 (6)
      • Book (0)
        • 마스터링 블록체인 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    greedy
    sliding-window
    binarysearch
    Back-Tracking
    Two-Pointer
    부분단조성
    오블완
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
gilbert9172
Comparable, Stream을 사용하여 뱃지 부여하기
상단으로

티스토리툴바