📚 학습 기록/Dart & Flutter 기초

Dart 기초 정리: 초보자도 쉽게 이해하는 핵심 개념

zenjoydev 2025. 3. 28. 22:58

안녕하세요, 여러분! 오늘은 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 문법 중 더 알고 싶은 내용이 있으시면 댓글로 남겨주세요! 여러분의 질문에 답변드리겠습니다! 😊


오늘의 학습 난이도: ⭐⭐⭐☆☆