다트 이해하기 - (2) 내장 변수타입
Dart는 Flutter 앱 개발에 사용되는 언어로, 다양한 변수 타입을 제공합니다. 프로그래밍을 배우는 데 있어, 변수 타입을 이해하는 것은 매우 중요합니다. 변수는 데이터를 저장하고 조작하는 기본적인 단위이기 때문입니다. 이번 글에서는 Dart에서 제공하는 주요 내장 변수 타입에 대해 초보자들도 쉽게 이해할 수 있도록 설명하겠습니다.
1. 숫자 타입 (int, double)
Dart에서 숫자는 두 가지 주요 타입으로 나눠집니다: 정수와 실수입니다.
- int: 정수형 변수로, 소수점이 없는 숫자를 저장합니다.
- double: 실수형 변수로, 소수점을 포함하는 숫자를 저장합니다.
예시:
void main() {
int age = 25; // 정수형 변수
double price = 10.99; // 실수형 변수
print(age); // 출력: 25
print(price); // 출력: 10.99
}
주요 특징:
- int는 소수점 없이 정수만 저장할 수 있습니다.
- double은 소수점이 포함된 숫자, 예를 들어 10.99 같은 값을 저장할 수 있습니다.
2. 문자열 타입 (String)
**String**은 문자나 단어, 문장 등을 저장하는 변수 타입입니다. 즉, 텍스트 데이터를 다룰 때 사용됩니다.
예시:
void main() {
String greeting = "Hello, Flutter!";
print(greeting); // 출력: Hello, Flutter!
}
주요 특징:
- 문자열은 큰따옴표(")나 작은따옴표(')로 감쌀 수 있습니다.
- 여러 줄에 걸친 문자열을 사용할 때는 ''' 또는 **"""**를 사용할 수 있습니다.
3. 불리언 타입 (bool)
**bool**은 참(true) 또는 거짓(false) 값을 저장하는 변수 타입입니다. 주로 조건문(if, else)이나 논리 연산에서 사용됩니다.
예시:
void main() {
bool isFlutterFun = true;
bool isCold = false;
print(isFlutterFun); // 출력: true
print(isCold); // 출력: false
}
주요 특징:
- bool 타입은 true 또는 false 두 값만 가질 수 있습니다.
- 주로 조건문에서 사용되어 프로그램 흐름을 제어합니다.
4. 리스트 타입 (List)
**List**는 여러 개의 값을 순서대로 저장하는 배열 같은 역할을 합니다. 리스트는 다양한 데이터 타입의 값을 하나의 변수에 저장할 수 있는 유용한 타입입니다.
예시:
void main() {
List<String> fruits = ["Apple", "Banana", "Orange"];
print(fruits); // 출력: [Apple, Banana, Orange]
print(fruits[0]); // 출력: Apple
}
주요 특징:
- 리스트는 **대괄호([])**로 묶어서 여러 값을 저장합니다.
- 인덱스를 사용해 리스트의 특정 항목에 접근할 수 있습니다. 인덱스는 0부터 시작합니다.
5. 맵 타입 (Map)
**Map**은 **키(key)**와 **값(value)**을 쌍으로 저장하는 데이터 타입입니다. 리스트가 순서대로 저장되는 반면, 맵은 키를 통해 값을 검색하는 방식입니다.
예시:
void main() {
Map<String, String> capitals = {
'Korea': 'Seoul',
'Japan': 'Tokyo',
'USA': 'Washington, D.C.'
};
print(capitals); // 출력: {Korea: Seoul, Japan: Tokyo, USA: Washington, D.C.}
print(capitals['Korea']); // 출력: Seoul
}
주요 특징:
- 맵은 **중괄호({})**로 묶어서 키-값 쌍을 저장합니다.
- 키를 사용해 값에 접근할 수 있습니다. 예를 들어, capitals['Korea']는 Seoul을 반환합니다.
6. 동적 타입 (dynamic)
**dynamic**은 어떤 타입이든 저장할 수 있는 타입입니다. 변수의 타입을 고정하지 않고, 실행 중에 변경할 수 있기 때문에 유연하게 사용할 수 있지만, 타입 안전성이 떨어질 수 있어 주의해서 사용해야 합니다.
예시:
void main() {
dynamic something = 42; // 정수 저장
print(something); // 출력: 42
something = "Flutter"; // 문자열로 변경
print(something); // 출력: Flutter
}
주요 특징:
- dynamic은 타입을 동적으로 결정하기 때문에 변수에 어떤 값이든 저장할 수 있습니다.
- 타입을 명확히 정의하지 않기 때문에 타입 오류를 쉽게 발견할 수 없습니다. 이를 신중하게 사용해야 합니다.
7. Set 타입
**Set**은 중복되지 않는 값을 저장하는 집합을 나타내는 자료형입니다. 리스트와 유사하지만, 값의 순서는 보장하지 않으며, 중복된 값을 허용하지 않습니다. 주로 유일한 값들을 다뤄야 할 때 유용합니다.
void main() {
Set<String> fruits = {"Apple", "Banana", "Orange", "Apple"};
print(fruits); // 출력: {Apple, Banana, Orange}
fruits.add("Grapes"); // 새로운 요소 추가
print(fruits); // 출력: {Apple, Banana, Orange, Grapes}
}
주요 특징:
- 중복되지 않는 값을 저장합니다. 예를 들어 "Apple"을 두 번 추가해도 한 번만 저장됩니다.
- 순서가 보장되지 않습니다. 즉, 값이 저장되는 순서와 출력되는 순서는 다를 수 있습니다.
- Set은 **add()**나 remove() 메서드를 사용하여 값을 추가하거나 삭제할 수 있습니다.
- 검색 및 포함 여부 체크가 빠른 편입니다.
Set의 사용 예:
- 고유한 값 목록을 관리해야 할 때 유용합니다.
- 예를 들어, 사용자가 방문한 페이지 목록, 중복된 이메일을 처리하는 시스템 등에서 활용됩니다.
8. Enum 타입
Enum(열거형)은 여러 개의 관련 상수 값을 그룹화하여 하나의 타입으로 묶을 때 사용됩니다. Enum을 사용하면 값의 집합을 명확하게 정의하고, 코드에서 의미 있는 이름을 사용할 수 있어 가독성과 유지보수성이 높아집니다.
예시:
void main() {
var status = Status.pending;
switch (status) {
case Status.pending:
print("Processing...");
break;
case Status.completed:
print("Completed!");
break;
case Status.failed:
print("Failed!");
break;
}
}
enum Status {
pending, // 대기 중
completed, // 완료됨
failed // 실패
}