Classes
이전 내용은 여기에
2020/07/24 - [Programming/Dart] - Dart 4일 차 - Language Tour
Constructors
https://dart.dev/guides/language/language-tour#constructors
class 이름과 같은 함수를 만들어서 생성자를 정의한다.
Named constructors 는 옵셔널이다.
this 키워드는 현재 인스턴스를 참조한다.
생성자 변수를 프로퍼티로 초기화하는 경우 간단한 문법으로 가능하다.
Default constructors
생성자를 정의하지 않으면 기본 생성자가 제공된다.
기본 생성자는 매개변수가 없고 매개변수가 없는 superclass 의 생성자를 호출한다.
Constructors aren’t inherited
하위 클래스는 상위 클래스의 생성자를 상속받지 않는다.
생성자를 정의하지 않은 하위 클래스는 기본 생성자를 가진다.
Named constructors
다수의 생성자를 구현하거나 명확하게 하고 싶을 때 사용한다.
생성자는 상속이 안된다고 다시 한번 언급하고 있다.
Invoking a non-default superclass constructor
기본적으로 하위 클래스의 생성자는 매개변수가 없는 unnamed 생성자를 호출한다.
상위 클래스의 생성자는 생성자 시작 첫 부분에서 호출된다.
initializer list 를 사용하는 경우 상위 클래스 생성자 전에 실행된다.
실행 순서는 다음과 같다.
- initilizer list
- 매개변수 없는 상위 클래스 생성자
- 매개변수 없는 클래스 생성자
만약 상위 클래스가 매개변수 없는 unnamed 생성자가 없다면 직접 상위 클래스의 생성자를 호출해야 한다.
생성자 인터페이스 뒤 그리고 생성자 블럭 시작 전에 : 을 쓰고 명확한 상위 클래스 생성자를 써줘야 한다.
Initializer list
생성자 블럭 전에 상위 클래스 생성자를 호출하는 것 외에 인스턴스 변수를 초기화할 수 있다.
개발 환경에서 입력값 검증을 위해 assert 를 넣을 수 있다.
Redirecting constructors
가끔 생성자의 목적은 같은 클래스의 다른 생성자를 호출하는 용도로만 쓰이기도 한다.
리다이렉팅 생성자의 본체는 없다.
initilizer list 와 같이 : 후에 써준다.
Constant constructors
클래스가 변하지 않는 객체를 만든다면 이 객체들을 컴파일 타임 상수로 만들 수 있다.
생성자에 const 를 붙이고 모든 변수에 final 을 붙인다.
Factory constructors
생성자를 구현할때 factory 를 함께 사용하면 항상 새 인스턴스를 만들지 않는다.
예를 들면 factory 생성자는 cache 에서 인스턴스를 가져와서 리턴해준다. 또는 하위 타입의 인스턴스를 리턴한다.
이건 마치... objc, swift 생성자에서 self 를 내가 마음대로 만들 수 있는 것 과 유사하다.
Methods
https://dart.dev/guides/language/language-tour#methods
Instance methods
객체의 인스턴스 메소드는 인스턴스 변수에 접근이 가능하다. this 또한 가능하다.
Getters and setters
객체의 프로퍼티를 쓰거나 읽는 접근을 제공하는 특별한 메소드이다.
getters, setters 를 구현하여 추가 properties 를 만들 수 있다.
get, set 키워드를 사용하면 된다.
Abstract methods
인스턴스, getter, setter 메소드들은 구현체 없는 인터페이스를 정의함으로써 추상화 가능하다.
추상 메소드는 추상 클래스에서만 존재할 수 있다.
이건 C++ 이 떠 오른다.
Abstract classes
https://dart.dev/guides/language/language-tour#abstract-classes
abstract 키워드를 사용하여 추상 클래스를 만들 수 있다.
추상 클래스는 인스턴스화 할 수 없다.
추상 클래스는 인터페이스를 정의할 때 유용하다.
종종 일부 구현과 함께 사용된다.
만약 추상 클래스를 인스턴스화 가능하게 하고 싶으면 팩토리 생성자를 사용해라.
추상 클래스는 보통 추상 메소드를 가진다.
Implicit interfaces
https://dart.dev/guides/language/language-tour#implicit-interfaces
클래스에 모든 인터페이스 정보가 담겨있다는 내용인 듯하다.
Extending a class
하위 클래스를 만들기 위해서는 extends 키워드를 사용한다.
상위 클래스는 super 로 참조 가능하다.
Overriding members
하위 클래스는 인스턴스 메소드, getters, setters 를 오버라이드 할 수 있다.
@override 어노테이션을 사용할 수 있다.
Overridable operators
연산자도 오버라이드 가능하다.
만약 == 연산자를 오버라이드 했다면 Object 의 hashCode 도 오버라이드 해야 한다.
noSuchMethod()
만약 존재하지 않는 메소드나 인스턴스 변수를 사용하려고 시도하는 것을 발견하거나 거기에 맞게 반응할 수 있다.
noSuchMethod 를 오버라이드 하면 된다.
Extension methods
존재하는 라이브러리에 기능을 추가하는 것이다.
스위프트에서 extension 과 유사하다.
Enumerated types
enumerations 또는 enums 라고도 불린다.
상수 값들의 고정된 수로 표현되는 클래스의 종류이다.
enum 키워드로 생성한다.
모든 enum 값에는 index getter 가 있다.
예를 들어 첫 번째 값은 0 이고 두 번째 값은 1 이다.
값들의 전체 목록을 얻고 싶으면 values 상수를 사용하면 된다.
enum 은 switch 에서 사용할 수 있다.
만약 모든 값을 처리하지 못하면 경고가 발생한다.
enum 은 다음과 같은 제약이 있다.
- enum 은 하위 클래스, mix in, 구현할 수 없다.
- enum 을 인스턴스화 할 수 없다.
'Programming > Dart & Flutter' 카테고리의 다른 글
Dart 7일 차 - Language Tour (7/7) (0) | 2020.07.26 |
---|---|
Dart 6일 차 - Language Tour (6/7) (0) | 2020.07.25 |
Dart 4일 차 - Language Tour (4/7) (0) | 2020.07.24 |
Dart 3일 차 - Language Tour (3/7) (0) | 2020.07.22 |
Dart 2일 차 - Language Tour (2/7) (0) | 2020.07.21 |