[TIL] Flutter 9기 사전 캠프 Day 3: 컬렉션 & 비동기 프로그래밍 & nullable & 예외처리 & 열거형 상수 enum & Dart의 네이밍 컨벤션

현서·2025년 11월 7일

[TIL] Flutter 9기

목록 보기
3/65

📝 컬렉션

컬렉션이란?

여러 개의 데이터를 묶어서 다루는 구조

Dart의 대표적인 컬렉션

  • List (리스트)
  • Set (셋)
  • Map (맵)

List

선언 방법

// 제너릭으로 담을 데이터의 타입 명시
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

중복 없는 리스트
중괄호

선언 방법

Set<int> numbers = {1, 2, 3};

특징

  • 순서 없음
  • 중복 불가
numbers.add(2);  // 무시됨

활용

Set<String> uniqueNames = {'Alice', 'Bob'};
uniqueNames.add('Alice');  // 중복이므로 추가되지 않음

Map

키와 값의 쌍

선언 방법

Map<String, int> scores = {
  'Tom': 80,
  'Sue': 90,
};

특징

keyvalue 구조
키는 중복 불가, 값은 중복 가능

접근

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란?

  • 이 함수는 2초 후에 문자열을 리턴
  • 실행은 즉시 시작되지만, 결과는 "미래에" 제공됨.
Future<String> orderCoffee() {
  // 비동기 작업(Future)을 일정 시간 뒤에 실행하는 Dart의 내장 함수
  return Future.delayed(
	  Duration(seconds: 2),       // 2초 동안 기다리고
	  () => "데이터 도착"        // 그 후 이 함수를 실행함. 익명 함수(= 이름 없는 함수)
	);
}
  1. 반환 타입: Future
    지금 바로 String을 주지 않고
    나중에(String을) 줄 거라는 약속을 의미.

  2. Future.delayed
    비동기 작업을 “일정 시간 뒤에” 실행하는 함수.

  3. Duration(seconds: 2)
    2초 기다린다는 뜻.

  4. () => "데이터 도착"
    2초 후 실행되는 함수(익명 함수).
    실행 결과로 "데이터 도착" 문자열을 Future에 넣어 반환함.

    2초 동안 기다렸다가 “데이터 도착”이라는 문자열을 Future 형태로 전달하는 비동기 함수다.

async/await로 기다리기

  • await는 결과가 올 때까지 기다림
  • async를 붙여야 await 사용 가능
void main() async {
  print("요청 시작");
  String data = await fetchData();
  print("응답: $data");
}
// 요청 시작
// (2초 후)
// 응답: 데이터 도착

then()

  • then()은 콜백 방식
  • await는 동기 코드처럼 보이게 만드는 문법
fetchData().then((value) {
  print("then: $value");
});

api 공부할 때 많이 본 async랑 await인데 또 보니 반갑다


📝 nullable

null이란?

아직 값이 없다는 뜻의 특별한 값
Dart에서는 null 안전 모드(null-safety)가 기본이라서, 명시적으로 nullable로 선언하지 않으면 null을 넣을 수 없음

String name = null; // ❌ Dart에서는 이렇게 하면 에러남

기본은 non-nullable (널 허용 안함)

String name = "Hi";
name = null;    // ❌ 에러: null은 허용되지 않음

nullable 선언 방법

  • ? 붙이기
  • String?처럼 ?를 붙이면 "null일 수도 있어" 라는 의미
  • nullable type
String? name = null; // 이제 null을 넣을 수 있음

nullable 변수는 그냥 쓰면 에러

Dart는 "null일 수도 있다면 조심해서 써"라고 강제

String? name = null;
print(name.length); // ❌ 에러! null일 수도 있어서 바로 못 씀

null 처리 방법들

null 체크 먼저 하기

String? name = null;
if (name != null) {
  print(name.length); // ✅ 안전
}

null-aware operator (?.)

String? name = null;
print(name?.length);  // name이 null이면 null 반환, 아니면 length

default 값 주기 (??)

String? name = null;
print(name ?? "이름 없음"); // ??는 앞의 값이 null이면 뒤의 값으로 대체해줌

! (null 아님 단언 연산자)

죽었다 깨어나도 null이 될 수 없는 상황일 때

String? name = getName();
print(name!.length); // "절대 null 아님!"이라고 강제로 처리

String getName(){
	return "LEE";
}

📝 예외처리

예외란?

예외는 프로그램 실행 중에 발생하는 예상하지 못한 문제 상황

  • null인 값을 잘못 다루었을 때
void main() {
  int? value = int.tryParse("가"); 
  print("변환결과");
  print(value!); // ❌ 런타임 에러. 여기서 프로그램 강제종료
}
  • 없는 파일 열기
  • 인터넷 접속하는데 인터넷 연결 안 됨
  • 등등

try-catch 문법

키워드설명
try에러가 날지도 모르는 코드 묶음
catch에러가 발생했을 때 실행할 코드
void main() {
  try {
	  int? value = int.tryParse("가"); 
	  print("변환결과");
	  print(value!);
  } catch (e) {
	  // e: 실제로 발생한 예외 객체
    print("예외 발생: $e");
  }
}

finally 블록

항상 실행되는 블록

  try {
    print("시도 중...");
	  int? value = int.tryParse("가"); 
	  print("변환결과");
	  print(value!);
  } catch (e) {
    print("에러 발생!");
  } finally {
    print("마무리 실행됨");
  }

📝 열거형 상수 enum

enum이란?

이름있는 상수의 집합

  • 정해진 값들 중 하나만 선택할 수 있게 해주는 자료형
  • 요일, 상태, 신호등 색깔처럼 한정된 선택지를 가질 때 유용하게 사용

사용 예시

요일을 받아서 해당하는 요일의 할 일을 출력하는 함수

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 에 포함안된 값 입력 시 에러
}

📝 Dart의 네이밍 컨벤션

컨벤션이란?

  • 협업을 위한 암묵적인 규칙 또는 명시적인 코딩 규칙
  • 개발자 간의 코드 가독성을 높이고, 일관된 스타일을 유지하며, 유지보수를 쉽게 해줌

프로그래밍 언어에서의 작명 규칙 종류

This is sparta
위 문장을 프로그래밍 언어에서 사용하는 규칙에 따라 바꿔보자

카멜 케이스 (camelCase)

낙타 등 연상
형식: 첫 단어는 소문자, 띄어쓰기는 대문자로 구분
공백 없이 단어 연결
예시: thisIsSparta

파스칼 케이스

첫글자가 대문자로 시작하는 카멜케이스
예시: ThisIsSparta

소문자 스네이크 케이스(snake_case)

모든 단어를 소문자로 작성하고, 띄어쓰기를 밑줄 _ 로 구분
예시: this_is_sparta

다트에서의 작명규칙

https://dart.dev/effective-dart/style

파일이름 : 소문자 스네이크 케이스
변수명, 함수명 : 카멜 케이스
클래스명, enum : 파스칼 케이스


공부 소감

알고 있는 개념이 조금씩 조금씩 나와서 반갑다 ㅎㅎ
dart 기본 문법 강의 완료해서 뿌듯 ^^*

0개의 댓글