본문 바로가기

flutter

Dart 기초 마스터하기 #1 변수와 데이터 타입 완전 정복

반응형

Flutter 개발을 위한 Dart 언어 기초 시리즈 첫 번째 시간입니다. 변수 선언부터 null safety까지, 실무에서 바로 써먹을 수 있는 내용들을 정리했습니다.

 

이 글에서 배우는 것

  • Dart의 기본 데이터 타입들 (String, int, double, bool)
  • var vs 명시적 타입 선언
  • 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() + '원에...';
반응형