ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • enum 을 사용한 모델링
    scala/basic 2021. 7. 23. 23:20

    문제

    연령대를 계산해 주는 다음 함수를 작성하라

    /**
     * age 값이 
     *  - 0 이하면  "~0" 리턴
     *  - 1~9 값 이면 "1~9" 리턴
     *  - 10~59 값 이면 "10~59" 리턴
     *  - 60 이상이면 "60~" 리턴
     */
    def ageGroup(age: Int): String = ???

     

    Code

    scala standard library 로 제공되는 enum 은 기능이 빈약하니 enumeratum 을 활용해 작성한다.

    import AgeGroup.{Elder, Interval, Invalid}
    import enumeratum._
    
    import scala.collection.immutable
    
    sealed trait AgeGroup extends EnumEntry { self =>
      override def toString: String = self match {
        case Invalid     => "~0"
        case x: Interval => s"${x.from}~${x.to}"
        case Elder       => "60~"
      }
    
      def contains(age: Int): Boolean = self match {
        case Invalid     => age <= 0
        case x: Interval => x.from <= age && age < x.to
        case Elder       => age >= 60
      }
    }
    
    object AgeGroup extends Enum[AgeGroup] {
      val values: immutable.IndexedSeq[AgeGroup] = findValues
    
      abstract class Interval(val from: Int, val to: Int)
    
      case object Invalid extends AgeGroup
      case object Baby    extends Interval(1, 9) with AgeGroup
      case object Young   extends Interval(10, 59) with AgeGroup
      case object Elder   extends AgeGroup
    
      def withValue(age: Int): AgeGroup = values.find(_.contains(age)).get
    }
    
    object EnumModel {
      def ageGroup(age: Int): String = AgeGroup.withValue(age).toString
    
      def main(args: Array[String]): Unit = {
        val age = ageGroup(50)
        println(age)
      }
    }

    'scala > basic' 카테고리의 다른 글

    Scala State Monad  (3) 2021.08.03
    Pattern Match 조합 - Email 주소 예제  (0) 2021.07.27
    typeclass 는 언제 사용하면 좋을까?  (0) 2021.06.09
    Dark Syntax Sugar  (0) 2021.05.23
    Future 의 concurrency control  (0) 2021.03.28

    댓글

Designed by Tistory.