티스토리 뷰

Mobile/Dart

[Dart] Dart 기본

춘햄 2022. 6. 26. 00:11

Flutter 공부를 이제 막 시작을 해서, Flutter 프로젝트의 기본 구조를 익히다 보니.. 책에서 정리해주는 간단한 소개만으로는 Dart에 대한 이해가 많이 부족할 거 같아서 차근차근 정리해보려고 한다. 

 

Google 에서 굉장히 밀어주는 언어라고 하니, 제대로 익혀놓는 것이 여러모로 편할 거 같아서.. ㅎㅎ 우선 이번 포스팅에서는 아주 기본적인 코드 샘플과 java와 다른 dart 만의 여러 특징들을 정리하려고 한다.

 

바로 들어가보자.

 

이 포스팅에서 다루지 않는 더 자세한 & 기본적인 부분은 공식 레퍼런스에서 확인할 수 있다.


우선,  Dart 언어가 가지고 있는 몇 가지 특징부터 확인하고 가자.

 

1. 객체지향 언어답게, 변수에 넣을 수 있는 모든 값은 object이며, 모든 객체는 class의 인스턴스이다. 

 

2. Dart는 최상위 함수(main() )뿐만 아니라, 클래스나 객체에 연결된 함수(정적 메서드, 인스턴스 메서드)도 지원한다. 또한 함수 안에 함수를 만들 수 있다.

 

3. java와 다르게, Dart는 public. protected, private 같은 접근 한정자가 없습니다. 식별자 앞에 underscore를 붙여 다른 클래스에서 접근이 불가능한 private로 만들 수 있다. 자세한 내용은 여기에서 확인할 수 있다.


 

이제 아주 기초적인  Code Samples를 확인해보자.

 

1. Hello world

  새로운 언어 공부의 첫 시작은 언제나 hello world! 

void main(List<String> arguments) {
  print('Hello, World!');
}

>>

 Hello, World!

 

 

2. 변수

 

 dart는 각 변수의 type를 엄격하게 검사를 하지만, 대부분의 변수는 var를 사용하여 선언이 가능하다. 

 제네릭 변수로 사용하고 싶다면 dynamic type을 사용할 수 있다.

void main(List<String> arguments) {
  var name = 'Voyager I';
  var year = 1977;
  var antennaDiameter = 3.7;
  var flybyObjects = ['Jupiter', 'Saturn', 'Uranus', 'Neptune'];
  var image = {
    'tags': ['saturn'],
    'url': '//path/to/saturn.jpg'
  };

  dynamic nameD = "dynamic";
  print(nameD);

  nameD = 123;
  print(nameD);
  
}

>>

 dynamic
 123

 

 

3. 조건문과 반복문

 

 java와 거의 비슷한 방식으로 조건문과 반복문을 사용할 수 있다.

void main(List<String> arguments) {
  var year = 2021;
  var flybyObjects = [1, 2, 3];

  if (year >= 2001) {
    print('21st century');
  } else if (year >= 1901) {
    print('20th century');
  }

  for (final object in flybyObjects) {
    print(object);
  }

  for (int month = 1; month <= 12; month++) {
    print(month);
  }

  while (year < 2032) {
    year += 1;
    print(year);
  }

}

>> 생략

 

 

4. functions

 

함수는 아래와 같이 선언하여 사용할 수 있다.

void main(List<String> arguments) {

  int fibonacci(int n) {
    if (n == 0 || n == 1) return n;
    return fibonacci(n - 1) + fibonacci(n - 2);
  }

  var result = fibonacci(20);

  print(result);
  
}

또한, 인자를 1개만 사용하는 함수의 경우는 아래와 같이 람다를 사용할 수도 있다.

void main(List<String> arguments) {
  
  var flybyObjects = ["turn", "turn1", "name"];
  
  flybyObjects.where((name) => name.contains('turn')).forEach(print);
  
}

>> 

 turn
 turn 1

 

 

5. 주석

 

 // 를 활용하여 주석을 작성할 수 있으며, /* comments */ 를 사용하여 여러 줄 주석도 사용할 수 있다.

 

 

6. Null safety

 

 flutter가 2.0으로 업데이트되면서, null로 인해 생기는 예외를 없애기 위해 적용한 개념이다. dart에서 일반적인 방식으로 생성하는 변수는 전부 null 값을 가질 수 없으며, 변수에 할당된 초기값이 없으면 컴파일 과정에서 바로 에러를 뱉는다. 

 

그러나 변수 생성 시에 type 오른쪽에? 를 붙여주면, 해당 변수는 null 값을 갖는 것이 허용된다. 

 

 

7. Classes

 

 아래 예제에서 클래스의 작성과 getter 메서드의 사용, 생성자 및 생성자를 다른 이름으로 명시해주는 방법 또한 확인할 수 있다. 또한 dart의 getter 및 setter 메서드의 작성은 여기에서 더욱 자세하게 확인할 수 있다.

 

import 'package:untitled1/untitled1.dart' as untitled1;

void main(List<String> arguments) {

  var voyager = Spacecraft('Voyager I', DateTime(1977, 9, 5));
  voyager.describe();

  var voyager3 = Spacecraft.unlaunched('Voyager III');
  voyager3.describe();

}


class Spacecraft {
  String name;
  DateTime? launchDate;

  // Read-only non-final property
  int? get launchYear => launchDate?.year;

  // Constructor, with syntactic sugar for assignment to members.
  Spacecraft(this.name, this.launchDate) {
    // Initialization code goes here.
  }

  // Named constructor that forwards to the default one.
  Spacecraft.unlaunched(String name) : this(name, null);

  // Method.
  void describe() {
    print('Spacecraft: $name');
    // Type promotion doesn't work on getters.
    var launchDate = this.launchDate;
    if (launchDate != null) {
      int years = DateTime.now().difference(launchDate).inDays ~/ 365;
      print('Launched: $launchYear ($years years ago)');
    } else {
      print('Unlaunched');
    }
  }
}

 

 

8. enum

 

 dart 또한 다른 언어와 마찬가지로 enum을 활용할 수 있다.

import 'package:untitled1/untitled1.dart' as untitled1;

void main(List<String> arguments) {

  final yourPlanet = Planet.mercury;

  if (!yourPlanet.isGiant) {
    print('Your planet is not a "giant planet".');
  }

}

enum PlanetType { terrestrial, gas, ice }

/// Enum that enumerates the different planets in our solar system
/// and some of their properties.
enum Planet {
  mercury(planetType: PlanetType.terrestrial, moons: 0, hasRings: false),
  venus(planetType: PlanetType.terrestrial, moons: 0, hasRings: false),
  // ···
  uranus(planetType: PlanetType.ice, moons: 27, hasRings: true),
  neptune(planetType: PlanetType.ice, moons: 14, hasRings: true);

  /// A constant generating constructor
  const Planet(
      {required this.planetType, required this.moons, required this.hasRings});

  /// All instance variables are final
  final PlanetType planetType;
  final int moons;
  final bool hasRings;

  /// Enhanced enums support getters and other methods
  bool get isGiant =>
      planetType == PlanetType.gas || planetType == PlanetType.ice;
}

>> Your planet is not a "giant planet".

 

 

9. 상속

 java의 상속과 동일하게 extends 및 super를 사용하는 상속의 개념을 가지고 있다. 그리 어려운 내용은 아니니 간단한 형식만 보자.

class Orbiter extends Spacecraft {
  double altitude;

  Orbiter(super.name, DateTime super.launchDate, this.altitude);
}

 또한,  dart는 따로 인터페이스라는 키워드를 가지고 있지 않는 대신에 모든 클래스를 인터페이스처럼 사용하고 implements 하여 재정의할 수 있다.

 

 

10. 예외 처리

 dart에서의 예외 처리는 아래와 같이 처리할 수 있다.

if (astronauts == 0) {
  throw StateError('No astronauts.');
}
try {
  for (final object in flybyObjects) {
    var description = await File('$object.txt').readAsString();
    print(description);
  }
} on IOException catch (e) {
  print('Could not describe object: $e');
} finally {
  flybyObjects.clear();
}

이번 포스팅에서는 간단한 개념과 아주 기초적인 코드 샘플들을 확인해봤는데, 아직 끝난 것이 아니다. 

 

null safety, 비동기 프로그래밍, 상속과 mixins 등과 같은 개념은 다음 포스팅에서 좀 더 자세하게 다뤄보기로 하겠다.

'Mobile > Dart' 카테고리의 다른 글

[Dart] Null Safety  (0) 2022.06.27
[Dart] 비동기 프로그래밍: future, async, await  (0) 2022.06.27
[Dart] factory  (0) 2022.06.26
[Dart] Extends, Implements, With  (0) 2022.06.26
Comments