관리자

abstact class vs. trait

abstract class

abstract class는 class의 template으로,
implementation은 하지 않고 
어떤 variable과 method가 필요한지만 정의한다.

어떤 abstract class를 상속하는 class를 정의할 때는
abstract class에 명시된 값과 함수들을 모두 implement(작성)해야한다.

 

trait

trait도 abstract class와 동일한 개념이다.
하지만 abstract class는 1개의 class만 상속할 수 있는 반면,
trait는 여러 class를 상속할 수 있다.

따라서 가급적이면 trait을 쓰는 것이 좋다.

abstract class를 사용해야하는 경우

1) constructor argument를 요구하는 base class를 만드는 경우
2) java에서 이용할 코드인 경우

1) 의 예시
trait Animal(name: String)
//compile error


case class

scala에는 case class라는 재미있는 class가 있다.
switch case 문처럼 scala 에서는
match case문이 존재한다.
특이한 것은 match case와 case class문을 조합하면,
object의 class에 대해서도 switch case를 할 수 있다.

예를 들어보자.
어떤 수학 수식은 숫자(number)와 연산자(operator)로 구성된다.
숫자와 연산자를 포함하는 Expression이라는 abstract class(trait)을 정의하면,
수식을 Expression의 List로 나타낼 수 있다.

triat Expression
case class Number(val: Int) extends Expression {...}
case class Operator(name: String) extends Expression {...}
// Expression을 상속하는 class Number, class Operator 정의


object O {

    def expr(x : Base) = x match {
        case Number(val: Int) => println("x is in class Number")
        case Operator(name: String) => println("x is in class Operator")
    }

    // x가 Number의 instance 이면 "x is in class Name!"를 출력하고
    // x가 Operator의 instance 이면 "x is in class Operator!"를 출력한다.
}

 


Singleton object

Singleton은 class의 instance가 하나만 존재하는 object이다.
class의 instance가 하나만 존재해야하는 경우가 있다.
이 경우에는 class 대신 object를 이용한다.

class Person {...} 대신
object Person {...}


그리고 singleton object는 다음과 같은 특징을 갖는다.
1) 유일하다.
2) 생성자를 정의하지 않는다.
3) new를 이용해서 생성하지 않는다.


Companion Object

class와 이름이 같은 object이다.
static 변수와 method를 정의할 때 companion object를 이용한다.

class Pizza() {...}

Object Pizza {
    val size = 26
    def alertAllergy = println("It contains cheese")
}

+ Recent posts