반응형

Dart, 클래스 class 확장 

 

글. 수알치 오상문

 

추상 클래스(Abstract classes)

 

abstract 지시를 사용하여 인스턴스화 할 수없는 추상 클래스를 정의합니다. 추상 클래스는 일부 구현에서 인터페이스를 정의하는 데 유용합니다. 추상 클래스가 인스턴스화 가능한 것처럼 보이게하려면 팩토리 생성자를 정의합니다(factory constructor).

 

다음 예제처럼 추상 클래스는 추상 메서드를 갖기도 합니다. 

 

// 이 클래스는 추상으로 선언되있으므로 인스턴스를 만든 수 없습니다.

abstract class AbstractContainer {

  // 생성자, 필드, 메서드 정의...

 

  void updateChildren(); // 추상 메서드 (몸통 구현부가 없다)

}

암시적인 인터페이스

모든 클래스는 클래스의 모든 인스턴스 멤버와 구현하는 인터페이스를 포함하는 인터페이스를 암시적으로 정의합니다. 클래스 B의 구현을 상속하지 않고 B의 API를 지원하는 클래스 A를 만들려면 A가 B의 인터페이스를 구현해야합니다.

 

클래스는 implements 절에 선언한 다음, 인터페이스에 필요한 API를 제공하여 인터페이스를 구현합니다. 

 

// 암시적인 인터페이스에 greet() 포함.

class Person {

  // 인터페이스에 있지만 이 라이브러리에서만 사용 가능

  final String _name;

  // 생성자이므로 인터페이스에 없음

  Person(this._name);

  // 인터페이스에 있음

  String greet(String who) => 'Hello, $who. I am $_name.';

}

 

// Person 인터페이스의 구현

class Impostor implements Person {

  String get _name => '';

  String greet(String who) => 'Hi $who. Do you know who I am?';

}

 

String greetBob(Person person) => person.greet('Bob');

 

void main() {

  print(greetBob(Person('Kathy')));

  print(greetBob(Impostor()));

}

 

다음은 여러 인터페이스를 구현하는 예입니다.

 

class Point implements Comparable, Location {

  // ...

}

 

클래스 확장 

extends를 사용하여 하위 클래스를 만들 수 있습니다. 수퍼 클래스를 참조하려면 super를 사용합니다.

 

class Television {

  void turnOn() {

    _illuminateDisplay();

    _activateIrSensor();

  }

  // ···

}

 

class SmartTelevision extends Television {

  void turnOn() {

    super.turnOn();

    _bootNetworkInterface();

    _initializeMemory();

    _upgradeApps();

  }

  // ···

}

 

멤버 재정의(Overriding)

하위 클래스는 인스턴스 메서드(연산자 포함), getter 및 setter를 재정의 할 수 있습니다. 다음 예는 @override 표기를 사용하여 멤버 재정의를 명확하게 알려주고 있습니다.

 

class SmartTelevision extends Television {

  @override

  void turnOn() {

    // ...

  }

  // ···

}

 

형식이 안전한(type safe) 코드에서 메서드 매개변수 또는 인스턴스 변수의 형식을 좁히려면 covariant 키워드(covariant keyword)를 사용할 수 있습니다.

 

경고: 연산자 ==를 재정의하는 경우에 Object의 hashCode getter도 재정의해야합니다. 참조: Implementing map keys.

 

noSuchMethod()

코드가 존재하지 않는 메서드 또는 인스턴스 변수를 사용하려고 할 때, 감지/반응하려면 noSuchMethod ()를 재정의하세요.

 

class A {

  // noSuchMethod를 재정의하지 않으면,

  // 존재하지 않는 멤버 사용시 NoSuchMethodError 오류가 발생합니다.  

  @override

  void noSuchMethod(Invocation invocation) {

    print('존재하지 않는 멤버입니다: ' '${invocation.memberName}');

  }

}

 

확장 메서드

확장 메서드는 기존 라이브러리에 기능을 추가하는 방법입니다. IDE에서 코드 완성을 사용하는 경우 일반 메서드와 함께 확장 메서드를 제안합니다.

 

다음은 string_apis.dart에 정의된 parseInt()라는 확장 메서드를 사용하는 예입니다.

 

import 'string_apis.dart';

// ...

print('42'.padLeft(5)); // String 메서드 사용

print('42'.parseInt()); // 확장 메서드 사용

 

침조: extension methods page.

 

<이상>

 

반응형

'Dart' 카테고리의 다른 글

Dart, 클래스에 기능 추가하기(mixin)  (0) 2021.06.17
Dart, 열거형 (Enumerated type)  (0) 2021.06.17
Dart, 메서드(메소드)  (0) 2021.06.17
Dart, 클래스 class  (0) 2021.06.15
Dart, 예외 처리 try ~ catch  (0) 2021.06.15

+ Recent posts