** 의역 문서 입니다.  (참고 http://www.scala-lang.org/node/107)


Case class는 일반적은 Parameter를 포함하는 생성자를 제공하는 일반적은 클래스와 패턴매칭을 통해 재귀적 객체 추출구성(recursive decomposition)을 제공한다.

아래는 clase class의 예제

abstract class Term
case class Var(name: String) extends Term
case class Fun(arg: String, body: Term) extends Term
case class App(f: Term, v: Term) extends Term


사용상의 편의를 위해서 calse class의 생성시 new 키워드를 사용하지 않아도 된다. 클래스 명을 함수같이 쓰면 된다.

아래의 예제 참고

Fun("x", Fun("y", App(Var("x"), Var("y"))))


생성자의 parameter는 모두 public 변수로 간주되며, 아래와 같이 직접 접근이 가능하다.

val x = Var("x")
Console.println(x.name)

 

모든 case class는 equal method(내부적으로 equality 규칙과 toString method가 재정의 된)가 컴파일러에 의해 자동 생성되어 아래와 같이 사용할 수 있다. 

val x1 = Var("x")
val x2 = Var("x")
val y1 = Var("y")
println("" + x1 + " == " + x2 + " => " + (x1 == x2))
println("" + x1 + " == " + y1 + " => " + (x1 == y1))


위의 실행 결과는 아래

Var(x) == Var(x) => true
Var(x) == Var(y) => false


case class는 아래와 같이 data structure를 구분하는데 사용될 수 있다.

object TermTest extends Application {
  def printTerm(term: Term) {
    term match {
      case Var(n) =>
        print(n)
      case Fun(x, b) =>
        print("^" + x + ".")
        printTerm(b)
      case App(f, v) =>
        Console.print("(")
        printTerm(f)
        print(" ")
        printTerm(v)
        print(")")
    }
  }
  def isIdentityFun(term: Term): Boolean = term match {
    case Fun(x, Var(y)) if x == y => true
    case _ => false
  }
  val id = Fun("x", Var("x"))
  val t = Fun("x", Fun("y", App(Var("x"), Var("y"))))
  printTerm(t)
  println
  println(isIdentityFun(id))
  println(isIdentityFun(t))
}

위의 예제이서, print 함수는 각 matching 상태를 나타내며, match 키워드에 해당 case의 구현체(body)에 matching 되는 형태를 취하고 있다.

isIdentityFun은 주어진 term이 simple identity 조건에 부합하는지를 검사하는 함수이다. 주어진 값이 패턴에 matching된 이후에 if 함수가 실행(evaluate)된다. 성공적으로 매칭된 경우 true를 return 하고 fail인 경우 다음 pattern matching을 시도하게 된다.

실행 결과는 아래와 같다.

^x.^y.(x y)
true
false
x == y는 scala 컴파일러에 의해 구현된 equal 함수에 의해 자동적으로 처리되었음을 확인 할 수 있다.


+ Recent posts