Skip to content

Instantly share code, notes, and snippets.

@BurningDroid
Last active March 11, 2019 15:08
Show Gist options
  • Select an option

  • Save BurningDroid/e819d4acdef0a0053d332a4b0a26fed3 to your computer and use it in GitHub Desktop.

Select an option

Save BurningDroid/e819d4acdef0a0053d332a4b0a26fed3 to your computer and use it in GitHub Desktop.
Dart

Google Codelab의 내용을 개인 학습 목적으로 요약 정리한 내용입니다. https://codelabs.developers.google.com/codelabs/from-java-to-dart/

  1. Dart의 main 메서드는 top level에 존재하며 class 외부에 선언할 수 있다.
class Bicycle {
  int cadence;
  int speed;
  int gear;
}

void main() {
  // ...
}
  1. main 메서드에 인자가 필요하면 아래와 같이 정의 가능
void main(List<String> args) {
  // ...
}
  1. Dart에는 public, protected, private 과 같은 접근 제어 키워드가 없으며 기본적으로 public이 적용된다.

  2. Dart는 2 space를 기본적인 indent로 사용한다.

Class

1. 클래스 생성자

  • 아래와 같이 Body가 없는 생성자를 정의할 수 있다.
class Bicycle {
  int cadence;
  int speed;
  int gear;
  
  Bicycle(this.cadence, this.speed, this.gear); // 맨 마지막에 세미콜론을 빠뜨리면 안된다.
}
  • 축약된 생성자 문법을 지원하기 위해 생성자 파라미터 앞에 this가 사용되었다.
  • 위 코드는 아래 코드와 동일하다.
class Bicycle {
  int cadence;
  int speed;
  int gear;
  
  Bicycle(int cadence, int speed, int gear) {
    this.cadence = cadence;
    this.speed = speed;
    this.gear = gear;
  }
}
  • 생성자는 아래와 같이 default 값을 가질 수 있다.
class Bicycle {
  int cadence;
  int speed;
  int gear;
  
  Bicycle({this.cadence = 0, this.speed = 0, this.gear = 1});
}

2. 클래스 객체화

  • Dart 2부터 new 키워드는 생략 가능하다.
  • 변수가 불변 객체라면 var 대신 final로 선언할 수 있다.
var bike = new Bicycle(2, 0, 1);

// or

var bike = Bicycle(2, 0, 1);

3. Override

  • toString을 override하기 위해 클래스 내부에 아래와 같이 추가하면 된다.
@override
String toString() => "toString is overrided";

4. Getter 메서드

  • 심플한 getter 메서드에 대해 아래와 같이 한 줄로 정의할 수 있다.
int get speed => _speed;

5. private 멤버 변수 선언

  • codelab 기준으로는 underscore를 변수 이름 앞에 붙여주면 된다고 한다.
class Bicycle {
  int cadence;
  int _speed = 0; // speed를 read-only로 변경하기 위해 앞에 underscore를 붙인다.
  int gear;
  
  Bicycle(this.cadence, this.gear);
}
  • 하지만 위와 같이 underscore를 붙인 뒤에도 별다른 에러 없이 값을 변경할 수 있었다.
    • 관련해서 좀더 확인이 필요함.

6. abstract class

  • 아래와 같이 Factory method를 정의하여 구현할 수 있다.
abstract class Parent {
  String get name;
}

class Child implements Parent {
  final String nickName;
  
  Child(this.nickName);
  
  String get name => "$nickName";
}

7. Factory Pattern

  • 일반적인 Factory Pattern 예제:
abstract class Child {
  String get name;
}

class Boy implements Child {
  final String nickName;
  
  Boy(this.nickName);
  
  String get name => "$nickName";
}

class Girl implements Child {
  final String nickName;
  
  Girl(this.nickName);
  
  String get name => "$nickName";
}

Child childFactory(String gender) {
  if (gender == 'b') return Boy("boy");
  if (gender == 'g') return Girl("girl");
  throw 'Can\'t create $gender.';
}

main() {
  var b = childFactory('b');
  var g = childFactory('g');
  print(b.name);
  print(g.name);
}
  • Dart는 언어 수준에서 Factory Pattern을 지원해준다. 위 코드는 아래와 같이 표현될 수 있다.
abstract class Child {
  // Flutter에는 factory 라고 하는 키워드가 존재하여 Factory Pattern을 언어적으로 지원한다.
  factory Child(String gender) {
    // 앞선 코드의 factory method의 내용을 이곳으로 옮겨준다.
    if (gender == 'b') return Boy("boy");
    if (gender == 'g') return Girl("girl");
    throw 'Can\'t create $gender.';
  }

  String get name;
}

class Boy implements Child {
  final String nickName;

  Boy(this.nickName);

  String get name => "$nickName";
}

class Girl implements Child {
  final String nickName;

  Girl(this.nickName);

  String get name => "$nickName";
}

main() {
  // Factory method가 아닌 생성자를 직접 호출
  var b = Child('b');
  var g = Child('g');
  print(b.name);
  print(g.name);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment