여러 개의 데이터를 묶어서 다루는 구조
// 제너릭으로 담을 데이터의 타입 명시
List<String> fruits = ['apple', 'banana', 'grape'];
fruits[0] → 'apple'fruits.add('orange'); // 추가
fruits.remove('banana'); // 삭제
fruits.removeAt(index); 해당 index 삭제
fruits.contains('grape'); // true 포함되어 있는지
fruits.length; // 3
for (var fruit in fruits) {
print(fruit);
}
for (int i = 0; i < fruit.length; i++){
print(fruit[i]);
}
중복 없는 리스트
중괄호
Set<int> numbers = {1, 2, 3};
numbers.add(2); // 무시됨
Set<String> uniqueNames = {'Alice', 'Bob'};
uniqueNames.add('Alice'); // 중복이므로 추가되지 않음
키와 값의 쌍
Map<String, int> scores = {
'Tom': 80,
'Sue': 90,
};
key → value 구조
키는 중복 불가, 값은 중복 가능
scores['Tom']; // 80
scores['Sue'] = 95; // 수정
scores['Bob'] = 70; // 추가
scores.forEach((key, value) {
print('$key: $value');
});
| 컬렉션 | 구조 | 중복 | 순서 | 예시 |
|---|---|---|---|---|
| List | 요소 나열 | 허용 | 있음 | [1, 2, 3] |
| Set | 요소 나열 | 불가 | 없음 | {1, 2, 3} |
| Map | 키:값 쌍 | 키는 불가, 값은 가능 | 없음 | {'a': 1, 'b': 2} |
List는 배열 같고, Map은 JSON 구조와 비슷한듯
작업이 완료될 때까지 기다리지 않고, 나중에 결과가 준비되면 그때 처리하는 방식
ex) ☕️ 카페에서 커피 주문한다고 가정
| 방식 | 설명 |
|---|---|
| 동기 | 주문 후 커피 나올 때까지 가만히 기다림 |
| 비동기 | 주문 후 진동벨 받고 → 자리에서 책 읽다가 → 진동벨 울리면 커피 받음 |
플러터는 초당 60~120회 정도 화면을 그림
파일 다운로드, 웹 요청, 파일 저장 및 불러오기 작업 등은 시간이 오래 걸림
이런 걸 기다리기만 하면 앱이 멈춘 것처럼 보이니까, 다른 작업을 먼저 할 수 있도록 비동기를 사용
Future<String> orderCoffee() {
// 비동기 작업(Future)을 일정 시간 뒤에 실행하는 Dart의 내장 함수
return Future.delayed(
Duration(seconds: 2), // 2초 동안 기다리고
() => "데이터 도착" // 그 후 이 함수를 실행함. 익명 함수(= 이름 없는 함수)
);
}
반환 타입: Future
지금 바로 String을 주지 않고
나중에(String을) 줄 거라는 약속을 의미.
Future.delayed
비동기 작업을 “일정 시간 뒤에” 실행하는 함수.
Duration(seconds: 2)
2초 기다린다는 뜻.
() => "데이터 도착"
2초 후 실행되는 함수(익명 함수).
실행 결과로 "데이터 도착" 문자열을 Future에 넣어 반환함.
2초 동안 기다렸다가 “데이터 도착”이라는 문자열을 Future 형태로 전달하는 비동기 함수다.
void main() async {
print("요청 시작");
String data = await fetchData();
print("응답: $data");
}
// 요청 시작
// (2초 후)
// 응답: 데이터 도착
fetchData().then((value) {
print("then: $value");
});

api 공부할 때 많이 본 async랑 await인데 또 보니 반갑다
아직 값이 없다는 뜻의 특별한 값
Dart에서는 null 안전 모드(null-safety)가 기본이라서, 명시적으로 nullable로 선언하지 않으면 null을 넣을 수 없음
String name = null; // ❌ Dart에서는 이렇게 하면 에러남
String name = "Hi";
name = null; // ❌ 에러: null은 허용되지 않음
String? name = null; // 이제 null을 넣을 수 있음
Dart는 "null일 수도 있다면 조심해서 써"라고 강제
String? name = null;
print(name.length); // ❌ 에러! null일 수도 있어서 바로 못 씀
String? name = null;
if (name != null) {
print(name.length); // ✅ 안전
}
String? name = null;
print(name?.length); // name이 null이면 null 반환, 아니면 length
String? name = null;
print(name ?? "이름 없음"); // ??는 앞의 값이 null이면 뒤의 값으로 대체해줌
죽었다 깨어나도 null이 될 수 없는 상황일 때
String? name = getName();
print(name!.length); // "절대 null 아님!"이라고 강제로 처리
String getName(){
return "LEE";
}
예외는 프로그램 실행 중에 발생하는 예상하지 못한 문제 상황
void main() {
int? value = int.tryParse("가");
print("변환결과");
print(value!); // ❌ 런타임 에러. 여기서 프로그램 강제종료
}
| 키워드 | 설명 |
|---|---|
| try | 에러가 날지도 모르는 코드 묶음 |
| catch | 에러가 발생했을 때 실행할 코드 |
void main() {
try {
int? value = int.tryParse("가");
print("변환결과");
print(value!);
} catch (e) {
// e: 실제로 발생한 예외 객체
print("예외 발생: $e");
}
}
항상 실행되는 블록
try {
print("시도 중...");
int? value = int.tryParse("가");
print("변환결과");
print(value!);
} catch (e) {
print("에러 발생!");
} finally {
print("마무리 실행됨");
}
이름있는 상수의 집합
요일을 받아서 해당하는 요일의 할 일을 출력하는 함수
void printTodo(String day) {
if (day == "월요일") {
print('🧹 청소하기');
} else if (day == "화요일") {
print('🛍️ 장보기');
} else if (day == "수요일") {
print('🧼 빨래하기');
} else if (day == "목요일") {
print('🧾 장부 정리');
} else if (day == "금요일") {
print('🧠 공부 마무리');
} else if (day == "토요일") {
print('🍕 친구 만나기');
} else if (day == "일요일") {
print('😴 푹 쉬기!');
}
}
void main(){
printTodo("월요일"); // 청소하기
printTodo("수오일"); // 출력안됨
}
오타 발생하면 오류가 생길 수 있음
enum을 사용한다면
enum Weekday { monday, tuesday, wednesday, thursday, friday, saturday, sunday }
void printTodo(Weekday day) {
if (day == Weekday.monday) {
print('🧹 청소하기');
} else if (day == Weekday.tuesday) {
print('🛍️ 장보기');
} else if (day == Weekday.wednesday) {
print('🧼 빨래하기');
} else if (day == Weekday.thursday) {
print('🧾 장부 정리');
} else if (day == Weekday.friday) {
print('🧠 공부 마무리');
} else if (day == Weekday.saturday) {
print('🍕 친구 만나기');
} else if (day == Weekday.sunday) {
print('😴 푹 쉬기!');
}
}
void main() {
printTodo(Weekday.monday); // 출력: 청소하기
printTodo(Weekday.wednesday); // 출력: 빨래하기
// printTodo(Weekday.www); // enum 에 포함안된 값 입력 시 에러
}
This is sparta
위 문장을 프로그래밍 언어에서 사용하는 규칙에 따라 바꿔보자
낙타 등 연상
형식: 첫 단어는 소문자, 띄어쓰기는 대문자로 구분
공백 없이 단어 연결
예시: thisIsSparta
첫글자가 대문자로 시작하는 카멜케이스
예시: ThisIsSparta
모든 단어를 소문자로 작성하고, 띄어쓰기를 밑줄 _ 로 구분
예시: this_is_sparta
https://dart.dev/effective-dart/style
파일이름 : 소문자 스네이크 케이스
변수명, 함수명 : 카멜 케이스
클래스명, enum : 파스칼 케이스
알고 있는 개념이 조금씩 조금씩 나와서 반갑다 ㅎㅎ
dart 기본 문법 강의 완료해서 뿌듯 ^^*