다트의 특징과 기본 문법
1. 다트의 특징
1. main() 함수로 시작

2. 어디에서나 변수 선언 및 사용 가능

3. 모든 변수가 객체 형태인 언어

4. 자료형이 엄격한 언어

이러한 문제에서 자유로움!
형 변환이 자유로운 변수를 사용하기 위해서는 dynamic타입을 선언하여 코드를 작성함
5. 제네릭 타입을 이용하여 개발 가능한 언어
제너릭 타입을 이용하면 컴파일 시 데이터 형식을 지정할 수 있기 때문에 에러를 미연에 방지할 수 있음
List<int> 처럼 int형을 넣을 수도 있고,
List<dynamic>처럼 다양한 데이터를 넣을 수도 있음
6. 키워드가 없는 언어
=> public, protected같은 접두어를 이용하지 않는다

7. 다트의 변수, 함수 시작의 특징

8. 널 세이프티(Null safety)를 지원하는 언어


2. 다트의 기본 문법
*다트 프로그램 예
//함수 정의
printInteger(int aNumber){
print('The number is $aNumber'); //콘솔에 출력
}
//main() 함수에서 시작
main(){
var number = 42; //동적 타입 변수 지정
printInteger(number); //함수 호출
}
=> The number is 42 출력
1. 다트의 다양한 자료형


실습

위 예제 코드 작성

숫자 변경하고 싶으면 다음과 같이 작성

소괄호를 aNumber+1 전체에다가 쳐야 함.
소괄호 입력 안하면 다음과 같이 42+1이 그대로 나옴

3. 비동기 처리
다트는 비동기 처리를 지원하는 언어이다
비동기(asynchronous)란 언제 끝날지 모르는 작업을 기다리지 않고 다음 작업을 처리하게 하는 것

만약 비동기를 지원하지 않고 동기로만 처리한다면 어떤 작업이 오래걸릴경우 사용자는 실행이 멈춘것으로 생각하고 프로그램을 종료할 수도 있음
일반적으로 네트워크에서 데이터를 가져오거나 데이터베이스 쓰기, 파일 읽기 등의 작업은 상황에 따라 언제 끝날지 모르기 때문에 비동기로 처리한다.
1. 비동기 처리의 예
void main(){
checkVersion();
print('end process');
}
Future checkVersion() async{
var version = await lookUpVersion();
print(version);
}
int lookUpVersion(){
return 12;
}
일반적인 생각으로는 코드를 보면 main() 함수에서 제일 먼저 checkVersion()함수를 호출했으므로 checkVersion()함수에 있는 lookUpVersion()함수가 호출되어 12를 전달받아 출력한 다음 다시 main()함수로 돌아와 'end process'가 출력될 것 같음.
하지만 실제 출력은
end process
12
왜 이런 결과가 나올까?
=> 먼저 checkVersion()함수를 보면 이름 앞뒤로 Future와 async가 붙어있다
이렇게 하면 checkVersion()함수를 비동기로 만들겠다는 의미!
즉 checkVersion()함수 안에 await가 붙은 함수를 따로 비동기로 처리한 다음 그 결과는 Future클래스에 저장해둘테니
->먼저 checkVersion()함수를 호출한 main()함수의 나머지 코드를 모두 실행하라는 의미('end process'출력)
->그리고 main()함수를 모두 실행하였으면 그때 Future클래스에 저장해 둔 결과를 이용해서 checkVersion()함수의 나머지 코드를 실행한다.
2. then()함수 사용법
비동기 함수가 반환하는 값을 처리하려면 then()함수를 이용한다
void main() async{
await getVersionName().then((value) => {
print(value)
});
print('end process');
}
Future<String> getVersionName() async{
var versionName = await lookUpVersionName();
return versionName;
}
String lookUpVersionName(){
return 'Andriod Q';
}
=> 실행 결과는
Andriod Q
end process
getVersionName()은 비동기함수임. 이처럼 비동기 함수가 데이터를 성공적으로 반환하면 호출하는 쪽에서 then()함수를 이용하여 처리할 수 있음
then이외에 error()함수도 이용할 수 있음
error()함수는 실행 과정에서 오류가 발생했을때 호출되기 때문에 이를 이용해 예외를 처리할 수 있음
3. await 키워드 활용 예
void main(){
printOne();
printTwo();
printThree();
}
void printOne(){
print('One');
}
void printThree(){
print('Three');
}
void printTwo() async{
Future.delayed(Duration(seconds: 1), (){
print('Future!');
});
print('Two');
}
=>실행 결과
One
Two
Three
Future!
Future.delayed() 함수는 Duration기간 동안 기다린 후에 진행하라는 의미
이 코드는 1초 후에 실행하라는 의미
*Duration에는 분(minutes)이나 밀리초(milliseconds)등 다양한 값을 넣을 수 있음
'One'출력 이후에 printTwo()함수에 진입하면 Future를 1초 지연했으므로 async에서 정의한 비동기 함수의 특징에 따라 'Two'가 먼저 출력됨. 그리고 'Three'를 출력하고 'Future!'가 가장 늦게 출력됨.
4. JSON 처리하기
1.JSON의 활용

2. JSON의 정의

JSON 데이터 디코딩 예
import 'dart:convert';
void main(){
var jsonString = '''
[
{"score":40},
{"score":80}
]
''';
var scores = jsonDecode(jsonString);
print(scores is List); //true 출력
var firstScore = scores[0];
print(firstScore is Map); //true 출력
print(firstScore['score']==40); //true 출력
}
이 코드에서는 jsonString 변수에 저장된 데이터가 JSON형태의 문자열이다.
이 데이터를 conver라이브러리에 있는 jsonDecode()함수에 전달한 후 그 결과를 scores변수에 저장
jsonDecode()함수는 JSON형태의 데이터를 dynamic형식의 리스트로 변환, 이를 반환해 줌
scores 변수가 리스트인지는 True/False로 점검할 수 있다.
Scores is List코드는 scores변수가 리스트가 아니면 False를 표시하고 리스트이면 True를 반환
그리고 scores리스트에서 첫번째 값을 firstScore에 저장한다.
이 값은 키와 값이 있는 Map형태이다.
print(firstScore['score']==40)코드는 firstScore데이터의 score키에 해당하는 값이 40이라는 것을 나타낸다.
이처럼 JSONDecode()함수를 이용하면 서버에서 JSON데이터를 받아서 사용할 수 있다
어플리케이션에서 서버로 데이터를 보내는 예
import 'dart:convert';
void main(){
var scores = [
{'score':40},
{'score':80},
{'score': 100, 'overtime': true,
'special_guest': null}
];
var jsonText = jsonEncode(scores);
print(jsonText ==
'[{"score":40}, {"score":80},'
'{"score":100, "overtime":true, ' '"special_guest" :null}]'); //true 출력
}
JSONEncode()코드를 사용할 수 있다.
JSON형태로 변환한 데이터를 서버로 보낼 수 있는데 scores데이터는 배열로 이루어졌고 각 항목은 score값으로 구성되며 마지막 항목에는 overtime과 special_guest값을 추가했다.
**앞의 코드에서는 {"score":40}처럼 큰 따옴표를 사용해 JSON데이터임을 표시했다.
그런데 여기서는 {'score':40}처럼 작은 따옴표를 이용해 변수임을 표시했다.
이 scores데이터를 인자로 JSONEncode()함수를 호출하면 키 값이 큰 따옴표로 묶이고 전체 데이터를 작은 따옴표로 한번 묶어서 JSON형태의 데이터가 완성되게 된다.
JSON처리 실습


5. 응용문제


처음 price출력에는 1000이 나오고
sale함수를 세번 실행한 후에 price를 출력하면
1000*0.9*0.9*0.9=729가 나옴
'앱 프로그래밍 > 플러터(Flutter)' 카테고리의 다른 글
서브페이지와 네트워크 통신 구현하기 (3) | 2025.01.20 |
---|---|
TabBar와 리스트뷰 (1) | 2025.01.17 |
앱 레이아웃 구성하기 (1) | 2025.01.15 |
플러터 기초 위젯 사용하기 (1) | 2025.01.13 |
안드로이드 스튜디오 설치 및 플러터 SDK 설치 (1) | 2025.01.12 |