나누고 싶은 개발 이야기

Data Engineer로서 기록하고 공유하고 싶은 기술들. 책과 함께 이야기합니다.

Language/scala

[Scala] with 키워드 정리

devidea 2019. 4. 26. 15:19
기존 scala로 된 프로젝트를 파악하던 중 다음과 같은 코드를 보고 with 키워드가 헷갈리기 시작했다. 
val mapper = new ObjectMapper() with ScalaObjectMapper

그래서 필자와 같이 scala와 친숙해 지려고 노력하는 분들을 위해 짧게 with 키워드를 짧게 정리해 보고자 한다.

scala 책을 살펴보면 with 키워드가 처음 나오는 부분은 trait가 아닐까 싶다. trait는 캡슐화된 메소드와 필드 정의를 재사용하는데 사용된다. 클래스 상속도 재사용이 가능하지만 하나의 부모 클래스만 가져야 한다는 부분이 다르다. trait는 믹스인을 통해 여러개의 trait를 조합할 수 있다. 믹스인을 할 때 사용하는 키워드가 with이다.

그럼 실제 사례를 들어보자.
먼저 trait를 어떤 슈퍼클래스를 상속한 클래스와 혼합할 수 있는데, 슈퍼클래스는 extends 키워드로 지정하고, with를 사용해 trait를 믹스인한다.
class Frog extends Animal with Philosophical {
    override def toString = "green"
}

또는 여러 trait를 믹스인 하기 위해 with 구문을 추가한다.
class Frog extends Animal with Philosophical with HasLegs {
    override def toString = "green"
}


그러면 다시 처음으로 돌아가보자.
클래스 정의시에 사용했던 with와 달리 객체를 생성할 때의 with는 무슨 차이가 있을까?

핵심은 전체 클래스에 trait를 사용하는 것이 아닌 일부 생성한 객체에만 trait 기능을 재사용 하는데 있다.
다음 코드를 살펴보자.
class DavidBanner
trait Angry {
  println("You won't like me ...")
}
object Test extends App {
  val hulk = new DavidBanner with Angry
}

DavidBanner 클래스의 hulk 객체를 생성할 때 Angry trait를 믹스인했다. (배너박사가 화가 나면 헐크가 맞다ㅎㅎ)
DavidBanner가 Angry를 믹스인 안 했다면 "You won't like me .." 를 프린트 하지 않았을 것이다.



반응형

'Language > scala' 카테고리의 다른 글

Scala의 Enum  (0) 2023.12.17
[Scala] evaluation strategies in scala  (0) 2020.04.03
Evaluation Rules  (0) 2017.09.12