타입을 하나의 파라미터로 받는다

class Stack[A]:
  private var elements: List[A] = Nil
  def push(x: A): Unit =
    elements = x :: elements
  def peek: A = elements.head
  def pop(): A =
    val currentTop = peek
    elements = elements.tail
    currentTop

→ 스칼라는 강타입 언어라서 해당 기능을 지원하고 있다.

→ 타입 파라미터를 [ ]로 받는다.

→[A]를 통해 타입 파라미터의 지시자로 쓴다.

이 구현은 stack클래스인데, 타입A로만 엘리먼트를 오직 받을 수 있게 된다.

실제로 쓸때는 A에다가 사용하려느 타입을 넣어줘야한다,.

val stack = Stack[Int]
stack.push(1)
stack.push(2)
println(stack.pop())  // prints 2
println(stack.pop())  // prints 1

이 스택은 인트만 받을수있다.

즉 타입이 서브타입을 가질경우 서브타입만 받을수있다.

class Fruit
class Apple extends Fruit
class Banana extends Fruit

val stack = Stack[Fruit]
val apple = Apple()
val banana = Banana()

stack.push(apple)
stack.push(banana)

스택에 char타입을 받을때, stack[int]와는 상호 호환 될 수 없다.

B=A가 같을 때만 위의 두 stack을 호환할 수 있다.

클래스 내에서 특정 타입만을 받아서 그 내에서 자유롭게 활용가능하다는 점이 핵심