Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
Tags
- scss
- 자바스크립트
- 엡
- JS
- firebase
- Clean Architecture
- java
- 앱심사
- LLM
- lifecycle
- react
- 자바 포맷 출력
- riverpod
- 배포
- Flutter
- 자바 출력 방식
- println
- abap
- DART
- npm
- java 콘솔 출력 차이
- nodejs
- develop
- unity
- 단축키
- printf
- JQ
- java 출력
- UI/UX
- ListView
Archives
- Today
- Total
guricode
Dart 공부 정리 - 타입 / 함수 파라미터 / 동기 비동기 본문
1. Dart의 주요 타입 정리
int 정수 타입 int count = 10;
double 실수 타입 double pi = 3.14;
String 문자열 String name = 'Dart';
bool 참/거짓 bool isOk = true;
List 순서 있는 값의 집합 List<int> nums = [1, 2, 3];
Map key-value 쌍의 집합 Map<String, String> map = {...}
Set 중복 없는 값의 집합 Set<int> s = {1, 2};
dynamic 어떤 타입이든 가능 dynamic x = 1; x = 'hi';
var 타입 자동 추론 변수 var name = 'Kim';
final 변경 불가 변수 (런타임 상수) final a = DateTime.now();
const 컴파일 시점 상수 const b = 123;
자주 쓰는 타입은 꼭 외워두도록 하자.
dart의 타입은 java에 비해 간단한 모습...편하게 만들어~ 라는 느낌
타입 크기 (표준 기준)
int 64비트 (8바이트)
double 64비트 (8바이트)
bool 최소 1바이트 이상
String 2바이트 × 문자 수
List 요소 수에 따라 가변
Map 키/값 수에 따라 가변
Set 요소 수에 따라 가변
dynamic 실제 타입에 따라 다름
특이한 점은 int와 double을 제외하면 대부분 크기가 "가변"이라는 점이다.
생산자 입장에서 보면 타입을 일일이 고려하지 않고 작업할 수 있어 편리하다.
이런 이유로 Dart가 이렇게 설계된 게 아닌가 싶다.
근데 이렇게돼도 db에서는 따로 지정을 해줘야하는것이 아닌가? 그러면 소용이 없지 않을까 싶다..앞단에서는 자유롭게 쓸수 있을것같다
var: 타입을 자동으로 추론하지만 한 번 정해진 타입은 바꿀 수 없다.dynamic: 타입을 자유롭게 바꿀 수 있다.null-safety: 변수에null을 허용하지 않으며, 허용하려면?를 타입 뒤에 붙인다. 예:int? a
2. Dart 함수 파라미터
1) 포지셔널 파라미터
인자를 순서대로 전달하는 방식이다.
void sayHello(String name, int age) {
print("안녕하세요, $name님! 나이는 $age살이군요.");
}
void main() {
sayHello("민수", 20); // 순서 중요!
}
- 인자의 순서가 중요하다.
- 간단한 함수에 적합하다.
2) 네임드 파라미터
함수 호출 시 이름을 명시하여 인자를 전달하는 방식이다.
솔직히 네임드 파라미터가 가독성도 좋고 더 많이 쓰일것같은데.... dart에서도 이 방식을 추천하고 있다.
void registerUser({required String name, required int age}) {
print("회원가입 완료: 이름=$name, 나이=$age");
}
void main() {
registerUser(name: "수지", age: 25); // 순서 상관 없음!
}
- 순서 상관 없이 사용 가능하다...왜냐면 이름을 명시했으니까....
- Dart에서는 네임드 파라미터 방식을 추천한다....
2-1) 네임드 파라미터의 옵셔널
말 그대로 파라미터를 선택적으로 넣을 수 있는 것이다.
포지셔널 파라미터는 required를 사용하지 않으니 사용할수 없을거라고 예상된다....
여기서 필수인건 네임드파라미터인 required로 표시하고 선택적인 파라미터는 required를 넣지 않은 것으로 표현한다.
int add({required int frontValue, required int endValue, int? expansionValue}) {
int sum = frontValue + endValue + (expansionValue ?? 0);
return sum;
}
void main() {
int result = add(frontValue: 3, endValue: 5);
int result2 = add(frontValue: 3, endValue: 5, expansionValue: 3);
print('결과: $result'); // 출력: 결과: 8
print('결과: $result2'); // 출력: 결과: 11
}
? 를 붙여서 null값을 허용하도록 만들었다 (int? expansionValue).
2-2) 병합 연산자 ??
왼쪽의 값이 null일 경우 오른쪽 값을 반환한다.
void main() {
int? expansionValue;
int result = expansionValue ?? 0;
print(result); // 0
expansionValue = 5;
result = expansionValue ?? 0;
print(result); // 5
}
숫자 + 문자열 응용
void add({
required int frontValue,
required int endValue,
String? expansionValue,
}) {
String expansionString = expansionValue ?? '';
int sum = frontValue + endValue + (int.tryParse(expansionString) ?? 0);
print('결과: ${sum}${expansionString}');
}
void main() {
add(frontValue: 3, endValue: 5);
add(frontValue: 3, endValue: 5, expansionValue: '3');
add(frontValue: 3, endValue: 5, expansionValue: 'abc');
add(frontValue: 3, endValue: 5, expansionValue: '');
add(frontValue: 3, endValue: 5, expansionValue: 'xyz');
}
expansionString은 null이면 빈 문자열로 대체int.tryParse()로 숫자 변환 시도, 실패하면 null?? 0을 이용해 null을 0으로 대체- 헷갈린다면 코드 반복해서 읽어보자!!
3. 동기 / 비동기
동기: 입력된 순서대로 실행
void main() {
print('작업 1 시작');
performTask();
print('작업 1 완료');
}
Future performTask() async {
await Future.delayed(Duration(seconds: 2));
print('작업 2 실행');
}
출력:
작업 1 시작
작업 1 완료
작업 2 실행
Future<void> performTask() async→ 비동기 함수이며 값을 반환하지 않음await→ 해당 작업이 끝날 때까지 기다림Future.delayed→ 2초 지연
비동기를 동기처럼 실행하기
void main() async {
print('작업 1 시작');
await performTask();
print('작업 1 완료');
}
Future performTask() async {
await Future.delayed(Duration(seconds: 2));
print('작업 2 실행');
}
출력:
작업 1 시작
작업 2 실행
작업 1 완료
main()에 async를 붙이고 await로 performTask()를 기다리면 순차적으로 실행된다.
글이 너무 길어지니 위젯 트리와 클래스 정리는 다음 글에서 이어서 작성할 예정
'앱 > Flutter&Dart' 카테고리의 다른 글
| 상태관리의 정의와 setState의 한계 (1) | 2025.06.19 |
|---|---|
| Flutter의 기능성 위젯 (1) | 2025.06.18 |
| Stack & Positioned (0) | 2025.06.17 |
| Stateless,Stateful/ view 위젯/레이아웃 (0) | 2025.06.17 |
| [Flutter/Android] Gradle 빌드 오류: Failed to create Jar file (jars-9.lock) 해결 방법 (0) | 2025.06.16 |