플러터란 ? 구글에서 개발한 크로스 플랫폼 앱 개발 프레임워크이다. 언어는 구글이 개발한 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);
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](https://images.hive.blog/768x0/https://cdn.steemitimages.com/DQmaRR79wihMBmrBdiNq1iSes28DRgFzHJqWge8obwwpijv/aaronhong_banner.jpg)
..
와??
연산자는 정말 유용할 것 같습니다불필요한 코딩을 줄일 수 있을 것 같아요. 원사마님 덕분에 다트를 정말 쉽게 배우고 있습니다.?? 연산자가 대박인거 같아요
java에서 null point exception 처리가 귀차니즘 유발인데 그런걸 손쉽게 커버 가능한지라 :)
Posted using Partiko Android
Hi @wonsama!
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).Your post was upvoted by @steem-ua, new Steem dApp, using UserAuthority for algorithmic post curation!
In our last Algorithmic Curation Round, consisting of 196 contributions, your post is ranked at #163.
Evaluation of your UA score:
Feel free to join our @steem-ua Discord server