Skip to content

5.4 타입 클래스 패턴

ahaljh edited this page Sep 5, 2016 · 6 revisions

타입 클래스 패턴

  • 기존 타입의 수정 없이 타입 수정의 효과를 낼 수 있다.
  • 확장 메서드(extension method)라고 부르기도 한다.
  • 기존 클래스에 메소드를 추가한 효과
  • 임의 다형성(ad hoc polymorphism)이라고 하기도 한다
  • 다형적 동작이 타입 시스템과 연동되어 있지 않기 때문
// src/main/scala/progscala2/implicits/toJSON-type-class.sc 

case class Address(street: String, city: String)
case class Person(name: String, address: Address) 

trait ToJSON {
  def toJSON(level: Int=0): String 
  val INDENTATION = "  " 
  def indentation(level: Int=0): (String, String) = 
    (INDENTATION * level, INDENTATION * (level+1)) 
}

implicit class AddressToJSON(address: Address) extends ToJSON {
  def toJSON(level: Int=0): String = {
    val (outdent, indent) = indentation(level) 
    s"""{
      |${indent}"street": "${address.street}",
      |${indent}"city": "${address.city}"
      |$outdent}""".stripMargin 
  }
}

implicit class PersonToJSON(person: Person) extends ToJSON {
  def toJSON(level: Int=0): String = {
    val (outdent, indent) = indentation(level)
    s"""{
      |${indent}"name": "${person.name}",
      |${indent}"address": ${person.address.toJSON(level+1)}
      |$outdent}""".stripMargin 
  }
}

val a = Address("1 Scala Lane", "Anytown")
val p = Person("Buck Trends", a) 

println(a.toJSON())
println()
println(p.toJSON()) 

결과

{
  "street": "1 Scala Lane",
  "city": "Anytown"
}

{
  "name": "Buck Trends",
  "address": {
    "street": "1 Scala Lane",
    "city": "Anytown"
  }
}
Clone this wiki locally