flutter를 해보려고 dart를 빠르게 보기 위해 dart 공식 도큐먼트(https://dart.dev/)에서 문서를 찾다가 Codelab중
Intro to Dart for Java Developers 라는 글을 봤다. 현재 자바 개발자로 일하면서 이 내용을 보고 안들어갈 수가 없었다.
이제 한번 슥 보면서 거기서 봤던 내용 정리를 해보려고 한다.
들어가자마자 가장 먼저 반기는건 아래 코드다.
class Bicycle {
int cadence;
int speed;
int gear;
}
void main() {
}
자바 개발자라면 큰 문제가 없어보이기도 하는데 dart에서는 문제가 있다.
- 데이터 타입을 우리가 흔히 쓰던 int, String 등으로 선언하는 경우 반드시 초기화를 해줘야한다. null이 되면 안된다.(non-nullable)
- dart에서도 app의 진입점은 main()이다. 다른 언어에서와 마찬가지로 argument를 넘기고 싶다면 main(List<String> args>형태로 넘기면 된다.
- dart에는 별도의 접근제어자가 없다.
- 모든 클래스, 함수, 필드 등의 선언은 public을 default로 한다.
- dart에서는 일반적으로 사용하는 4개의 공백을 indent로 하지 않고 2개를 사용한다. 습관성으로 4개로 해도 괜찮다. dart format기능을 호출하면 알아서 정리해준다.
- Effective Dart(https://dart.dev/guides/language/effective-dart/style#do-format-your-code-using-dart-format) 에서는 Dart의 공식적인 whitespace-handling규칙은 dart format을 사용하는 것이라고 했다.
아래 생성자를 보자.
Bicycle(this.cadence, this.speed, this.gear);
자바에서는 용납이 안된다. 생성자의 body가 없다. 근데 dart에서는 된다. 끝에 세미콜론(;)만 찍어주면 된다.
그 이유는 Dart에서는 초기화 리스트(initialize list)라는 기능이 있다. 생성자의 body없이 사용한 위 코드는 아래와 똑같다.
Bicycle(int cadence, int speed, int gear)
: this.cadence = cadence,
this.speed = speed,
this.gear = gear;
콜론(:)을 찍고 초기화를 한다.
이렇게 하면 위에서 non-nullable 이였던 곳의 에러가 사라진다. 왜냐하면 초기화 리스트 기능은 생성자 호출 이전에 동작을 하게 되어 할당을 하기 때문이다.
우리가 익숙한 형태로 다시 바꿔보자.
Bicycle(int cadence, int speed, int gear);
이렇게 하면 에러난다.
//old dart
void main() {
var bike = new Bicycle(2, 0, 1);
print(bike);
}
//new dart
void main() {
var bike = Bicycle(2, 0, 1);
print(bike);
}
dart 2부터는 새로운 객체 생성을 위해 new 키워드를 사용할 필요가 없다. 뜬금없이 var 키워드가 나왔는데 불변객체로 만들고 싶을때 사용할 수 있고 var 대신 final 키워드를 사용할 수 있다.(final bike = Bicycle(2, 0, 1); )
자바에서처럼 toString 오버라이드 해서 하는 방법도 추천한다.
@override
String toString() => 'Bicycle: $speed mph';
위에서 dart는 접근제어자가 없다고 했는데 그래도 private한 필드를 사용하고 싶다면 언더스코어(_)를 변수 이름 앞에 붙이면 된다.
class Bicycle {
int _cadence;
int _speed;
int _gear;
}
/**
중략
**/
대신 이렇게 하면 생성자에서 접근을 못한다. 그래서 외부에서 접근하기 위해 getter 사용법을 알아야한다.
class Bicycle {
int cadence;
int _speed;
int get speed => _speed;
int gear;
}
포맷 : 데이터타입 get 이름 => 접근할 필드 이름
nullable이여도 상관없는 변수는 타입뒤에 ?를 붙여주면 된다.
class Bicycle {
int? cadence;
int _speed;
int get speed => _speed;
int gear;
}
이러면 cadence는 nullable 된거다.
이제 java와 dart코드를 비교해보자.
우선 dart다.
class Bicycle {
int cadence;
int _speed = 0;
int get speed => _speed;
int gear;
Bicycle(this.cadence, this.gear);
void applyBrake(int decrement) {
_speed -= decrement;
}
void speedUp(int increment) {
_speed += increment;
}
@override
String toString() => 'Bicycle: $_speed mph';
}
void main() {
var bike = Bicycle(2, 1);
print(bike);
}
java로 작성한 코드다.
public class Bicycle {
private int cadence;
private int gear;
private int speed;
public Bicycle(int startCadence, int startSpeed, int startGear) {
gear = startGear;
cadence = startCadence;
speed = startSpeed;
}
public int getCadence() {
return cadence;
}
public void setCadence(int newValue) {
cadence = newValue;
}
public int getGear() {
return gear;
}
public void setGear(int newValue) {
gear = newValue;
}
public int getSpeed() {
return speed;
}
public void applyBrake(int decrement) {
speed -= decrement;
}
public void speedUp(int increment) {
speed += increment;
}
}
'dart' 카테고리의 다른 글
노마드코더 dart 강의 끄적끄적 (0) | 2023.01.14 |
---|