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 | 
|---|