iBetter Books
수정

앞 챕터에서 변수를 선언하는 법을 배웠습니다. 이제 그 그릇 안에 담기는 값의 종류를 살펴볼 차례입니다. 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 — 두 타입의 부모

numintdouble 모두를 담을 수 있는 타입입니다. 정수도 되고 소수도 되어야 하는 상황에서 씁니다.

void main() {
  num value = 10;    // int
  value = 3.14;      // double로 변경 가능

  print(value);  // 3.14
}

실제로 intdoublenum을 상속받은 클래스입니다. 나중에 클래스를 배우면 이 관계가 더 명확하게 이해됩니다.

문자열 타입 — 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가 내부에서 어떻게 타입을 결정하는지, 그리고 dynamicObject는 무엇이 다른지 알아봅니다.