Dart 훑어보기 - Type, Function,

하루·2025년 3월 13일
0

공부하면서 가볍게 메모하는 글

Hello world

프로그램의 시작이 main 함수에서 이뤄짐
C나 C++이 생각난다.

void main(List<String> arguments) {
  print(arguments);
}

Type System

Dart는 타입 언어로 다양한 Built in type들을 지원하고, 타입체크 기능과 타입추론 등 타입 사용을 위한 각종 feature를 제공한다.
그와 동시에 타입에서 자유로운 Variable도 제공하고 있는데 할당시에 타입추론을 통해 자동으로 타입이 결정된다.

Control Flow

if else-if else, for...in for while, switch break continue 등 제어 로직은 자바스크립트 문법과 유사하게 제공된다.

Function

파라미터와 반환값의 타입을 지정한 형태의 함수로도 사용가능하고, 자바스크립트와 유사 문법의 Arrow Function도 사용 가능하다.

int fibonacci(int n) {
  if (n == 0 || n == 1) return n;
  return fibonacci(n - 1) + fibonacci(n - 2);
}
...
(name) => name.contains('turn')

함수의 파라미터엔 세 종류가 있는데 Required positional parameters Named ParametersOptional positional parameters 이다
이 중 required positional parameters가 일반적으로 사용하는 함수 파라미터와 같은 개념이고, 그 뒤에 Named ParametersOptional positional parameters가 올 수 있다. 둘 중 어떤 것을 붙여써도 상관없지만 둘 다 붙여쓸 수는 없다.

Required positional parameters

String say(string lastname);

Named parameters

Named Parameter는 {} 로 감싸서 정의 가능하다.
기본적으로 모든 Named parameter가 옵셔널하기 때문에 필수 인자로 하고싶으면 required 예약어를 사용해야한다.

String say({required string firstname});

dart에선 인자에 ?를 붙여 nullable을 표시할 수 있는데, required와 ?의 동시 사용도 가능하다.

// null 값으로 넣을 순 있지만 꼭 입력은 해줘야하는 middlename
String say({required string? middlename});

Optinal positional parameters

옵셔널 파라미터는 []로 감싸서 사용할 수 있다.
옵셔널 파라미터의 값에 defaultValue를 지정하지 않을 경우 필수적으로 nullable ? 선언해줘야 한다.

String say(String lastname, String firstname, [String? suffix]) 

Lexical Scope

자바스크립트와 같이 하위에서 상위의 변수를 참조할 수 있는 스코프를 제공한다.
자바스크립트와 유사하게 클로저 선언도 가능하다.

Tear-off

Function이나 Method 사용 시 인자를 직접 넣어 호출하지 않더라도 상위 환경에서 자동으로 떼어와 삽입해주는 Tear-off 기능이 제공된다.

// bad
charCodes.forEach((code) {
  print(code);
});

// good
charCodes.forEach(print);

Generator

Dart에선 연속된 값(배열같은)의 생성을 위해 두 종류의 generator를 제공한다.

Synchronous generator: Iterable 반환

Iterable<int> countdown(int start) sync* {
  for (var i = start; i > 0; i--) {
    yield i;
  }
}

void main() {
  for (var num in countdown(5)) {
    print(num);
  }
}

Asynchronous generator: Stream 반환

Stream<int> asyncCountdown(int start) async* {
  for (var i = start; i > 0; i--) {
    await Future.delayed(Duration(seconds: 1)); // 1초 대기
    yield i;
  }
}

void main() async {
  await for (var num in asyncCountdown(5)) {
    print(num);
  }
}

External

바깥에서 구현된 함수를 사용할 때 선언용으로 사용하는 예약어

external void someFunc(int i);

Comments

주석 사용법은 자바스크립트와 완전 동일하다.

profile
뭐라도 남는게 있었으면 좋겠다

0개의 댓글

관련 채용 정보