-
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