[FLUTTER] DART 언어 기초과정 - 2 / A Tour of the Dart Language

in #dart6 years ago

플러터란 ? 구글에서 개발한 크로스 플랫폼 앱 개발 프레임워크이다. 언어는 구글이 개발한 Dart 를 사용한다. 안드로이드, iOS, Web, Desktop 을 지원하며 구글의 차기 OS Fuchsia의 메인개발환경이 된다고 한다.

출처 : [https://www.dartlang.org/guides/language/language-tour]

  • 최대한 내용을 줄여 표현했습니다. (너무 길면 이해가 힘들고, 어느정도 수준이 되어야 이해가 되기 때문)
  • 혹시 궁금하시다면 위 링크를 참조 하시면 됩니다.

이전 편


22. 연산자

기존 일반적인것은 생략, 특별한 것만 나열

?? : 널인지 여부 검사 ( if null )
.. : 앞에 변수 생략 ( cascade )
~/ : 나누기 (결과를 정수형으로 반환)

var address = getAddress();
address.setStreet(“Elm”, “13a”);
address.city = “Carthage”;
address.state = “Eurasia”
address.zip(66666, extended: 6666);
One may write

getAddress()
  ..setStreet(“Elm”, “13a”)
  ..city = “Carthage”
  ..state = “Eurasia”
  ..zip(66666, extended: 6666);

?? if null 더 알아보기

.. cascades 더 알아보기

assert(5 ~/ 2 == 2); // 결과가 정수형
// 괄호는 가독성을 증가 시켜줍니다.
if ((n % i == 0) && (d % i == 0)) ...

// 동일하지만 읽기 어렵죠 ...
if (n % i == 0 && d % i == 0) ...

23. 타입 검증 연산자

as : 타입 캐스팅
is : 특정 타입여부 인지 여부가 일치하면 true
is! : 특정 타입여부 인지 여부가 일치하면 false

as 연산자를 사용하여 소스코드를 좀 더 간결하게 처리할 수 있다.

if (emp is Person) {
  // Type check
  emp.firstName = 'Bob';
}
(emp as Person).firstName = 'Bob';

24. 할당 연산자

= 연산자를 사용하여 값을 할당 할 수 있습니다. 할당 할 변수가 null 인 경우에만 할당하려면 ?? = 연산자를 사용하십시오.

  • 연산자 종류
=   –=  /=  %=  >>= ^=
+=  *=  ~/= <<= &=  |=
// a 에 value 를 할당 합니다.
a = value;
// b가 null 인 경우 b에 값을 할당합니다. 그렇지 않으면 b는 동일하게 유지됩니다.
b ??= value;

op 연산자 : a op= b ( 동일 표현 a = a op b )

예시 : a += b ( 동일 표현 a = a + b )

25. 논리 연산자

  • !표현 : 표현식을 반전 (참을 거짓으로, 거짓을 참으로)
  • || : 논리 OR (또는)
  • && : 논리 AND (그리고)
if (!done && (col == 0 || col == 3)) {
  // ...Do something...
}

26. 비트 및 시프트 연산자

  • & AND
  • | OR
  • ^ XOR
  • ~expr 단항 비트 보스 (0은 1로, 1은 0으로 치환됨)
  • << Shift left (왼쪽으로 시프트)
  • >> Shift right (오른쪽으로 시프트)
final value = 0x22;
final bitmask = 0x0f;

assert((value & bitmask) == 0x02); // AND
assert((value & ~bitmask) == 0x20); // AND NOT
assert((value | bitmask) == 0x2f); // OR
assert((value ^ bitmask) == 0x2d); // XOR
assert((value << 4) == 0x220); // Shift left
assert((value >> 4) == 0x02); // Shift right

26. 조건 연산자

  • condition ? expr1 : expr2 : condition 이 참이면 expr1 아니라면 expr2 를 반환한다
var visibility = isPublic ? 'public' : 'private';
  • expr1 ?? expr2 : expr1 이 null 인경우 expr2 반환 아니라면 expr1 반환
String playerName(String name) => name ?? 'Guest';

27. cascade

계단식 (..)을 사용하면 동일한 객체에 대해 일련의 작업을 수행 할 수 있습니다. 함수 호출 외에도 동일한 객체의 필드에 액세스 할 수 있습니다. 이것은 종종 임시 변수를 만드는 단계를 생략하고보다 유동적 인 코드를 작성할 수 있도록합니다.

final addressBook = (AddressBookBuilder()
      ..name = 'jenny'
      ..email = '[email protected]'
      ..phone = (PhoneNumberBuilder()
            ..number = '415-555-0100'
            ..label = 'home')
          .build())
    .build();

28. 기타 연산자

  • () : 함수 호출
  • [] : 목록(LIST) 접근, 목록의 인덱스로 접근
  • . : 맴버 접근, foo.bar 와 같이 특정 속성(foo)의 값(bar)에 접근 할 수 있다.
  • ?. : 선택적 맴버 접근 위와 유사하나 foo?.bar 와 같이 접근하면, 만약 foo 가 null 인경우 오류를 발생하지 않고 null을 반환한다.

더 알아보기

29. 흐름 제어구문

  • if and else
  • for loops
  • while and do-while loops
  • break and continue
  • switch and case
  • assert

30. if ~ else

if (isRaining()) {
  you.bringRainCoat();
} else if (isSnowing()) {
  you.wearJacket();
} else {
  car.putTopDown();
}

31. for loop

  • for, forEach : 특정 수치만큼 반복한다
var callbacks = [];
for (var i = 0; i < 2; i++) {
  callbacks.add(() => print(i));
}
callbacks.forEach((c) => c());
  • for var ~ in : 목록 수 만큼 반복한다
var collection = [0, 1, 2];
for (var x in collection) {
  print(x); // 0 1 2
}

32. while, do ~ while

  • while : while 내부 구문이 참인 동안 반복한다
while (!isDone()) {
  doSomething();
}
  • do ~ while : 일단 한번 실행하고 while 내부 구문이 참인 동안 반복한다
do {
  printLine();
} while (!atEndOfPage());

33. break 와 continue

  • break를 사용하면 반복구문을 빠져나온다
while (true) {
  if (shutDownRequested()) break;
  processIncomingRequests();
}
  • continue를 사용하면 아래 구문은 생략하고 다음 반복을 수행한다
for (int i = 0; i < candidates.length; i++) {
  var candidate = candidates[i];
  if (candidate.yearsExperience < 5) {
    continue;
  }
  candidate.interview();
}

34. Switch ~ case

  • 모든 case에 속하지 않는 경우 default 를 수행한다
var command = 'OPEN';
switch (command) {
  case 'CLOSED':
    executeClosed();
    break;
  case 'PENDING':
    executePending();
    break;
  case 'APPROVED':
    executeApproved();
    break;
  case 'DENIED':
    executeDenied();
    break;
  case 'OPEN':
    executeOpen();
    break;
  default:
    executeUnknown();
}
var command = 'CLOSED';
switch (command) {
  case 'CLOSED':
  case 'NOW_CLOSED':
    // CLOSED 또는 NOW_CLOSED 인 경우 아래 두 구문을 수행 
    executeNowClosed();
    break;
}
  • label을 사용하여 흐름을 제어할 수 있다.
var command = 'CLOSED';
switch (command) {
  case 'CLOSED':
    executeClosed();
    continue nowClosed;
  // nowClosed 라벨로 이동하여 실행을 계속한다

  nowClosed:
  case 'NOW_CLOSED':
    executeNowClosed();
    break;
}

35. Assert

assert 는 개발 모드(development mode)에만 영향을 미치며, 운영코드(production code)에는 영향을 주지 않습니다.

  • 조건이 거짓 인 경우 assert 문을 사용하여 정상 실행을 중단합니다.
// 값이 null이 아님을 확인 
assert(text != null);

// 값이 100 이하 
assert(number < 100);

// https로 시작하는 url 여부 확인 
assert(urlString.startsWith('https'));

36. Exceptions (오류)

예외는 예상치 못한 일이 발생했음을 나타내는 오류입니다. 예외가 포착되지 않으면 예외를 발생시킨 격리가 일시 중단되며 일반적으로 격리 및 해당 프로그램이 종료됩니다.

37. Throw

아래 둘 다 가능하나 개발 품질 향상을 위해서는 Exception 또는 Error 클래스를 구현하여 throw 하는 것을 추천합니다.

throw FormatException('Expected at least 1 section');

throw 'Out of llamas!';

38. Catch

Catch를 하면 예외 예외가 전파되지 않습니다 (예외를 다시 발생시키지 않는 한).

  • 특정 오류타입(OutOfLlamasException)을 정하여 처리 할 수 있습니다.
try {
  breedMoreLlamas();
} on OutOfLlamasException {
  buyMoreLlamas();
}
  • 다양한 타입을 둬서 오류 처리가 가능함.
try {
  breedMoreLlamas();
} on OutOfLlamasException {
  // 특정 오류(OutOfLlamasException)에 따른 처리 
  buyMoreLlamas();
} on Exception catch (e) {
  // exception 타입으로 지정한 오류 발생 시 (위에 선언한 OutOfLlamasException는 제외)
  print('Unknown exception: $e');
} catch (e) {
  // 타입 미지정한 나머지 모든 오류 처리 
  print('Something really unknown: $e');
}
  • 오류에서 e 뿐만 아니라 s (stack trace) 를 사용할 수 있음.
try {
  // ···
} on Exception catch (e) {
  print('Exception details:\n $e');
} catch (e, s) {
  print('Exception details:\n $e');
  print('Stack trace:\n $s');
}
  • rethrow 를 통해 오류를 재 전파 할 수 있습니다.
void misbehave() {
  try {
    dynamic foo = true;
    print(foo++); // 런타임 오류 
  } catch (e) {
    print('misbehave() partially handled ${e.runtimeType}.');
    rethrow; // 오류 재 전파 
  }
}

39. Finally

  • catch 구문이 생략된 경우 오류 발생시 finally 구문이 실행 된 후 오류가 발생됨
try {
  breedMoreLlamas();
} finally {
    // 예외가 발생하더라도 항상 정리하세요
  cleanLlamaStalls();
}
  • catch 구문이 있는 경우 catch 실행 수 finally가 실행 됨
try {
  breedMoreLlamas();
} catch (e) {
  print('Error: $e'); // Handle the exception first.
} finally {
  cleanLlamaStalls(); // Then clean up.
}

맺음말

  • 궁금하신 점은 언제나 댓글로 문의 주시면 성심것 답글 드립니다.

  • 내용이 많아서 자르고 3편으로 이어 집니다.

관련 글 링크

@flutters : 제가 작성한 글 중 fluter 관련 글만 모아서 리스팀 처리

연재글

설치/설정


aaronhong_banner.jpg

Sort:  

..?? 연산자는 정말 유용할 것 같습니다불필요한 코딩을 줄일 수 있을 것 같아요. 원사마님 덕분에 다트를 정말 쉽게 배우고 있습니다.

?? 연산자가 대박인거 같아요

java에서 null point exception 처리가 귀차니즘 유발인데 그런걸 손쉽게 커버 가능한지라 :)

Posted using Partiko Android

Hi @wonsama!

Your post was upvoted by @steem-ua, new Steem dApp, using UserAuthority for algorithmic post curation!
Your UA account score is currently 3.810 which ranks you at #4633 across all Steem accounts.
Your rank has improved 11 places in the last three days (old rank 4644).

In our last Algorithmic Curation Round, consisting of 196 contributions, your post is ranked at #163.

Evaluation of your UA score:
  • You're on the right track, try to gather more followers.
  • The readers like your work!
  • Try to work on user engagement: the more people that interact with you via the comments, the higher your UA score!

Feel free to join our @steem-ua Discord server