logoRawon_Log
홈블로그소개

Built with Next.js, Bun, Tailwind CSS and Shadcn/UI

Mobile

Dart 프로그래밍 가이드(변수와 타입)

Rawon
2025년 8월 28일
목차
Dart 프로그래밍 가이드
1. 변수와 타입
1.1 변수 선언 방식
var 키워드
명시적 타입 선언
문자열(String) 타입
1.2 특수 타입
dynamic 타입
nullable vs non-nullable
1.3 상수 선언
final vs const
1.4 연산자
기본 연산자
null 조건 연산자
비교 연산자
타입 비교 연산자
논리 연산자
1.5 컬렉션 타입
List
Map
Set

목차

Dart 프로그래밍 가이드
1. 변수와 타입
1.1 변수 선언 방식
var 키워드
명시적 타입 선언
문자열(String) 타입
1.2 특수 타입
dynamic 타입
nullable vs non-nullable
1.3 상수 선언
final vs const
1.4 연산자
기본 연산자
null 조건 연산자
비교 연산자
타입 비교 연산자
논리 연산자
1.5 컬렉션 타입
List
Map
Set

Dart 프로그래밍 가이드

목 차

  1. 변수와 타입
  2. 조건문과 반복문
  3. 함수
  4. 함수형 프로그래밍
  5. 객체지향 프로그래밍
  6. Enum
  7. Dart 3.0 업데이트 내용
  8. 비동기 프로그래밍

1. 변수와 타입

1.1 변수 선언 방식

var 키워드

dart
var name = "홍길동"; // 타입 추론 (String)

print(name.runtimeType); // String

name = "김철수"; // 재할당 가능

명시적 타입 선언

dart
String name = "홍길동";

int age = 25;

double height = 175.5;

bool isStudent = true;

문자열(String) 타입

dart
String name = "aa";

String name2 = "bb";

  

print(name+name2); // aabb

print('${name} ${name2}') // aa bb

print('$name') // aa, 변수가 하나일 경우 {} 생략 가능

1.2 특수 타입

dynamic 타입

  • 어떤 타입이던 모두 가능
  • var는 타입 추론 후 고정된 타입으로만 재할당을 허용하는 반면,
  • dynamic 은 특수 타입으로 컴파일 타임 타입 체크를 완전히 비활성화하여 어떤 타입의 값이든 재할당할 수 있음.
  • dynamic 타입은 어떤 데이터를 받았는데 그 데이터의 type을 알 수 없는 경우에 유용하게 사용함.
dart
dynamic value = "문자열";

value = 123; // 숫자로 변경 가능

value = true; // 불린으로 변경 가능

nullable vs non-nullable

  • nullable : null 이 될 수 있음
  • non-nullable : null이 될 수 없음
dart
String name = "홍길동"; // null 불가

String? nickname = null; // null일 수 있음, 타입에 ?를 붙이면 nullable이 됨

String name2 = "bb";

name2! = null // 에러 발생, !는 절대 null이 아니라는 의미이기 때문

1.3 상수 선언

final vs const

  • final : 변수 선언부 앞에 사용, final로 선언하게 되면 값을 변경할 수 있음
  • const : 변수를 한번 선언하게 되면 값을 변경할 수 없음
  • final 과 const 를 사용하면 var 키워드 생략 가능. 즉, 타입도 생략할 수 있음
dart
// 시간과 날짜를 저장할 수 있는 DateTime 타입
// 이 코드가 실행되는 순간의 시간을 나타냄
DateTime now = DateTime.now();

final DateTime now = DateTime.now(); // 정상

print(now);

const DateTime now2 = DateTime.now(); // 에러

const String appName = "MyApp"; // 정상
  • final은 정상 실행되고 const는 에러가 발생하는 이유
    • const는 컴파일 타임의 값을 알고 있어야 하며, final은 컴파일 타임의 값을 알고 있지 않아도 됨.
    • 코드를 작성하면 1010011과 같이 컴퓨터가 알고 있는 언어로 변경되는 과정을 컴파일 타임 이라 함.
    • 즉, 컴파일 타임의 값을 알고 있어야 한다는건 코드를 작성했을 때, 작성하는 순간에 코드의 값을 알고 있어야 하는데 여기서 DateTime.now() 는 코드가 실행되는 순간에만 값을 알 수 있기 때문에 const 로 사용할 수 없음
    • 소스코드 ➡️  바이트 코드 / 기계어로 변환되는 과정이 빌드 타임
    • const 값들은 이 시점에 이미 메모리에 고정됨. 즉, 컴파일 타임에 값이 확정되어야 함.
    • final 값들은 프로그램 실행 중에 한번만 할당됨. 즉, 런타임에 값이 결정되어도 OK

1.4 연산자

기본 연산자

dart
int number = 2;

number++; // 증가

number--; // 감소

number += 2; // 더하기 할당

number *= 3; // 곱하기 할당

print(number % 2); // 나머지

null 조건 연산자

dart
double? number = 4.0;

number = 2.0;

print(number); // 2.0

  

number = null;

print(number); // null

  

number ??= 3.0; // number가 만약 null 이라면 우측 값으로 변경

print(number); // 3.0

비교 연산자

dart
int a = 1, b = 2;

print(a > b); // false

print(a < b); // true

print(a == b); // false

print(a != b); // true

타입 비교 연산자

dart
int number = 1;

print(number is int); // true

print(number is! int); // false

논리 연산자

dart
bool result = 12 > 10 && 1 > 0; // true (AND)

bool result2 = 12 > 10 || 1 < 0; // true (OR)

1.5 컬렉션 타입

List

  • List<리스트 안에 어떤 타입의 변수를 넣을건지>
dart
List<String> fruits = ['사과', '바나나', '오렌지'];

List<int> numbers = [1,2,3,4];

fruits.add('포도'); // 추가

fruits.remove('바나나'); // 제거

print(fruits[0]); // 인덱스 접근, 사과

print(fruits.length); // 길이, 3

print(fruits.indexOf('사과')); // 인덱스 찾기, 0

Map

  • key-value 쌍
  • Map<key 타입, value 타입>
dart
Map<String, int> scores = {
'국어': 90,
'영어': 85,
'수학': 92
};

// 추가
scores['과학'] = 88;
scores.addAll({'사회': 78});

// 조회
print(scores['국어']); // 90
print(scores.keys); // 키 목록, (국어, 영어, 수학, 과학, 사회)
print(scores.values); // 값 목록, (90, 85, 92, 88, 78)

// 제거 .remove(key값)
scores.remove('영어');

Set

  • Map과 비슷하나 key-value 쌍이 아니라 List 처럼 하나의 값만 저장
  • List는 중복 값 가능, Set은 중복 값 불가
  • 자동으로 중복 제거
dart
Set<String> uniqueNames = {'김철수', '이영희', '김철수'};

print(uniqueNames); // {김철수, 이영희} - 중복 제거

  

uniqueNames.add('박민수'); // 추가

uniqueNames.remove('김철수'); // 제거

uniqueNames.contains('이영희')); // 존재 여부 확인, true/false

이 링크를 통해 구매하시면 제가 수익을 받을 수 있어요. 🤗

https://inf.run/ZC6AE