티스토리 뷰

반응형

📌 Dart 문법 개요 - 변수

Dart는 Flutter 개발을 위한 기본 언어이며, 정적 타입을 지원하는 동적 언어입니다. 즉, 변수의 타입을 지정할 수도 있고, 자동으로 추론할 수도 있습니다.

Dart에서 변수를 다룰 때 중요한 개념들을 설명하겠습니다.


🔹 1. 변수 선언 및 사용

Dart에서 변수를 선언하는 방법은 다음과 같습니다.

1️⃣ var 키워드 (타입 추론)

var name = "Flutter";  // 문자열로 자동 타입 추론
var age = 25;          // 정수로 자동 타입 추론
  • var는 변수의 타입을 자동으로 추론합니다.
  • 한 번 타입이 정해지면 변경할 수 없습니다. (예: name = 10; 하면 오류 발생)

2️⃣ 명시적 타입 선언

String language = "Dart";
int year = 2024;
double version = 3.0;
bool isFlutterAwesome = true;
  • String, int, double, bool 등의 타입을 직접 지정할 수도 있습니다.

3️⃣ dynamic 키워드 (유동적인 타입)

dynamic value = "Hello";
value = 42;  // 가능
value = true; // 가능
  • dynamic을 사용하면 어떤 타입이든 할당 가능하지만, 타입 안정성이 떨어질 수 있습니다.

4️⃣ final과 const (상수 선언)

final String appName = "MyFlutterApp";
const int maxUsers = 1000;
  • final은 런타임 시 값이 결정되는 상수
  • const는 컴파일 타임 상수로, 값이 변하지 않음을 보장

  • 변경될 가능성이 없는 값은 final 또는 const를 사용하면 안전합니다.
  • const는 컴파일 타임에 결정되므로, 성능 최적화에 유리합니다.

🔹 2. 리스트 (List)

Dart에서 리스트는 배열과 같은 역할을 하며, List<T> 타입을 사용합니다.

1️⃣ 기본 리스트 선언

List<String> fruits = ["Apple", "Banana", "Cherry"];
var numbers = [1, 2, 3, 4, 5];  // 타입 자동 추론
  • 리스트의 요소 타입을 명시할 수도 있고, var로 타입을 추론할 수도 있습니다.

2️⃣ 리스트 요소 접근 (인덱싱)

print(fruits[0]);  // Apple
print(numbers[2]); // 3
  • 리스트의 인덱스는 0부터 시작합니다.

3️⃣ 리스트 수정

fruits[1] = "Blueberry";  // Banana → Blueberry 변경
numbers.add(6);           // 리스트에 값 추가
numbers.removeAt(0);      // 첫 번째 요소 제거 (1 제거)
  • add(value): 새로운 요소 추가
  • removeAt(index): 특정 인덱스의 요소 제거

4️⃣ 리스트 길이 확인

print(fruits.length);  // 3
  • .length 속성을 사용하여 리스트의 크기를 확인할 수 있습니다.

5️⃣ 빈 리스트 선언

List<int> emptyList = [];
var anotherEmptyList = List<int>.empty(growable: true);
  • 빈 리스트를 선언하고 나중에 값을 추가할 수 있습니다.

  • List<String>처럼 타입을 명확히 지정하면 타입 안정성이 높아집니다.
  • final을 사용하면 리스트 자체를 변경할 수 없지만, 요소 수정은 가능합니다.
    final List<int> numbers = [1, 2, 3];
    numbers[0] = 10;  // 가능
    numbers = [4, 5, 6];  // 오류 발생 (리스트 객체 자체 변경 불가)
    

🔹 3. 맵 (Map)

Dart에서 Map은 키-값 쌍을 저장하는 컬렉션입니다. (JavaScript의 Object와 비슷함)

1️⃣ 기본 선언

Map<String, int> scores = {
  "Math": 90,
  "Science": 85,
  "English": 88
};
var student = {
  "name": "John",
  "age": 20,
  "isStudent": true
};
  • 키 타입과 값 타입을 명시할 수도 있고, var를 사용하여 자동 추론할 수도 있습니다.

2️⃣ 값 접근

print(scores["Math"]);  // 90
print(student["name"]); // John
  • map[key] 형식으로 값을 가져옵니다.

3️⃣ 값 추가 및 수정

scores["History"] = 75; // 새 과목 추가
scores["Math"] = 95;    // 기존 값 수정

4️⃣ 키 및 값 가져오기

print(scores.keys);   // (Math, Science, English, History)
print(scores.values); // (90, 85, 88, 75)

  • Map을 사용할 때 키 값의 타입을 지정하면 실수할 가능성이 줄어듭니다.
  • containsKey(key)를 사용하여 특정 키가 존재하는지 확인할 수 있습니다.
    if (scores.containsKey("Math")) {
      print("Math 점수 존재함");
    }
    

🔹 4. 집합 (Set)

Dart에서 Set은 중복을 허용하지 않는 컬렉션입니다.

1️⃣ 기본 선언

Set<int> uniqueNumbers = {1, 2, 3, 4, 5};
var letters = <String>{"A", "B", "C"};
  • {}를 사용하여 선언하며, 리스트와 달리 중복된 값을 저장하지 않습니다.

2️⃣ 요소 추가 및 제거

uniqueNumbers.add(6);
uniqueNumbers.remove(3);

3️⃣ 포함 여부 확인

print(uniqueNumbers.contains(2));  // true

  • Set은 중복된 데이터를 저장할 필요가 없을 때 유용합니다.
  • 리스트보다 검색 속도가 빠릅니다.

🛠 정리

개념 설명

var 타입 자동 추론
dynamic 어떤 타입이든 허용
final 한 번 할당하면 변경 불가 (런타임 상수)
const 컴파일 타임 상수
List 순서가 있는 컬렉션 (배열)
Map 키-값 쌍을 저장하는 컬렉션
Set 중복을 허용하지 않는 컬렉션

🔥 Dart 변수 활용 꿀팁

  1. 가급적 var 대신 명시적 타입을 사용 → 코드 가독성이 좋아지고 실수를 줄일 수 있음.
  2. final과 const를 적극 활용 → 불필요한 변경을 방지하여 안정성 증가.
  3. 리스트 대신 Set을 사용하여 중복 데이터 방지 → 성능 최적화 가능.
  4. Map을 활용하여 키-값 데이터를 효율적으로 관리 → JSON 데이터 다룰 때 유용.

 

반응형