앞 챕터에서 변수를 선언하는 법을 배웠습니다. 이제 그 그릇 안에 담기는 값의 종류를 살펴볼 차례입니다. Dart는 처음부터 몇 가지 기본 타입을 제공하며, 이것들이 모든 프로그램의 뼈대가 됩니다.
이번 챕터에서는 숫자(int, double, num), 문자열(String), 참거짓(bool), 그리고 타입 사이를 오가는 변환 방법을 배웁니다.
숫자 타입 — int와 double
int
int는 정수를 담는 타입입니다. 소수점이 없는 숫자라면 모두 int입니다.
void main() {
int appleCount = 10;
int temperature = -5;
int population = 51_744_876; // 밑줄로 읽기 편하게 구분 가능
print(appleCount); // 10
print(temperature); // -5
print(population); // 51744876
}
int로 할 수 있는 기본 연산들입니다.
void main() {
int a = 17;
int b = 5;
print(a + b); // 22 — 더하기
print(a - b); // 12 — 빼기
print(a * b); // 85 — 곱하기
print(a ~/ b); // 3 — 정수 나누기 (몫만)
print(a % b); // 2 — 나머지
// int끼리 /로 나누면 결과는 double이 됩니다
print(a / b); // 3.4
}
double
double은 소수점이 있는 숫자를 담습니다.
void main() {
double pi = 3.14159;
double price = 12800.5;
double tiny = 0.001;
print(pi); // 3.14159
print(price); // 12800.5
// 과학적 표기법도 됩니다
double big = 1.5e6; // 1,500,000
double small = 2.5e-3; // 0.0025
print(big); // 1500000.0
print(small); // 0.0025
}
num — 두 타입의 부모
num은 int와 double 모두를 담을 수 있는 타입입니다. 정수도 되고 소수도 되어야 하는 상황에서 씁니다.
void main() {
num value = 10; // int
value = 3.14; // double로 변경 가능
print(value); // 3.14
}
실제로 int와 double은 num을 상속받은 클래스입니다. 나중에 클래스를 배우면 이 관계가 더 명확하게 이해됩니다.
문자열 타입 — String
String은 글자의 연속입니다. 작은따옴표나 큰따옴표로 감쌉니다.
void main() {
String hello = 'Hello, Dart!';
String greeting = "안녕하세요";
print(hello); // Hello, Dart!
print(greeting); // 안녕하세요
}
문자열 보간 — $ 기호
문자열 안에 변수 값을 넣고 싶을 때 $를 씁니다. 식이 복잡하면 ${}를 씁니다.
void main() {
String name = '다트';
int year = 2011;
double version = 3.11;
print('$name은 $year년에 만들어졌습니다.');
print('현재 버전은 $version입니다.');
print('버전의 두 배는 ${version * 2}입니다.');
// 객체의 속성에 접근할 때는 중괄호 필요
String word = 'hello';
print('길이: ${word.length}'); // 길이: 5
}
멀티라인 문자열 — ''' '''
여러 줄에 걸친 문자열은 작은따옴표 또는 큰따옴표를 세 개씩 씁니다.
void main() {
String poem = '''
장미는 붉고,
제비꽃은 푸르다,
Dart는 빠르고,
코드는 아름답다.
''';
print(poem);
String json = """
{
"name": "Dart",
"version": "3.11"
}
""";
print(json);
}
유용한 String 메서드
void main() {
String text = ' Hello, Dart! ';
print(text.length); // 16 — 문자열 길이
print(text.trim()); // 'Hello, Dart!' — 앞뒤 공백 제거
print(text.toUpperCase()); // ' HELLO, DART! ' — 대문자
print(text.toLowerCase()); // ' hello, dart! ' — 소문자
print(text.contains('Dart')); // true — 포함 여부
print(text.replaceAll('!', '.')); // ' Hello, Dart. ' — 치환
String csv = 'apple,banana,cherry';
List<String> fruits = csv.split(',');
print(fruits); // [apple, banana, cherry]
print('Dart'.startsWith('Da')); // true
print('Dart'.endsWith('rt')); // true
print('Dart'.indexOf('a')); // 1 — 첫 번째 위치
}
불리언 타입 — bool
bool은 참(true)과 거짓(false)만 담을 수 있는 타입입니다.
void main() {
bool isLoggedIn = true;
bool hasError = false;
print(isLoggedIn); // true
print(hasError); // false
// 비교 연산의 결과는 bool입니다
int age = 20;
bool isAdult = age >= 18;
print(isAdult); // true
// 논리 연산
bool canVote = isAdult && isLoggedIn; // 둘 다 true여야
print(canVote); // true
bool showAlert = hasError || !isLoggedIn; // 하나라도 true면
print(showAlert); // false
}
타입 간 변환
실제 프로그램에서는 타입을 변환해야 할 일이 자주 생깁니다. 사용자가 입력한 문자열 "42"를 정수로 바꾸거나, 계산 결과를 화면에 출력하기 위해 문자열로 바꾸는 것이 대표적입니다.
문자열 → 숫자
void main() {
String numStr = '42';
String piStr = '3.14';
int parsed = int.parse(numStr);
double parsedDouble = double.parse(piStr);
print(parsed); // 42
print(parsedDouble); // 3.14
print(parsed + 8); // 50
// 변환 실패 시 예외 발생
// int.parse('hello'); // FormatException!
// 안전한 변환 (실패 시 null 반환)
int? safe = int.tryParse('hello');
print(safe); // null
}
숫자 → 문자열
void main() {
int count = 100;
double price = 12800.5;
String countStr = count.toString();
String priceStr = price.toString();
print(countStr); // '100'
print(priceStr); // '12800.5'
print('수량: $countStr개'); // '수량: 100개'
// 소수점 자리수 지정
double pi = 3.14159265;
print(pi.toStringAsFixed(2)); // '3.14'
print(pi.toStringAsFixed(4)); // '3.1416'
}
int ↔ double
void main() {
int intVal = 7;
double doubleVal = 3.9;
// int → double
double fromInt = intVal.toDouble();
print(fromInt); // 7.0
// double → int (소수점 버림)
int fromDouble = doubleVal.toInt();
print(fromDouble); // 3 (반올림 아님!)
// 반올림이 필요하면 round() 사용
int rounded = doubleVal.round();
print(rounded); // 4
}
타입 확인하기
변수의 타입이 무엇인지 확인하고 싶을 때 runtimeType을 씁니다.
void main() {
var x = 42;
var y = 3.14;
var z = 'hello';
var w = true;
print(x.runtimeType); // int
print(y.runtimeType); // double
print(z.runtimeType); // String
print(w.runtimeType); // bool
}
전체 예제
지금까지 배운 기본 타입들을 모두 써보는 예제입니다.
void main() {
// 학생 정보
String studentName = '이다트';
int studentId = 20240001;
double gpa = 3.85;
bool isEnrolled = true;
// 문자열 출력
print('=== 학생 정보 ===');
print('이름: $studentName');
print('학번: $studentId');
print('학점: ${gpa.toStringAsFixed(2)}');
print('재학 중: $isEnrolled');
// 타입 변환 예시
String inputScore = '95';
int score = int.parse(inputScore);
double percentile = score / 100.0;
print('\n=== 성적 정보 ===');
print('점수: $score점');
print('백분율: ${(percentile * 100).toStringAsFixed(1)}%');
// 멀티라인 문자열
String summary = '''
학생 $studentName ($studentId)
GPA: $gpa / 4.5
상태: ${isEnrolled ? "재학" : "휴학"}
''';
print(summary);
}
다음 챕터에서는 Dart의 타입 추론 시스템을 더 깊이 들여다봅니다. var를 쓸 때 Dart가 내부에서 어떻게 타입을 결정하는지, 그리고 dynamic과 Object는 무엇이 다른지 알아봅니다.