scala/basic

enum 을 사용한 모델링

wefree 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)
  }
}