2.2.3 인터페이스(Interfaces)

2.2.3 인터페이스(Interfaces)

인터페이스는 클래스의 공개 필드를 기술하는 클래스의 "시그니처"라고 이해할 수 있어요. 인터페이스는 구현을 제공하지 않고, 순수하게 구조적 정보만 제공합니다:

interface Printable {
    public function toString():String;
}

문법은 클래스와 비슷하지만 다음과 같은 차이가 있어요:

  • class 키워드 대신 interface 키워드를 사용합니다.
  • 함수는 표현식(expressions)을 갖지 않습니다.
  • 모든 필드는 명시적 타입을 가져야 해요.

인터페이스는 구조적 서브타이핑(structural subtyping)과 달리 클래스 간의 정적 관계를 기술해요. 어떤 클래스는 명시적으로 선언했을 때만 인터페이스와 호환된다고 간주됩니다:

class Point implements Printable { }

여기서 implements 키워드는 PointPrintable과 "is-a" 관계를 가진다는 것을 나타냅니다. 즉 Point의 모든 인스턴스는 Printable의 인스턴스이기도 해요. 클래스는 부모 클래스를 하나만 가질 수 있지만, 여러 implements 키워드로 여러 인터페이스를 구현할 수 있어요:

class Point implements Printable
  implements Serializable

컴파일러는 implements 가정이 실제로 성립하는지 검사합니다. 즉 클래스가 인터페이스가 요구하는 모든 필드를 실제로 구현하는지 확인해요. 클래스 자신 또는 부모 클래스가 구현을 제공하면 그 필드는 구현된 것으로 간주됩니다.

인터페이스의 필드는 메서드에만 국한되지 않아요. 변수와 속성일 수도 있답니다:

interface Placeable {
  public var x:Float;
  public var y:Float;
}

class Main implements Placeable {
  public var x:Float;
  public var y:Float;

  static public function main() {}
}

인터페이스는 extends 키워드로 여러 다른 인터페이스를 확장할 수 있어요:

interface Debuggable extends Printable extends Serializable

Haxe 4.0.0 이후 — 클래스와 마찬가지로 인터페이스도 final 키워드로 표시할 수 있어, 확장을 막을 수 있습니다.

참고(implements 문법) — Haxe 3.0 이전 버전에서는 여러 implements 키워드를 쉼표로 구분해야 했어요. 저희는 Java의 사실상 표준을 따르기로 하고 쉼표를 없앴습니다. 이것은 Haxe 2와 3 사이의 breaking change 중 하나였어요.

출처: Interfaces

본문

인터페이스의 성격

인터페이스는 클래스가 가져야 할 공개 필드의 시그니처만 정의해요. 구현은 없고 구조적 정보만 담기에, 인터페이스는 "계약(contract)"처럼 동작합니다.

static 관계

구조적 서브타이핑과 달리 인터페이스는 정적 관계예요. 어떤 클래스가 인터페이스와 호환되려면 명시적으로 implements를 선언해야 합니다. 아무리 필드가 일치해도 선언이 없으면 호환되지 않아요.

다중 인터페이스 구현

클래스는 여러 인터페이스를 동시에 구현할 수 있어요. 각각의 implements 키워드로 하나씩 나열합니다. 컴파일러는 모든 요구 필드가 구현되었는지 확인합니다.

인터페이스 확장

인터페이스는 extends로 다른 인터페이스들을 확장할 수 있어요. 확장된 인터페이스는 부모 인터페이스들의 모든 필드를 포함하게 됩니다.

더 알아보기