[TIL] Flutter 9기 Day 6 앱 배포하기 & 변수 & 데이터 타입 & 연산자 & 컬렉션 & 열거형

현서·2025년 12월 1일

[TIL] Flutter 9기

목록 보기
18/65
post-thumbnail

📝 앱 배포하기

✏️ 앱 이름 바꾸기

플러터에서 앱 이름은 만들었던 프로젝트의 이름을 기본 앱 이름으로 만들어줘서 바꿔줘야 함

안드로이드

android/app/src/main/AndroidManifest.xml
AndroidManifest 를 수정해준 뒤 안드로이드 에뮬레이터에서 반드시 앱 삭제 후 재설치

안드로이드 앱의 핵심 설정 파일로, 앱이 어떻게 동작할지를 Android 시스템에 알리는 데 사용. 간단히 말해, 앱의 구조, 권한, 컴포넌트 등을 선언하는 문서

android label

iod

ios/Runner/Info.plist

CFDisplayBundleDisplayName
밑에 key 값 수정

✏️ 앱 아이콘 바꾸기

다양한 해상도와 디바이스 환경에서 앱 아이콘이 선명하게 보이도록 하기 위해서 각각 사이즈에 맞는 아이콘 만들어줘야함

플랫폼용도 / 위치크기 (px)비고
Androidmipmap-mdpi48×48기본 해상도 (160 dpi)
Androidmipmap-hdpi72×72
Androidmipmap-xhdpi96×96초고해상도 (320 dpi)
Androidmipmap-xxhdpi144×144초초고해상도 (480 dpi)
Androidmipmap-xxxhdpi192×192초초초고해상도 (640 dpi)
AndroidPlay Store 아이콘512×512앱스토어 제출용 (투명 배경 금지)
AndroidAdaptive 아이콘 (foreground/background)108×108 (권장)Android 8.0 이상, 벡터 사용 권장
iOSNotification (20pt @1x, @2x, @3x)20×20, 40×40, 60×60알림용
iOSSettings (29pt @1x, @2x, @3x)29×29, 58×58, 87×87설정 아이콘
iOSSpotlight (40pt @2x, @3x)80×80, 120×120 Spotlight검색용
iOS앱 아이콘 (60pt @2x, @3x)120×120, 180×180홈화면 기본 아이콘
iOSiPad 아이콘 (76pt @1x, @2x)76×76, 152×152iPad 홈화면
iOSiPad Pro 아이콘 (83.5pt @2x)167×167iPad Pro 전용
iOSApp Store 아이콘1024×1024제출용, 배경 없음 / 정사각형 필수

flutter_launcher_icons

512x512 사이즈의 아이콘만 프로젝트에 넣고 패키지 명령어 실행만 하면
→ 변환 후 프로젝트 내 파일 복사까지 다 해줘요!

사용법

  1. 512x512 사이즈 아이콘 만들기
  2. 아이콘 다운받은 후 프로젝트에 복사
  3. flutter_launcher_icons 패키지 추가
    -d 옵션 : --dev의 줄임말로, 해당 패키지를 개발 중에만 사용하고 실제 앱에서는 포함되지 않도록 설정
    추가하묜 dev dependencies
flutter pub add -d flutter_launcher_icons
  1. 구성파일 만들어주기
    pubspec.yaml 파일 가장 하단에 아래 내용 추가
flutter_launcher_icons:
  android: true
  ios: true
  image_path: "logo.png"
  1. 명령어 실행
dart run flutter_launcher_icons

✏️ 앱식별자

플레이스토어(구글), 앱스토어(애플)에서 각각 앱들은 고유한 파일이름 같은게 필요
Android 에서는 패키지명, iOS에서는 Bundle ID(Bundle Identifier)

항목Android (패키지명)iOS (번들 ID)
명칭Package NameBundle Identifier
형식com.example.my_appcom.example.myApp
스타일스네이크 케이스 (소문자, 언더스코어 _)카멜 케이스 (대소문자 혼용)
구조도메인 거꾸로 + 앱 이름도메인 거꾸로 + 앱 이름

도메인을 거꾸로 쓴다는 의미

보통 웹사이트 주소(도메인): www.sparta.com

이걸 앱 식별자에 적용할 때는 도메인을 거꾸로 씀: com.sparta
여기에 앱 이름을 붙이면:
Android: com.sparta.todo_app
iOS: com.sparta.todoApp

변경방법

Android

  1. build.gradle.kts 수정
  2. 폴더구조 수정
  3. MainActivity.kt 수정

iOS

XCode 에서 Bundle Identifier 수정

번거로운데..?

쉽게 할 수 있는 패키지가 있음

  1. 패키지추가
    flutter pub add -d change_app_package_name
  2. 패키지 명령어 실행
    Android는 스테이크케이스, iOS는 카멜케이스를 사용하기 때문에 각각 설정
    Android : dart run change_app_package_name:main com.sparta.todo_app --android
    iOS : dart run change_app_package_name:main com.sparta.todoApp --ios

✏️ Firebase 구성 최신화

왜 할까?

Firebase 웹 콘솔에는 Android, iOS 각 식별자 별로 앱이 등록
앱 식별자가 바뀌었으니 Firebase 에도 등록해주어야하는데 등록 후 구성파일도 최신화 해주어야 함

최신화하기

  1. flutterfire configure 실행
  2. 기존 구성 사용할건지 물어보는 물음 : n 입력
  3. 프로젝트 선택
  4. 사용할 플랫폼 선택 (ios, android 선택)
  5. 기존 구성파일에 덮어씌기 할건지? y 입력
  6. 기존 SHA 인증서 지문 새로운 Android 앱에 등록 - 구글 로그인
  7. iOS/Runner/Info.plist 수정해주기
    GoogleService-info.plist CLIENT_ID REVERSED_CLIENT_ID
    어떤앱에서 구글로그인 요청하고 로그인 이후 어떤앱으로 돌아가는지

Release 모드

  • 빌드(Build): 개발자가 작성한 코드와 리소스를 기계(사용자 기기)가 실행 가능한 형태로 변환하는 과정

Debug 모드 vs Release 모드

디버그 모드

  • 우리가 개발할 때 실행하면 기본적으로 디버그모드로 빌드됨
  • 로그 출력
  • Hot reload 지원 (중간언어 거침. 바로 01 로 변환 X)
  • 최적화 비활성화 → 느림

릴리즈 모드

  • 디버깅 정보 제거 (로그 출력)
  • Hot reload 제거
  • 코드 최적화 적용
  • 성능 향상 및 파일 크기 축소 → 사용자에게 배포 시에는 반드시 Release 모드로 빌드

APK vs AppBundle

APK (Android Package)

  • 단일 .apk 파일 생성
  • 모든 기기 리소스를 포함 (앱 용량 큼)
  • 테스트 및 내부 배포에 적합
  • 직접 설치 가능

App Bundle (AAB)

  • .aab 파일 생성
  • Google Play가 기기에 맞게 APK를 생성해 배포
  • 최적화된 크기
  • 2021년 이후 Play Store 공식 권장 포맷
  • Play에 업로드 할 땐 반드시 aab 로 빌드

여기까지만 듣고 dart 기초 강의부터 다시 듣기로 했다


📍 Dart SDK

Software Development Kit

Dart 코드를 작성 하고,
빌드 (Build) 하고,
디버깅 (Debugging) 하고,
테스트 (Test) 할 때 필요한 모든 도구를 제공

설치 방법 공식 문서

✏️ dart sdk 버전

Stable, Beta, Dev 세 가지 버전이 존재

Stable 버전

3개월마다 업데이트되는 안정적인 배포 버전이며, x.y.z의 숫자 형태로 표시되고, 대부분의 개발에서 추천

Beta 버전

한 달에 한 번 배포되며, 새로운 기능을 Stable에 넣기 전 미리 시험해보는 단계라서 안정적이지 않다, 버전 표기는 x.y.z+a.b beta 형태

Dev 버전

2주마다 배포되고 최신 미검증 기능들이 포함돼서 안정적이지 않으나, 기능 테스트 목적이라면 사용할 수 있다, 버전은 x.y.z+a.b dev처럼 표기된다.


✏️ Dart pad

Dart Pad

웹 브라우저에서 Dart 코드를 작성하고, 바로 실행할 수 있는 온라인 코드 편집기
따로 개발 환경을 세팅하지 않아도 사용 가능하다는 장점이 있다

📍 변수

✏️ 변수의 개념

변수는 데이터를 저장하는 공간 (데이터를 담는 상자)
변수는 컴퓨터의 메모리 공간 어딘가에 데이터를 저장, 필요할 때 변수 이름을 통해 해당 데이터를 꺼내 씀

⭕️ 반드시 이름 붙이기
❌ 중복 이름 -> 오류 발생

✏️ 변수 선언

프로그램 실행 중에 값을 변경할 수 있는 변수

  • 타입 변수 이름 =
int age = 30;
String name = 'Bob';
bool isStudent = true;
  • var 변수 이름 = ;
var name = 'Bob';

-> 타입 추론 변수

프로그램 실행 중에 값을 변경할 수 없는 변수

  • final 타입 변수 이름 = ;
final firstCurrentTime = DateTime.now(); // 타입 명시하지 않은 경우
final DateTime secondCurrentTime = DateTime.now(); // 타입 명시한 경우
  • const 변수 이름 = ;
const pi = 3.14159; // 타입 명시하지 않은 경우
const int age = 30; // 타입 명시한 경우
구분finalconst
초기화 시점런타임(실행 중)컴파일 타임(빌드 시)
값 변경 가능 여부변경 불가변경 불가
값 결정 시점실행하면서 값이 정해져도 됨실행 전부터 값이 100% 확정되어 있어야 함
대표 예시현재 시간(DateTime.now), API로 받아오는 값원주율, 앱 전체에서 고정된 문자열/숫자
메모리 특성매번 인스턴스 생성 가능동일한 const 객체는 앱 전체에서 재사용됨(캐싱)

late

항목내용예시
의미나중에 초기화할 변수를 미리 선언할 때 사용late int a;
초기화 시점선언 시 바로 초기화하지 않고, 사용 전에 값을 할당a = 10;
용도초기값이 바로 정해지지 않거나, 나중에 할당해야 하는 경우클래스 멤버 변수, 계산 후 값 할당 등
주의점초기화 전에 사용하면 런타임 에러 발생print(a); // 초기화 전이면 오류

late를 쓰면 null을 허용하지 않으면서 초기화를 늦출 수 있음
late final과 같이 쓰면, 한 번만 나중에 초기화 가능


📍 데이터 타입

✏️ 숫자형 (Numbers)

int

소수점 없는 숫자만 저장
메모리적으로 double보다 단순

double

소수점 있는 숫자 저장
정수를 넣으면 자동으로 1 → 1.0처럼 변환
부동소수점 연산 특성 때문에 아주 큰 숫자나 아주 작은 소수에서는 오차가 생길 수 있음

num

int + double을 모두 담을 수 있음
필요할 때 자동으로 double로 변환될 수 있음
→ ex. num x = 1; x += 2.5; // double로 바뀜
int나 double로 타입을 고정하기 애매한 값에 사용

정리

타입의미특징예시
int정수 타입(소수점 없음)음수·양수 모두 가능 / 소수 불가int a = 1;
int b = -5;
double실수 타입(소수점 있음)정수를 넣어도 자동으로 .0 붙음double a = 1.5;
double b = 0.1234;
double z = 1; // 1.0
num숫자 전체(int + double)int, double 둘 다 저장 가능 / 연산 시 타입이 변할 수도 있음num a = 1;
a += 2.5; // 3.5

✏️ 문자형 (Strings)

변수 그대로 넣고 싶을 때: $name
함수 호출하거나 계산이 필요할 때: ${name.toUpperCase()}

비교

== 으로 내용이 같으면 true
→ 객체 비교가 아니라 “값” 비교

여러 줄 문자열

HTML 텍스트, 긴 설명, JSON 같은 거 그대로 넣기 좋음
개행(줄바꿈)도 그대로 유지됨

정리

항목내용예시
타입StringString a = 'hello';
따옴표작은따옴표 ' ' / 큰따옴표 " " 모두 가능String b = "bye";
문자열 보간(String interpolation)변수: $변수 / 표현식: ${표현식}'Hello, $name'
'Hi, ${name.toUpperCase()}'
비교== 으로 문자열 동일 비교 가능'a' == 'a'
문자열 합치기+ 로 연결'Hello ' + 'World'
대소문자 변환toUpperCase() / toLowerCase()name.toUpperCase()
여러 줄 문자열''' ... ''' 또는 """ ... """여러 줄 텍스트 작성 가능

✏️ 불리언형 (Booleans)

항목내용예시
타입boolbool isLogin = true;
역할참/거짓 판단에 사용조건문, 반복문에서 주로 사용
값 종류true, falsebool isEmpty = false;
사용 예조건 체크if (isLogin) { ... }

✏️ null

항목내용예시
의미값이 “없음”을 표현null
Nullable 변수타입 뒤에 ? 붙임int? b = null;
Non-nullable 변수? 없음 → null 불가int a = 3;
초기값Nullable 변수는 초기값이 없으면 자동으로 nullString? name; // null
주의점null 상태에서 사용하면 오류 발생 가능 → 최소한으로 사용 권장name!.length 같은 null 강제 사용은 위험

📍 연산자

✏️ 산술 연산자

연산자의미설명예시
+덧셈두 값을 더함2 + 3 → 5
-뺄셈앞의 값에서 뒤의 값을 뺌3 - 2 → 1
*곱셈두 값을 곱함2 * 3 → 6
/나눗셈결과를 double로 반환5 / 2 → 2.5
~/나눈 결과의 정수 부분만 반환5 ~/ 2 → 2
%나머지나눗셈 후 남는 나머지 반환6 % 4 → 2

✏️ 비교 연산자

연산자의미반환값 조건예시
==같다값이 같으면 true4 == 4 → true
!=다르다값이 다르면 true2 != 4 → true
>, <초과, 미만왼쪽, 오른쪽 값이 더 크면 true4 > 2 → true
>=, <=이상, 이하왼쪽, 오른쪽 값이 크거나 같으면 true3 >= 3 → true

✏️ 타입 체크 연산자

연산자역할설명예시
as타입 변환형변환이 가능할 때만 사용a as double
is타입 확인해당 타입이면 truea is int
is!타입 부정 확인해당 타입이 아니면 truea is! int

✏️ 대입 연산자

연산자의미설명
=기본 대입오른쪽 값을 왼쪽 변수에 넣음
??=null 일 때만 대입왼쪽이 null이면 오른쪽 값 대입
+=더한 후 대입a = a + b와 동일
-=뺀 후 대입a = a - b와 동일
*=곱한 후 대입a = a * b와 동일
/=나눈 후 대입a = a / b와 동일
~/=나눈 정수 결과 대입a = a ~/ b와 동일
%=나머지를 대입a = a % b와 동일

✏️ 논리 연산자

! (NOT)

참/거짓을 반전
true → false, false → true

|| (OR)

둘 중 하나라도 true면 true
둘 다 false일 때만 false

&& (AND)

둘 다 true일 때만 true
하나라도 false면 false


📍 조건문

✏️ if / else if / else

if

조건이 true일 때만 실행
조건은 반드시 true/false 로 판별 가능해야 함

int a = -1;
if (a < 0) {
  print('a 는 음수입니다.');
}

else if

앞의 if 조건이 false일 때 다음 조건을 검사
여러 조건을 순서대로 체크할 때 사용

int score = 75;

if (score >= 90) {
  print('A');
} else if (score >= 80) {
  print('B');
} else if (score >= 70) {
  print('C');
}

else

위 조건들이 모두 false일 때 실행
조건 없음

int score = 50;

if (score >= 90) {
  print('A');
} else {
  print('점수가 낮아요');
}

✏️ switch

하나의 값에 대해 가능한 경우들을 케이스별로 나열해야 할 때
값 비교가 많아지면 if문보다 가독성 좋음

형태

switch () {
  case1:
    ...
    break;
  case2:
    ...
    break;
  default:
    ...
}

예시

int dayOfWeek = 1;

switch (dayOfWeek) {
  case 1:
    print('월요일');
    break;
  case 2:
    print('화요일');
    break;
  case 3:
    print('수요일');
    break;
  default:
    print('유효하지 않은 숫자');
}

✏️ 삼항 연산자

형태

조건 ?1 :2

조건이 true → 값1
조건이 false → 값2

✏️ null 병합 연산자 (??)

형태

표현식1 ?? 표현식2

표현식1이 null이 아니면 → 표현식1
표현식1이 null이면 → 표현식2

예시

int? a = null;
print(a ?? 2); // 2

int b = 3;
print(b ?? 2); // 3

📍 반복문

반복문은 같은 코드를 여러 번 반복해서 실행할 때 사용
같은 코드를 여러 번 쓰는 대신 반복문을 사용하면 효율적이고 코드가 깔끔해짐

✏️ for문

반복 횟수가 명확할 때
for (초기화식; 조건식; 증감식) { … }

초기화식에서 변수를 선언, 조건식이 true이면 코드 블록 실행
증감식 실행 후 다시 조건식 검사, 조건식이 false면 반복 종료

for (var i = 0; i < 5; i++) {
  print(i); // 0 1 2 3 4
}

초기화식 변수는 반복문 안에서 사용 가능. 상수(final)로 선언하면 안 됨

✏️ while문

반복 횟수가 명확하지 않고 조건에 따라 반복해야 할 때.
while (조건식) { … }

조건식 검사, 조건이 true이면 코드 블록 실행, 조건이 false이면 반복 종료

int count = 1;
while (count <= 5) {
  print(count);
  count += 1;
}

✏️ do-while문

코드 블록을 최소 1회는 실행하고 싶을 때
do {// 실행 코드} while (조건식);

먼저 코드 블록 1회 실행, 조건식이 true이면 반복 계속, 조건식이 false이면 반복 종료

int count = 6;
do {
  print(count); // 6
  count++;
} while (count <= 5);

조건식이 false여도 최소 1회는 실행됨

✏️ for-in문

리스트나 집합 같은 컬렉션(List, Set, ㅇㅇMap) 요소를 순회할 때
for (var item in 컬렉션) { … }
컬렉션 요소를 순서대로 변수에 대입하며 반복

List<String> fruits = ['사과', '바나나', '귤'];
for (var fruit in fruits) {
  print(fruit);
}

✏️ 반복문 관련 키워드

break

반복문을 즉시 종료

for (var i = 1; i <= 5; i++) {
  if (i == 3) break;
  print(i); // 1 2
}

continue

이번 반복만 건너뛰고 다음 반복 진행

for (var i = 1; i <= 5; i++) {
  if (i == 3) continue;
  print(i); // 1 2 4 5
}

📍 컬렉션

여러 개의 값을 묶어서 효율적으로 관리할 수 있는 자료형

✏️ List

List란?

순서가 있는 값들의 묶음 (배열)

  • 선언 방법
List<타입> 변수명 = [요소1, 요소2, ...];
  • 예시
List<int> numbers = [1, 2, 3, 4, 5];
  • 빈 list 만들기
List<int> numbers = [];
var names = <String>[];
  • var, final, const 사용
    요소가 변할 수 있으면 var
    요소가 변하지 않으면 final 또는 const
var numbers = [1, 2, 3];       // 변경 가능
final names = ['Alice', 'Bob']; // 변경 불가

List의 특징

  • 같은 타입만 가능
List<String> fruits = ['사과', '오렌지', 8]; // ❌ 오류
  • 타입을 지정하지 않으면 혼합 가능
const fruits = ['사과', '오렌지', 8];
print(fruits.runtimeType); // List<Object>
  • Index로 접근: 첫 번째 요소의 Index는 0
var numbers = [1, 2, 3];
print(numbers[0]); // 1
numbers[0] = 5;
print(numbers[0]); // 5
  • length: 요소 개수
print(numbers.length); // 3
  • isEmpty / isNotEmpty: 리스트가 비었는지 여부
print(numbers.isEmpty);    // false
print(numbers.isNotEmpty); // true
  • indexOf(): 특정 요소의 Index 찾기 (없으면 -1)
print(numbers.indexOf(2)); // 1
print(numbers.indexOf(9)); // -1

List 요소 추가

  • add(): 요소 하나 추가
  • addAll(): 여러 요소 추가
var fruits = ['사과', '오렌지'];
fruits.add('바나나');                 // ['사과', '오렌지', '바나나']
fruits.addAll(['포도', '귤']);         // ['사과', '오렌지', '바나나', '포도', '귤']

List 요소 삭제

  • remove(): 값으로 삭제
  • removeAt(): Index로 삭제
  • clear(): 모든 요소 삭제
fruits.remove('오렌지');   // ['사과', '바나나', '포도', '귤']
fruits.removeAt(0);        // ['바나나', '포도', '귤']
fruits.clear();             // []

✏️ Set

Set이란?

순서가 없고 중복되지 않은 값들의 묶음

  • 선언 방법
Set<타입> 변수명 = {요소1, 요소2, ...};
  • 예시
Set<int> numbers = {1, 2, 3, 4, 5};
  • 빈 Set 만들기
Set<int> numbers = {};
var names = <String>{};
  • var, final, const 사용
    요소가 변할 수 있으면 var
    요소가 변하지 않으면 final 또는 const
var numbers = {1, 2, 3};       // 변경 가능
final names = {'Alice', 'Bob'}; // 변경 불가
  • 주의
var names = {}; // Map 타입으로 추론됨

Set의 특징

  • 같은 타입만 가능
Set<String> fruits = {'사과', 8}; // ❌ 오류
  • 타입을 지정하지 않으면 혼합 가능
var fruits = {'사과', 8};
print(fruits.runtimeType); // _HashSet<Object>
  • 순서 보장 X
    List와 달리 Index가 없음
    중복된 값은 자동 제거
    dart
    코드를 입력하세요
var fruits = {'사과', '사과', '오렌지'};
print(fruits); // {'사과', '오렌지'}

Set 기본 기능

  • length: 요소 개수
print(fruits.length); // 2
  • isEmpty / isNotEmpty: 비어있는지 여부
print(fruits.isEmpty);    // false
print(fruits.isNotEmpty); // true

Set 요소 추가

  • add(): 요소 하나 추가
  • addAll(): 여러 요소 추가
fruits.add('바나나');                 // {'사과', '오렌지', '바나나'}
fruits.addAll({'포도', '귤'});         // {'사과', '오렌지', '바나나', '포도', '귤'}

Set 요소 삭제

remove(): 값으로 삭제

fruits.remove('오렌지'); // {'사과', '바나나', '포도', '귤'}

Index가 없으므로 removeAt() ✘

✏️ Map

Map이란?

키(Key)와 값(Value)의 쌍으로 이루어진 컬렉션

  • 선언 방법
Map<키타입, 값타입> 변수명 = {1:1,2:2, ...};
  • 예시
Map<String, String> people = {'Alice': 'Teacher', 'Bob': 'Student'};
  • 빈 Map 만들기
Map<String, String> people = {};
var emptyMap = <String, int>{};
  • var, final, const 사용
    요소 변동 가능 → var
    요소 변동 없음 → final 또는 const
var people = {'Alice': 'Teacher'};
final animals = {'Dog': 3, 'Cat': 5};
  • 요소 타입 미지정 시: 키와 값 타입 통일 필요 없음
var people = {'Alice': 25, 45: 'Bob'};
print(people.runtimeType); // LinkedMap<Object, Object>

Map의 특징

  • 키는 중복 불가, 값은 중복 가능
Map<String, int> people = {'Alice': 25, 'Bob': 25, 'Alice': 23};
print(people); // {Alice: 23, Bob: 25}
  • 키를 통해 값 검색 가능
print(people['Alice']); // 25
  • 키를 통해 값 수정 및 추가 가능
people['Alice'] = 28;       // 기존 키 값 수정
people['Charlie'] = 35;     // 새로운 키-값 추가
  • 요소 삭제
people.remove('Bob');
print(people); // {Alice: 28, Charlie: 35}
  • 포함 여부 확인
people.containsKey('Alice'); // true
  • 모든 키 / 값 조회
people.keys;   // (Alice, Charlie)
people.values; // (28, 35)

Map vs List vs Set

컬렉션순서Index중복 허용
ListOOO
SetXXX
Map키 순서 있음키로 접근키 중복 불가, 값 중복 가능

📍 열거형 (enum)

열거형이란?

여러 개의 고정된 상수 값들을 묶어놓은 타입
대표적으로 상태값, 옵션값, 색상, 카테고리 등에 사용

  • 예시
enum Color { red, green, blue }

enum Animal {
  cat,
  dog,
  tiger,
  elephant
}

주요 특징

  • 열거형 값 접근
var myColor = Color.blue;
  • switch문과 함께 자주 사용
switch (myColor) {
  case Color.red:
  case Color.green:
  case Color.blue:
}
  • index(순서) 존재
    첫 번째 값은 index 0부터 시작
Color.red.index; // 0
  • values로 모든 요소 가져오기
Color.values; // [Color.red, Color.green, Color.blue]
  • name으로 요소 이름 읽기
Color.red.name; // red
  • 언제 사용?
    미리 정해진 값들의 집합을 다룰 때
    예) 요일, 상태값, 메뉴 타입, 카테고리, 색상 등

Set과의 차이

  • 값 추가/삭제 가능 여부
    Set: 가능 (add, remove)
    enum: 불가능 (정의 후 변경 불가)

  • 중복 허용 여부
    Set: 중복 넣어도 오류 없음
    enum: 중복 이름 사용 시 오류

  • 순서
    Set: 순서 없음
    enum: 순서 있음 (index 존재)

Enum을 쓰는 이유?

  1. 정해진 선택지를 코드에서 강제로 고정하기 위해
    실수로 이상한 값을 넣지 못하게 막아줌
    예: Status { idle, running, error }
    → 이 세 개 외 값은 절대 못 들어감

  2. 코드의 의미를 더 명확하게 만들기 위해
    숫자나 문자열 대신 의미 있는 이름으로 표현 가능
    0, 1, 2 대신 Status.idle, Status.running처럼 확실함

  3. 타입 안정성(Type Safety)
    컴파일 단계에서 잘못된 값 사용을 바로 잡아줌
    문자열로 상태 관리하면 오타 나도 런타임까지 모름

  4. switch문과 함께 쓰면 상태 분기 처리하기 편함
    모든 경우를 강제로 처리하게 해서 버그 줄임

  5. 정해진 옵션이 바뀌지 않는 경우 관리가 쉬움
    앱의 상태, 카테고리, 버튼 타입, 화면 모드처럼 “정해진 목록”에 딱 맞음

변하지 않는 고정된 선택지를 안전하게 관리하기 위해!!

공부 소감

오늘은 사전 캠프 때 배웠던 Dart 문법을 기초부터 다시 시작했다.
예전에 배웠던 자바 스크립트랑 비슷한 부분이 있어 비교하면서 또 들었다.
Dart 과제는 튜터님이 낸 과제 풀기인데 언능 강의 듣구 과제 풀어보고 싶다 ㅎㅁㅎ/
이번에 공부했던 것중에 흥미로운 건 Enum같다. 이넘시끼..
강의만 들었을 때는 그래서 왜 사용하는 걸까? 궁금했는데 튜터님께 찾아가니 어느정도 이해 된 것 같다
일단 내가 생각하기에 enum을 쓰는 이유는 문자열로 사용했을 때 런타임 전까지 오류인 걸 모를 수도 있는데 enum을 사용하면 vscode에서 자동완성도 해주고 오류 값으로 보여주기 때문에 안정성을 높이려고 사용하는 걸로 이해했다.

0개의 댓글