반응형
Flutter 개발을 위한 Dart 언어 기초 시리즈 첫 번째 시간입니다. 변수 선언부터 null safety까지, 실무에서 바로 써먹을 수 있는 내용들을 정리했습니다.
이 글에서 배우는 것
- Dart의 기본 데이터 타입들 (String, int, double, bool)
varvs 명시적 타입 선언- Null Safety의 개념과 사용법
- 문자열 보간법(String Interpolation) 완전 정복
- final vs const의 차이점
- 실무에서 자주 사용하는 타입 변환 방법
변수 선언의 두 가지 방법
1. var 키워드로 타입 추론하기
var name = '홍길동'; // String으로 자동 추론
var age = 25; // int로 자동 추론
Dart는 똑똑합니다! 할당된 값을 보고 자동으로 타입을 결정해줍니다.
2. 명시적 타입 선언
String city = '서울';
int score = 95;
double height = 175.5;
bool isStudent = true;
타입을 명확히 하고 싶거나, 팀 컨벤션상 명시적 선언을 선호한다면 이 방법을 사용합니다.
Null Safety: 널 포인터 에러 방지하기
Dart의 가장 강력한 기능 중 하나는 Null Safety입니다.
기본: Non-nullable 타입
String name = '홍길동'; // null이 될 수 없음
// name = null; // ❌ 컴파일 에러!
Nullable 타입 선언
String? nickname; // null이 될 수 있음
print(nickname); // null 출력
nickname = '개발자';
print(nickname); // '개발자' 출력
Null 체크와 ! 연산자
String? nickname = '개발자';
// 방법 1: 조건부 접근
if (nickname != null) {
print('닉네임 길이: ${nickname.length}');
}
// 방법 2: ! 연산자 (확실할 때만 사용)
String definiteNickname = nickname!; // null이 아님을 확신
print('확실한 닉네임: $definiteNickname');
주의: ! 연산자는 정말 확실할 때만 사용하세요. null일 경우 런타임 에러가 발생합니다.
문자열 보간법
기본 사용법
String name = '홍길동';
int age = 25;
// 1. 단순 변수 삽입
print('이름: $name, 나이: $age');
// 2. 표현식 삽입 (중괄호 필요)
print('안녕하세요! 저는 ${age}살 $name입니다.');
언제 중괄호{}가 필요한가?
| 상황 | 예시 | 중괄호 필요? |
|---|---|---|
| 단순 변수 | $name |
선택사항 |
| 계산식 | ${age + 1} |
필수 |
| 메서드 호출 | ${name.length} |
필수 |
| 객체 속성 | ${person.name} |
필수 |
| 조건문 | ${age >= 18 ? "성인" : "미성년자"} |
필수 |
실전 예제
String name = '홍길동';
int age = 25;
double height = 175.5;
String city = '서울';
// 계산식과 메서드 호출
print('내년에는 ${age + 1}살이 됩니다.');
print('키를 미터로: ${height / 100}m');
print('이름의 길이: ${name.length}글자');
print('대문자 도시명: ${city.toUpperCase()}');
// 조건문도 가능!
print('성인 여부: ${age >= 18 ? "성인" : "미성년자"}');
기존 방식 vs 문자열 보간법
// 기존 방식: 복잡하고 실수하기 쉬움
print('기존: ' + '이름은 ' + name + '이고 나이는 ' + age.toString() + '살입니다.');
// 보간법: 간단하고 읽기 쉬움
print('보간법: 이름은 $name이고 나이는 $age살입니다.');
Dart의 주요 데이터 타입들
숫자 타입
int positiveNum = 42; // 정수
int negativeNum = -17; // 음수
double decimal = 3.14159; // 실수
num anyNumber = 100; // int나 double 모두 가능
문자열 타입
String simple = '단순 문자열';
// 여러 줄 문자열
String multiLine = '''
여러 줄로
작성할 수 있는
문자열입니다.
''';
불린과 컬렉션 미리보기
bool isStudent = true;
List<int> numbers = [1, 2, 3, 4, 5];
Map<String, String> colors = {'red': '빨강', 'blue': '파랑'};
상수 선언: final vs const
final: 런타임 상수
final currentYear = 2024; // 런타임에 값 결정
final now = DateTime.now(); // 실행 시점에 현재 시간
const: 컴파일 타임 상수
const pi = 3.14159; // 컴파일 시점에 값이 정해짐
const maxUsers = 1000; // 절대 변하지 않는 값
| 구분 | final | const |
|---|---|---|
| 결정 시점 | 런타임 | 컴파일 타임 |
| 사용 예 | 현재 시간, 사용자 입력 | 수학 상수, 설정값 |
| 재할당 | ❌ 불가 | ❌ 불가 |
타입 체크와 변환
타입 확인하기
String name = '홍길동';
int age = 25;
print('name의 타입: ${name.runtimeType}'); // String
print('age의 타입: ${age.runtimeType}'); // int
타입 변환
int age = 25;
// 숫자 → 문자열
String ageStr = age.toString();
// 문자열 → 숫자
int scoreInt = int.parse('95');
double scoreDouble = double.parse('95.5');
print('문자열로 변환: $ageStr (${ageStr.runtimeType})');
print('문자열을 int로: $scoreInt (${scoreInt.runtimeType})');
실무 팁
1. 변수명 컨벤션
// ✅ Good: camelCase 사용
String firstName = '홍길동';
int totalScore = 95;
bool isLoggedIn = true;
// ❌ Bad: snake_case나 PascalCase
String first_name = '홍길동'; // snake_case
String FirstName = '홍길동'; // PascalCase
2. null safety 활용
// ✅ Good: null 체크 후 사용
String? userInput;
if (userInput != null) {
print('입력값 길이: ${userInput.length}');
}
// ❌ Bad: null일 수 있는 값에 ! 남용
String result = userInput!.toUpperCase(); // 위험!
3. 문자열 보간법 활용
// ✅ Good: 복잡한 문자열도 깔끔하게
String message = '${user.name}님, ${items.length}개 상품을 ${totalPrice.toStringAsFixed(2)}원에 구매하셨습니다.';
// ❌ Bad: + 연산자로 복잡하게 연결
String message = user.name + '님, ' + items.length.toString() + '개 상품을 ' + totalPrice.toString() + '원에...';반응형
'flutter' 카테고리의 다른 글
| Flutter는 어떻게 작동할까? 아키텍처와 네이티브 개발 완전 분석 (0) | 2025.09.22 |
|---|---|
| Flutter 시작하기: 크로스 플랫폼 앱 개발의 첫걸음 (0) | 2025.09.22 |
| Dart 기초 마스터하기 #4 List와 Map으로 데이터 다루기 (0) | 2025.09.21 |
| Dart 기초 마스터하기 #3 조건문과 반복문으로 프로그램 제어하기 (0) | 2025.09.21 |
| Dart 기초 마스터하기 #2 함수와 클래스로 코드 구조화하기 (0) | 2025.09.21 |