인터페이스, 트레이트, 상속
인터페이스
자바
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
스칼라 트레이트에 선언한 메서드도 비슷한 방식으로 호출할 수 있습니다.