guricode

Dart 공부 정리 - 타입 / 함수 파라미터 / 동기 비동기 본문

앱/Flutter&Dart

Dart 공부 정리 - 타입 / 함수 파라미터 / 동기 비동기

agentrakugaki 2025. 6. 16. 20:52

 

1. Dart의 주요 타입 정리

int       정수 타입                     int count = 10;
double    실수 타입                     double pi = 3.14;
String    문자열                        String name = 'Dart';
bool      참/거짓                       bool isOk = true;
List      순서 있는 값의 집합            List<int> nums = [1, 2, 3];
Map       key-value 쌍의 집합            Map<String, String> map = {...}
Set       중복 없는 값의 집합            Set<int> s = {1, 2};
dynamic   어떤 타입이든 가능             dynamic x = 1; x = 'hi';
var       타입 자동 추론 변수            var name = 'Kim';
final     변경 불가 변수 (런타임 상수)     final a = DateTime.now();
const     컴파일 시점 상수              const b = 123;

자주 쓰는 타입은 꼭 외워두도록 하자.

dart의 타입은 java에 비해 간단한 모습...편하게 만들어~ 라는 느낌

타입 크기 (표준 기준)

int      64비트 (8바이트)
double   64비트 (8바이트)
bool     최소 1바이트 이상
String   2바이트 × 문자 수
List     요소 수에 따라 가변
Map      키/값 수에 따라 가변
Set      요소 수에 따라 가변
dynamic  실제 타입에 따라 다름

특이한 점은 intdouble을 제외하면 대부분 크기가 "가변"이라는 점이다.
생산자 입장에서 보면 타입을 일일이 고려하지 않고 작업할 수 있어 편리하다.
이런 이유로 Dart가 이렇게 설계된 게 아닌가 싶다.

근데 이렇게돼도 db에서는 따로 지정을 해줘야하는것이 아닌가? 그러면 소용이 없지 않을까 싶다..앞단에서는 자유롭게 쓸수 있을것같다

  • var: 타입을 자동으로 추론하지만 한 번 정해진 타입은 바꿀 수 없다.
  • dynamic: 타입을 자유롭게 바꿀 수 있다.
  • null-safety: 변수에 null을 허용하지 않으며, 허용하려면 ?를 타입 뒤에 붙인다. 예: int? a

 


2. Dart 함수 파라미터

1) 포지셔널 파라미터

인자를 순서대로 전달하는 방식이다.


void sayHello(String name, int age) {
  print("안녕하세요, $name님! 나이는 $age살이군요.");
}

void main() {
  sayHello("민수", 20); // 순서 중요!
}
  • 인자의 순서가 중요하다.
  • 간단한 함수에 적합하다.

2) 네임드 파라미터

함수 호출 시 이름을 명시하여 인자를 전달하는 방식이다.

솔직히 네임드 파라미터가 가독성도 좋고 더 많이 쓰일것같은데.... dart에서도 이 방식을 추천하고 있다.


void registerUser({required String name, required int age}) {
  print("회원가입 완료: 이름=$name, 나이=$age");
}

void main() {
  registerUser(name: "수지", age: 25); // 순서 상관 없음!
}
  • 순서 상관 없이 사용 가능하다...왜냐면 이름을 명시했으니까....
  • Dart에서는 네임드 파라미터 방식을 추천한다....

2-1) 네임드 파라미터의 옵셔널

말 그대로 파라미터를 선택적으로 넣을 수 있는 것이다.

포지셔널 파라미터는 required를 사용하지 않으니 사용할수 없을거라고 예상된다....

여기서 필수인건 네임드파라미터인  required로 표시하고 선택적인 파라미터는 required를 넣지 않은 것으로 표현한다.


int add({required int frontValue, required int endValue, int? expansionValue}) {
  int sum = frontValue + endValue + (expansionValue ?? 0);
  return sum;
}

void main() {
  int result = add(frontValue: 3, endValue: 5);
  int result2 = add(frontValue: 3, endValue: 5, expansionValue: 3);
  print('결과: $result');   // 출력: 결과: 8
  print('결과: $result2');  // 출력: 결과: 11
}

? 를 붙여서 null값을 허용하도록 만들었다 (int? expansionValue).

2-2) 병합 연산자 ??

왼쪽의 값이 null일 경우 오른쪽 값을 반환한다.


void main() {
  int? expansionValue;
  int result = expansionValue ?? 0;
  print(result); // 0

  expansionValue = 5;
  result = expansionValue ?? 0;
  print(result); // 5
}

숫자 + 문자열 응용


void add({
  required int frontValue,
  required int endValue,
  String? expansionValue,
}) {
  String expansionString = expansionValue ?? '';
  int sum = frontValue + endValue + (int.tryParse(expansionString) ?? 0);
  print('결과: ${sum}${expansionString}');
}

void main() {
  add(frontValue: 3, endValue: 5);
  add(frontValue: 3, endValue: 5, expansionValue: '3');
  add(frontValue: 3, endValue: 5, expansionValue: 'abc');
  add(frontValue: 3, endValue: 5, expansionValue: '');
  add(frontValue: 3, endValue: 5, expansionValue: 'xyz');
}
  • expansionString은 null이면 빈 문자열로 대체
  • int.tryParse()로 숫자 변환 시도, 실패하면 null
  • ?? 0을 이용해 null을 0으로 대체
  • 헷갈린다면 코드 반복해서 읽어보자!!

3. 동기 / 비동기

동기: 입력된 순서대로 실행


void main() {
  print('작업 1 시작');
  performTask();
  print('작업 1 완료');
}

Future performTask() async {
  await Future.delayed(Duration(seconds: 2));
  print('작업 2 실행');
}

출력:

작업 1 시작
작업 1 완료
작업 2 실행
  • Future<void> performTask() async → 비동기 함수이며 값을 반환하지 않음
  • await → 해당 작업이 끝날 때까지 기다림
  • Future.delayed → 2초 지연

비동기를 동기처럼 실행하기


void main() async {
  print('작업 1 시작');
  await performTask();
  print('작업 1 완료');
}

Future performTask() async {
  await Future.delayed(Duration(seconds: 2));
  print('작업 2 실행');
}

출력:

작업 1 시작
작업 2 실행
작업 1 완료

main()async를 붙이고 awaitperformTask()를 기다리면 순차적으로 실행된다.


글이 너무 길어지니 위젯 트리와 클래스 정리는 다음 글에서 이어서 작성할 예정