인터페이스, 트레이트, 상속

인터페이스

자바

public interface Adder {
  int add(int a, int b);
}

자바에서 인터페이스를 만들어, 클래스들이 구현해야 하는 필수 메서드를 선언하고 객체끼리 서로 소통하는 기준과 약속을 정합니다.

스칼라

trait Adder {
  def add(a: Int, b: Int): Int
}

스칼라에서는 트레이트(trait)가 자바의 인터페이스(interface)와 비슷한 일을 할 수 있습니다. 추가 기능도 있습니다만, 우선은 트레이트와 인터페이스가 같은 거라고 생각해 봅시다.

메서드 구현체를 포함한 인터페이스

자바

public interface Adder {
  int add(int a, int b);
  default int multiply(int a, int b) {
    return a * b;
  }
}

자바 8부터는 인터페이스에 디폴트(default)메서드를 선언할 수 있습니다.

스칼라

trait Adder {
  def add(a: Int, b: Int): Int
  def multiply(a: Int, b: Int): Int = a * b
}

스칼라의 트레이트에는 별도 키워드 없이도, 평범히 메서드에 본문을 선언해 둘 수 있습니다.

여러 인터페이스를 구현하는 클래스

자바

interface Adder {
  default int add(int a, int b) {
    return a + b;
  }
}

interface Multiplier {
  default int multiply (int a, int b) {
    return a * b;
  }
}

public class JavaMath implements Adder, Multiplier {}

JavaMath jm = new JavaMath();
jm.add(1, 1);      // => 2
jm.multiply(2, 2); // => 4

여러 인터페이스를 구현(implement)한 클래스 입장에서는, 각 인터페이스에 있는 기본(default) 메서드를 문제없이 호출할 수 있습니다.

스칼라

trait Adder {
  def add(a: Int, b: Int) = a + b
}

trait Multiplier {
  def multiply(a: Int, b: Int) = a * b
}

class ScalaMath extends Adder, Multiplier

val sm = new ScalaMath
sm.add(1, 1)      // => 2
sm.multiply(2, 2) // => 4

스칼라 트레이트에 선언한 메서드도 비슷한 방식으로 호출할 수 있습니다.