var callbacks = ['a', 'b', 'c', 'd', 'e'];
for( var x in callbacks){
print("for-in - $x");
}
while and do-while loops
조건을 평가하고 루프를 진행 - while
while (!isDone()) {
doSomething();
}
루프를 실행한 후 평가 - do-while
do {
printLine();
} while (!atEndOfPage());
break and continue
while 문으로 반복 실행 중 특정 조건이 맞다면 while을 종료 - break
var i = 0;
while(true){
if( i >= 3 ) break;
i++;
print("i - $i");
}
for 루프 반복문 종료 - continue
var callbacks = ['a', 'b', 'c', 'd', 'e'];
for (var i = 0; i < callbacks.length; i++) {
if( i >= 3) continue;
print("for - ${callbacks[i]}");
}
switch and case
Dart의 switch 문은 정수, 문자열 또는 컴파일러 시간 상수(?, compile-time constants)를 비교함. 비교된 개체는 모두 동일한 클래스의 인스턴스여야 하며, 클래스가 재정의 되어서는 안됨.
▸ 같은 타입으로 비교하는 소리 같은데...
그리고 case 에서 break 를 사용하는 것을 원칙으로 한다.
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();
}
다음 예제는 오류가 발생되는 예. case 안에 수행하는 내용이 존재하면 오류가 발생됨.
var command = 'OPEN';
switch (command) {
case 'OPEN':
executeOpen();
// ERROR: Missing break
case 'CLOSED':
executeClosed();
break;
}
하지만 비어 있는 경우는 사용할 수 있다.
var command = 'CLOSED';
switch (command) {
case 'CLOSED': // Empty case falls through.
case 'NOW_CLOSED':
// Runs for both CLOSED and NOW_CLOSED.
executeNowClosed();
break;
}
또는 continue 문을 사용하여 진행할 수 있음.
▸ 테스트 해보지 않았으나, executeClosed()를 실행한 후에 nowClosed가 명시된 case 'NOW_CLOSED'를 수행하는 것으로 보임.
var command = 'CLOSED';
switch (command) {
case 'CLOSED':
executeClosed();
continue nowClosed;
// Continues executing at the nowClosed label.
nowClosed:
case 'NOW_CLOSED':
// Runs for both CLOSED and NOW_CLOSED.
executeNowClosed();
break;
}
assert
개발 환경에서 assert 문구를 사용함. assert( condition, optionalMessage);
참/거짓 조건에서 거짓인 경우 해당 부분에서 중단됨.
var text;
assert(text != null);
true 인 경우 그대로 진행됨
var text;
assert(text == null);
try-catch and throw
예외처리에 관한 내용.
throw 를 이용하여 예외상황을 만들 수 있음.
throw 'Out of llamas!';
try-catch 를 이용하여 예외가 발생된 코드를 처리하기 위해 사용. 이것도 다른 언어들과 거의 동일.
try {
breedMoreLlamas();
} on OutOfLlamasException {
// A specific exception
buyMoreLlamas();
} on Exception catch (e) {
// Anything else that is an exception
print('Unknown exception: $e');
} catch (e, s) {
// No specified type, handles all
print('Something really unknown: $e');
}
catch 상황에서 매개 변수를 넣을 수 있는데 수에 따라 다음과 같이 처리 됨.
매개변수 0. 아무것도 없음
매개변수 1. Exception 상세 내용
매개변수 2. StackTrace 객체
rethrow를 사용하면 exception 상황을 처리하고 중지되지 않고 진행되도록 한다.
// 함수 선언
printInteger(int aNumber){
print('숫자: $aNumber'); // 콘솔에 출력
}
// 앱은 여기서부터 실행됨
main(){
var number = 42; // 변수를 선언하고 초기화
printInteger(number); // 함수 호출
}
// 함수 선언
한 줄로 된 코멘트(주석). 다중일 경우 /* */을 사용한다.
int
변수 유형
42
숫자.
print()
콘솔에 출력
'...' or "..."
문자열 리터럴.
2020. 05. 20. 추가 - 홑따옴표 사용 권장. '...'
$aNumber 또는 $variableName 또는 ${expression}
문자열 리터럴 내부에서 변수 또는 표현식을 표현해준다.
main()
앱이 실행이 되는 필수, 최상위 기능
var
변수의 유형을 지정하지 않고 변수를 선언하는 방법
변수 - Variables
Dart에서 사용되는 변수는 명시적일 필요가 없다.
var name = 'Bob';
var를 사용하는 것을 봤을 때 자바스크립트 같은데, 조금씩 섞여 있다 보니...
일단 위와 같이 입력한다면 '=' 기호 오른쪽을 보고 변수의 타입을 자동으로 지정해 준다.
위는 당연히 String 으로 인식된다.
하지만,
가장 중요하게 기억해야 할 부분은 Javascript에서는 한번 할당한 변수 타입을 재할당하여 변경할 수 있었지만, Dart 에서는 재할당이 불가능하다. var로 선언하면서 설정된 변수 타입은 변경할 수 없다.
//import 'package:part2_langsample/part2_langsample.dart' as part2_langsample;
void main(List<String> arguments) {
//print('Hello world: ${part2_langsample.calculate()}!');
var name = 'Bob'; // 자동으로 변수 타입 인식
print('나의 이름은: $name');
//name = 30; // 재할당 테스트
print('나의 이름은: $name');
dynamic name2 = 'dynamic Bob'; //재할당이 가능한 dynamic
print('나의 이름은: $name2');
name2 = 30;
print('나의 이름은: $name2');
Object name3 = 'Object Bob'; //재할당이 가능한 Object
print('나의 이름은: $name3');
name3 = 30;
print('나의 이름은: $name3');
}
위의 코드를 보면 name을 string으로 할당한 후 30으로 number형으로 변경하면 에러가 발생된다.
재할당을 위한 방법으로는 var가 아닌 dynamic또는 Object로 할당하면 가능하다.
명시적으로 변수를 선언하는 것도 가능하다.
String name = 'Bob';
홈페이지에서 설명된 Dart의 타입을 설명하면 다음과 같다.(Runes, Symbols 는 제외)
그리고 Templates 탭을 선택하고 검색어에 "firebase"를 입력한다. 그리고 보이는 "Firebase Notification REST API UMH"를 클릭한다.
Collections에 방금전 선택한 "Firebase Notification REST API UMH"를 확인하고 안에 있는 "Send Notification"를 클릭한다.
Headers에 입력해야 하는 키는 ( {{serverkey}} ) Firebase Console로 들어가 지금 작업 중인 프로젝트로 들어간다. 그리고 "클라우드 메시징" 을 클릭하면 보이는 서버 키가 위에 입력해야 하는 키이다. 길지만 모두 입력해야 하고, 남들에게 공개되지 않도록 보안에 신경써야 한다.
그리고 Body로 이동하면 기본 레이아웃이 있는데 난 테스트를 위해 아래와 같이 입력하였다.
처음에 iOS시작할 때는 앱마다 따로 Push 권한을 주고 푸시 서비스를 위한 인증서를 구성했는데, Keys에서 인증서와 팀 ID, 키 ID로 팀 ID로 개발된 앱은 모두 한 개의 key로 푸시 서비스(APNs)를 이용할 수 있다(제대로 이해한 건지 싶지만... 해보니 그런 것 같더라..).
3rd에서 직접 푸시 서버를 구성해서 사용하는 것도 방법이지만, Google의 Firebase Cloud Messaging(이하 FCM)을 이용하면 안드로이드와 iOS를 따로 구현할 필요 없이 FCM에 메시지를 보내면 푸시 서비스를 사용할 수 있다.
간단하게
https://fcm.googleapis.com/fcm/send
로 header 에 Authorization 키와 body에 아래 형식에 맞게 보내면 "notification" 부분과 "data"가 디바이스로 넘어간다.
3. 여기서 왼쪽 메뉴 중 4번째에 보이는 "Certificates, IDs & Profiles"를 클릭하고, 이동된 페이지에서 "Keys" 메뉴를 선택한다.
4. "Keys" 옆에 있는 + 버튼을 클릭하면 아래와 같이 보인다. 참고로 사전에 만들어 놓은 키가 있어서 MapKit JS, MusicKit, Sign in with Apple 등이 비활성화되어 있다. 적당한 이름을 입력하고 "Apple Push Notifications service(APNs)"를 체크하고 "Continue"를 누른다.
5. 특별히 이상한 점이 없다면 이대로 "Register"를 클릭한다.
★ 중요: 다운로드 가능한 키는 여기서 딱 한 번만 가능하다. 이후엔 다운로드되지 않으니, 다운로드한 Key는 잘 보관하길 바란다.