Scala Trait

  • ์ธํ„ฐํŽ˜์ด์Šค์™€ ํ•„๋“œ๋ฅผ ๊ณต์œ ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๋งˆ์น˜ Java์˜ interface์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.
    • Class, Object๋กœ ํ™•์žฅ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • ํ•˜์ง€๋งŒ ๋‹จ๋…์œผ๋กœ ์ธ์Šคํ„ด์Šคํ™” ์‹œํ‚ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Example

trait HairColor // Normal Case

Example - Generic Type

trait Iterator[A] { // Generic Type
  def hasNext: Boolean
  def next(): A
}

Example

  • extends ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ Class์— ํ™•์žฅํ•œ๋‹ค.
trait Iterator[A] {
  def hasNext: Boolean
  def next(): A
}
 
class IntIterator(to: Int) extends Iterator[Int] {
  private var current = 0
  override def hasNext: Boolean = current < to // override๊ฐ€ ๊ผญ ์—†์–ด๋„๋œ๋‹ค.
  override def next(): Int = {
    if (hasNext) {
      val t = current
      current += 1
      t
    } else 0
  }
}
 
 
val iterator = new IntIterator(10)
iterator.next()  // returns 0
iterator.next()  // returns 1

Subtyping

  • Pet์„ ๊ตฌํ˜„ํ•œ ๊ตฌํ˜„์ฒด๋งŒ ๋„ฃ์„ ์ˆ˜ ์žˆ๊ณ 
  • Pet์„ ๋„ฃ์„ ์ˆ˜๋Š” ์—†๋‹ค.
import scala.collection.mutable.ArrayBuffer
 
trait Pet {
  val name: String
}
 
class Cat(val name: String) extends Pet
class Dog(val name: String) extends Pet
 
val dog = new Dog("Harry")
val cat = new Cat("Sally")
 
val animals = ArrayBuffer.empty[Pet] // Java Type Casting์™€ ๋น„์Šทํ•ด๋ณด์ธ๋‹ค.
animals.append(dog)
animals.append(cat)
animals.foreach(pet => println(pet.name))  // Prints Harry Sally

Reference