본문 바로가기

Programming/Dart & Flutter

Dart 5일 차 - Language Tour (5/7)

반응형

Classes

이전 내용은 여기에

2020/07/24 - [Programming/Dart] - Dart 4일 차 - Language Tour

 

Dart 4일 차 - Language Tour

하루에 조금씩 바로바로 기록해본지 벌써 4일째 이제 Tour의 반이 넘었다. 이번 주면 Tour는 다 볼려나 Classes https://dart.dev/guides/language/language-tour#classes Dart 는 객체지향 언어이고 class 를 상..

yoonhg84.tistory.com

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 를 사용하는 경우 상위 클래스 생성자 전에 실행된다.

실행 순서는 다음과 같다.

  1. initilizer list
  2. 매개변수 없는 상위 클래스 생성자
  3. 매개변수 없는 클래스 생성자

만약 상위 클래스가 매개변수 없는 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 을 인스턴스화 할 수 없다.

 

 

 

반응형