티스토리 뷰

반응형

[ Dart 문서 ]

- Abstract classes 

Implicit interfaces 

- Extending a class 

 

아래는 이 문서들을 참고해서 제가 재구성한 내용으로 틀린 내용이 있을 수 있습니다! 

 

 

[1] Extending a class 

extends를 이용해 subclass를 만들 수 있고 super로 superclass를 참조할 수 있습니다. 

(영어가 더 명확.. Use extends to create a subclass, and super to refer to the superclass)

 

다트에서는 @override annotation을 생략할 수 있습니다. 

 

 

아래 예제는 오버라이딩을 명시적으로 나타내주기 위해 의도적으로 @override annotation을 붙인 예제입니다. 

 

 

 

[2] Implicit Interfaces

 

다트에서는 interface를 정의하는 interface keyword가 따로 없습니다. 

다트에서 모든 클래스는 암시적으로 인터페이스를 정의합니다.

 

만약 클래스 A가 클래스 B의 구현을 상속하지 않고 클래스 B의 API를 지원하고 싶다면,

클래스 A가 클래스 B 인터페이스를 implement 해야 합니다.

 

클래스는 multiple interfaces를 implement 할 수 있습니다. 

 

공식 문서 예제

 

이 블로그 예제를 보면 다트에서 interface가 어떤 식으로 쓰이는 지 더 감이 옵니다. 

 

https://www.codevscolor.com/dart-implicit-interface

 

하지만 반드시 interface에 있는 변수, 메소드들을 모두 그대로 재정의 해줘야합니다. 

 

아래 예제처럼 Vehicle에 정의된 printDetails 메소드를 그대로 쓰고 싶어서

printDetails 메소드를 Audi 클래스에서 구현 안해주면 컴파일 에러가 납니다.

 

 

 

자바 개발자를 위한 Dart 소개 > 인터페이스 구현 문서 를 보면 위에서 살펴본 것들이 좀 정리가 됩니다,,,

 

https://codelabs.developers.google.com/codelabs/from-java-to-dart/#4

 

 

 

 

 

[3] Abstract Classes

 

위에서 클래스가 인터페이스 용도로 사용되는 것을 살펴봤습니다. 

아래 예제처럼 인터페이스 클래스에 기본 기능도 구현하기 싫다! 하는 경우 메소드를 비워둘 수 도 있는데요,

이 때 다른 곳에서는 클래스가 인터페이스 용도 인 줄 모르고 Hero 클래스로 인스턴스를 만들어서 사용해버릴 수 도 있습니다.  

 

 

그 때 abstract class(추상클래스)를 사용하면 좋습니다. 

abstract class는 instantiated 될 수 없기 때문입니다. 

 

또한 abstract class는  abstract methods 를 가질 수 있습니다.

(abstract method를 만들려면 method body 대신 semicolon (;)  을 사용하면 됩니다. )

메소드를 비워두는 대신에 abstract method로 해둬서 훨씬 명확해지는 장점도 있겠네요.

 

이런 이유들로 abstract class는 interface를 정의하는데 유용합니다.

 

abstract modifier 를 사용하여 abstract class를 define 할 수 있습니다.

 

 

그리고 abstract class에 abstract methods 뿐만 아니라 다른 구현이 들어갈 수 도 있는데요,

이 경우 조금 유의해야합니다.

 

 

# abstract methods만 있는 경우 

 

 implements / extends 모두 가능합니다.  

 

 

 

# abstract method + 다른 구현이 있는 경우

 

abstract class에 구현이 추가되는 경우 implements를 한 곳에서
컴파일 에러 납니다.

 

 

위에서 살펴본 것 처럼 implements를 하는 경우 반드시 interface의 변수, 메소드들을 모두 재정의해줘야하기 때문입니다. 

아래처럼 해야지 컴파일 에러가 안납니다.

 

 

 

[ 정리 ] 

Dart에서는 클래스를 인터페이스 타입으로 쓴다. 그래서 implements 뿐만아니라 extends도 문법적으로 가능하기 때문에 좀 헷갈린다. 

abstract class를 인터페이스 용도로 쓰기 좋다. abstract class는 instatiated 될 수 없고

abstract class에는 method body를 작성안해도 되는 abstract method들을 정의할 수 있기 때문이다. 

하지만 여기에 추상메소드 뿐만아니라 구현을 추가한다면 인터페이스로 쓰기에 적합한지 고민이 필요하다.. 

 

Dart에도 Swift Protocol extension 같은 것이 있으면 좋겠는데 아직 방법이 없는 듯하다. 

 

 

 

 

 

 

반응형
댓글