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