Google Codelab의 내용을 개인 학습 목적으로 요약 정리한 내용입니다. https://codelabs.developers.google.com/codelabs/from-java-to-dart/
- Dart의 main 메서드는 top level에 존재하며 class 외부에 선언할 수 있다.
class Bicycle {
int cadence;
int speed;
int gear;
}
void main() {
// ...
}- main 메서드에 인자가 필요하면 아래와 같이 정의 가능
void main(List<String> args) {
// ...
}-
Dart에는 public, protected, private 과 같은 접근 제어 키워드가 없으며 기본적으로 public이 적용된다.
-
Dart는 2 space를 기본적인 indent로 사용한다.
- 아래와 같이 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});
}- Dart 2부터 new 키워드는 생략 가능하다.
- 변수가 불변 객체라면 var 대신 final로 선언할 수 있다.
var bike = new Bicycle(2, 0, 1);
// or
var bike = Bicycle(2, 0, 1);- toString을 override하기 위해 클래스 내부에 아래와 같이 추가하면 된다.
@override
String toString() => "toString is overrided";- 심플한 getter 메서드에 대해 아래와 같이 한 줄로 정의할 수 있다.
int get speed => _speed;- codelab 기준으로는 underscore를 변수 이름 앞에 붙여주면 된다고 한다.
class Bicycle {
int cadence;
int _speed = 0; // speed를 read-only로 변경하기 위해 앞에 underscore를 붙인다.
int gear;
Bicycle(this.cadence, this.gear);
}- 하지만 위와 같이 underscore를 붙인 뒤에도 별다른 에러 없이 값을 변경할 수 있었다.
- 관련해서 좀더 확인이 필요함.
- 아래와 같이 Factory method를 정의하여 구현할 수 있다.
abstract class Parent {
String get name;
}
class Child implements Parent {
final String nickName;
Child(this.nickName);
String get name => "$nickName";
}- 일반적인 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);
}