Scala.22장 | 리스트 구현


22장. 리스트 구현

22.1 List 클래스 개괄

Nil 객체

case object Nil extends List[Nothing] {
  override def isEmpty = true
  override def head: Nothing =
  	throw new NoSuchElementException("head of empty list")
  override def tail: List[Noting] =
  	throw new NoSuchElementException("head of empty list")
}

:: 클래스

final case class :: [T] (hd: T, tl: List[T]) extends List[T] {
  def head = hd
  def tail = tl
  override def isEmpty: Boolean = false
}

추가 메소드

def length: Int =
	if (isEmpty) 0 else 1 + tail.length
	
def drop(n: Int) : List[T] =
	if (isEmpty) Nil
	else if (n <= 0) this
	else tail.drop(n-1)

리스트 구성

abstract class Fruit
class Apple extends Fruit
class Orange extends fruit
scala> val apples = new Apple :: Nil
apples: List[Apple] = List(Apple@585fa9)

scala> val fruits = new Orange :: apples
fruits: List[Fruit] = List(Orange@cd6798, Apple@585fa9)

22.2 ListBuffer 클래스

def incAll(xs: List[Int]) : List[Int] = xs match {
  case List() => List()
  case x :: xs1 => x + 1 :: incAll(xs1)
}
import scala.collection.mutalbe.ListBuffer

val buf = new ListBuffer[Int]
for (x <- xs) buf += x + 1
buf.toList

22.3 실제 List 클래스

// List클래스 내의 map 메소드 정의
final override def map[U] (f: T => U): List[U] = {
  val b = new ListBuffer[U]
  var these = this
  while (!these.isempty) {
    b += f(these.head)
    these = these.tail
  }
  b.toList
}

22.4 외부에서 볼 때는 함수형