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

플러터란 ? 구글에서 개발한 크로스 플랫폼 앱 개발 프레임워크이다. 언어는 구글이 개발한 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 = 'jenny@example.com'
      ..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

H2
H3
H4
3 columns
2 columns
1 column
Join the conversation now
Logo
Center