안녕하세요, 여러분! 오늘은 Flutter 앱 개발의 기반이 되는 Dart 언어의 기초 개념을 함께 알아보려고 해요. 코드 팩토리의 'Dart#1' 강의를 들으며 정리한 내용을 공유합니다. 꼭 알아야 할 핵심 개념들을 쉽게 풀어볼게요! 😊
📌 오늘의 핵심 개념
- Var vs dynamic
- Final vs const
- Nullable vs non-nullable
- Map
- List vs Set
🔍 기본 사항
Dart에서는 문자열을 표현할 때 작은따옴표(''), 큰따옴표("") 모두 사용 가능하고 구분이 없어요. 편한 것을 사용하시면 됩니다!
String message1 = '안녕하세요'; // 작은따옴표
String message2 = "반갑습니다"; // 큰따옴표
// 둘 다 완벽히 동일하게 작동해요!
🧩 변수와 타입
변수 선언 방식
Dart에서는 변수를 선언하는 여러 방법이 있어요:
// 타입 명시
String name = '다트 공부중';
// var 키워드 (타입 추론)
var age = 25;
// dynamic 타입
dynamic something = '문자열';
something = 100; // 다른 타입으로 변경 가능!
💡 var vs dynamic
var는 초기값의 타입으로 고정되지만, dynamic은 언제든 타입이 변경될 수 있어요.
예를 들어 가방으로 비유하자면, var는 '책가방'으로 정해지면 책만 담을 수 있는 가방이고,
dynamic은 책도, 옷도, 장난감도 마음대로 바꿔 담을 수 있는 '마법 가방'이라고 생각하시면 됩니다!
문자열 보간(String Interpolation)
문자열 안에 변수를 넣을 때는 $변수명을 사용하면 편리해요!
String name = '다트';
int year = 2023;
print('$name 언어는 $year년에 배우기 시작했어요!');
// 결과: 다트 언어는 2023년에 배우기 시작했어요!
// 계산식을 넣을 때는 중괄호 사용
print('5년 후인 ${year + 5}년에는 전문가가 되어 있을 거예요!');
🔒 Nullable과 Non-nullable
Dart는 기본적으로 변수에 null 값을 허용하지 않아요(non-nullable). null을 허용하려면 타입 뒤에 ?를 붙여주세요.
// Nullable - null 값 허용
String? nullableName = '안녕';
nullableName = null; // 가능!
// Non-nullable - null 값 불가
String nonNullableName = '안녕';
// nonNullableName = null; // 컴파일 에러!
💡 null이란?
null은 '값이 없음'을 의미해요. 빈 상자를 생각하시면 됩니다.
Dart는 null로 인한 오류를 방지하기 위해 기본적으로 모든 변수가 null이 될 수 없게 설계되었어요.
Null 관련 연산자들
// ! (null assertion) 연산자: "이 값은 null이 아님을 확신해요"
String? name = '다트';
String nonNullable = name!; // name이 null이면 런타임 에러 발생!
// ?? (null-aware) 연산자: "왼쪽이 null이면 오른쪽 값을 사용해요"
String? nullableName;
String result = nullableName ?? '기본값'; // nullableName이 null이므로 결과는 '기본값'
// ??= 연산자: "변수가 null이면 새 값을 할당해요"
String? name;
name ??= '다트 공부중'; // name이 null이면 '다트 공부중'으로 할당
print(name); // '다트 공부중' 출력
⏱️ Final vs Const
두 키워드 모두 변수를 "상수"로 만들지만, 중요한 차이가 있어요:
Final
- 런타임(실행 시점)에 값이 결정될 수 있어요
- 한 번 할당되면 변경 불가능해요
- 예: 현재 시간같이 실행 시점에 결정되는 값에 적합
final currentTime = DateTime.now(); // 가능!
// currentTime = DateTime.now(); // 에러! 한 번 할당 후 변경 불가
Const
- 컴파일 타임(빌드 시점)에 값이 결정되어야 해요
- 컴파일러가 빌드할 때 이미 값을 알고 있어야 해요
- 예: 수학 상수, 고정 설정 값에 적합
const pi = 3.14159;
const daysInWeek = 7;
// const currentTime = DateTime.now(); // 불가능! - 컴파일 타임에 알 수 없음
💡 쉽게 이해하기
final은 레시피에 "신선한 재료를 넣으세요"라고 적혀있는 것과 같아요. 요리할 때마다 재료는 다를 수 있지만, 한 번 요리에 넣으면 바꿀 수 없어요.
const는 레시피에 "소금 5g을 넣으세요"처럼 정확한 값이 이미 정해져 있는 경우예요.
📦 컬렉션 타입
List
자바의 ArrayList와 유사한 개념이에요. 순서가 있는 컬렉션입니다.
// 리스트 선언
List<int> numbers = [1, 2, 3, 4, 5];
// 요소 추가
numbers.add(6);
// 인덱스로 접근
print(numbers[0]); // 1
// 리스트 순회
for (int number in numbers) {
print(number);
}
Map
키-값 쌍으로 이루어진 컬렉션이에요. 마치 사전처럼 키로 값을 찾을 수 있어요!
// Map 선언
Map<String, int> ages = {
'철수': 25,
'영희': 23,
'민수': 27
};
// 요소 추가
ages['지수'] = 22;
// 또는
ages.addAll({'준호': 30, '민지': 28});
// 값 접근
print(ages['철수']); // 25
// 키 또는 값만 가져오기
print(ages.keys); // (철수, 영희, 민수, 지수, 준호, 민지)
print(ages.values); // (25, 23, 27, 22, 30, 28)
Set
중복 값을 허용하지 않는 컬렉션이에요. 집합처럼 각 요소는 단 한 번만 나타납니다.
// Set 선언
Set<String> fruits = {'사과', '바나나', '오렌지'};
// 요소 추가
fruits.add('딸기');
fruits.add('사과'); // 이미 있으므로 추가되지 않음
print(fruits); // {사과, 바나나, 오렌지, 딸기}
// 포함 여부 확인
print(fruits.contains('사과')); // true
💡 List vs Set 언제 사용할까?
- List: 순서가 중요하거나 중복 요소가 필요할 때 (예: 학생 출석부)
- Set: 중복을 허용하지 않는 고유 항목이 필요할 때 (예: 방문한 국가 목록)
🔍 유용한 연산자
// 타입 확인
int number = 5;
print(number is int); // true - "number가 int 타입인가요?"
print(number is! String); // true - "number가 String 타입이 아닌가요?"
// 비교 연산자
print(5 == 5); // true - 동등 비교
print(5 != 3); // true - 불일치 비교
💭 마치며
오늘은 Dart의 기본 문법과 핵심 개념들을 살펴봤어요. 특히 Nullable vs Non-nullable, Final vs Const, Dynamic 타입 개념은 실제 개발에서 자주 쓰이니 꼭 이해하고 넘어가세요!
Flutter로 멋진 앱을 만들기 위한 첫 걸음, Dart 기초를 함께 배워봤는데요. 다음에는 더 심화된 내용으로 찾아올게요.
다음 학습 계획
- [25.04.03] Dart#1 기본기 마무리하기
Flutter 개발 여정에서 어떤 내용이 가장 궁금하신가요? Dart 문법 중 더 알고 싶은 내용이 있으시면 댓글로 남겨주세요! 여러분의 질문에 답변드리겠습니다! 😊
오늘의 학습 난이도: ⭐⭐⭐☆☆
'📚 학습 기록 > Dart & Flutter 기초' 카테고리의 다른 글
Dart 비동기 프로그래밍과 Dart 3.0 주요 기능 완벽 가이드 (0) | 2025.05.06 |
---|---|
Dart의 함수형 프로그래밍과 컬렉션 프레임워크 완벽 정리 (1) | 2025.05.01 |
Dart의 객체지향 프로그래밍: 자바 개발자를 위한 핵심 가이드 (1) | 2025.04.24 |
Dart 언어 마스터하기: 기초 개념부터 고급 패턴까지 (1) | 2025.04.20 |
다트 기초 완전정복: For-in부터 TypeDef까지 (코드 팩토리 Dart 강의 정리) (2) | 2025.04.03 |