📚 학습 기록/Dart & Flutter 기초

다트 기초 완전정복: For-in부터 TypeDef까지 (코드 팩토리 Dart 강의 정리)

zenjoydev 2025. 4. 3. 20:28

안녕하세요, 여러분!

오늘은 Flutter 앱 개발의 기반이 되는 Dart 언어 기초 문법에 대해 알아볼게요.

코드 팩토리의 Dart 강의를 들으며 정리한 내용을 공유합니다.

특히 오늘은 반복문부터 typedef까지 핵심 개념을 친절하게 설명해 드릴게요! 😊

 

📌 오늘의 핵심 개념

  • For-in 반복문
  • Enum(열거형)
  • 함수의 파라미터 종류
  • 화살표 함수
  • TypeDef의 개념과 활용

반복문 (For-in)

자바나 다른 언어에서도 접했을 for문, Dart에서는 조금 더 편리한 for-in 구문을 제공해요!

 

void main() {
  // 기본 리스트 생성
  List<String> fruits = ['사과', '바나나', '딸기', '수박'];
  
  // for-in 반복문 사용
  for (String fruit in fruits) {
    print('나는 $fruit을(를) 좋아해요!');
  }
}

for-in 반복문은 해당 컬렉션(리스트, 맵, 셋 등)의 각 요소를 하나씩 가져와서 처리합니다. 자바의 for-each와 유사하지만 훨씬 간결하고 직관적이죠!

💡 주의하세요!
무한루프에 빠지지 않도록 조심하세요. 특히 while문 사용 시 종료 조건을 꼭 확인해 주세요.

Enum(열거형)

Enum은 서로 연관된 상수들의 집합을 정의할 때 사용해요. 자바의 enum과 거의 동일한 개념이랍니다.

 

// 색상을 나타내는 enum 정의
enum Color {
  red,
  green,
  blue,
  yellow
}

void main() {
  // enum 사용하기
  Color myColor = Color.blue;
  
  // switch와 함께 사용
  switch (myColor) {
    case Color.red:
      print('빨간색이네요!');
      break;
    case Color.green:
      print('초록색이네요!');
      break;
    case Color.blue:
      print('파란색이네요!');
      break;
    case Color.yellow:
      print('노란색이네요!');
      break;
  }
}

enum을 사용하면 코드의 가독성이 높아지고, 오타로 인한 버그를 줄일 수 있어요. 특히 상태 관리나 유형 구분에 매우 유용합니다!

함수의 파라미터 종류

Dart는 파라미터를 전달하는 여러 방식을 제공해요. 각각의 특징을 살펴볼게요!

1. 포지셔널 파라미터 (Positional Parameter)

가장 기본적인 파라미터 전달 방식으로, 순서가 중요해요.

void greet(String name, int age) {
  print('안녕하세요! 저는 $name이고, $age살입니다.');
}

void main() {
  greet('철수', 25); // 순서대로 전달해야 해요
}

2. 옵셔널 파라미터 (Optional Parameter)

선택적으로 전달할 수 있는 파라미터예요. 대괄호 []로 감싸서 표현해요.

void introduce(String name, [int? age, String? hobby]) {
  print('안녕하세요! 저는 $name입니다.');
  
  if (age != null) {
    print('제 나이는 $age살이에요.');
  }
  
  if (hobby != null) {
    print('취미는 $hobby입니다.');
  }
}

void main() {
  introduce('영희');                    // 이름만 전달
  introduce('민수', 30);                // 이름, 나이 전달
  introduce('지혜', 28, '독서');         // 모든 정보 전달
}

옵셔널 파라미터를 사용할 때는:

  • 숫자형이라면 기본값을 지정해 주세요 (예: [int age = 20])
  • 문자열이나 객체라면 nullable 타입을 사용하세요 (예: [String? hobby])

3. 네임드 파라미터 (Named Parameter)

이름이 있는 파라미터로, 순서에 상관없이 이름으로 구분해 전달할 수 있어요. 중괄호 {}로 감싸서 표현해요.

void createUser({
  required String name,
  required String email,
  int? age,
  String? address
}) {
  print('사용자 생성: $name, 이메일: $email');
  if (age != null) print('나이: $age');
  if (address != null) print('주소: $address');
}

void main() {
  createUser(
    email: 'hong@example.com',  // 순서가 바뀌어도 괜찮아요!
    name: '홍길동',
    age: 30,
    // address는 전달하지 않아도 됩니다
  );
}

네임드 파라미터의 장점:

  • 가독성이 좋아요
  • 선택적 매개변수 관리가 쉬워요
  • 순서가 자유로워요
  • 특히 Flutter에서 위젯 구성할 때 많이 사용해요!

화살표 함수 (Arrow Function)

화살표 함수는 함수의 본문이 단순할 때 간결하게 작성하는 방법이에요. 특히 리턴문 하나만 있는 경우 매우 유용해요!

// 일반 함수
int add(int a, int b) {
  return a + b;
}

// 화살표 함수로 변경
int addArrow(int a, int b) => a + b;

void main() {
  print(add(5, 3));      // 8
  print(addArrow(5, 3)); // 8 (동일한 결과)
}

화살표 함수는 => 기호를 사용하며, 리턴 키워드와 중괄호를 생략할 수 있어요. 코드가 훨씬 간결해지죠!

TypeDef의 개념과 활용

TypeDef는 함수 타입에 별칭을 부여하는 기능이에요. 함수도 변수처럼 타입을 가질 수 있는데, 이 타입 시그니처(반환 타입과 파라미터의 형태)가 복잡할 때 typedef로 간단하게 만들 수 있어요.

// 함수 타입 정의
typedef Calculate = int Function(int a, int b);

// 계산 함수들
int add(int a, int b) => a + b;
int subtract(int a, int b) => a - b;
int multiply(int a, int b) => a * b;

// typedef를 활용한 함수
void calculator(int x, int y, Calculate operation) {
  print('계산 결과: ${operation(x, y)}');
}

void main() {
  // 다양한 연산을 하나의 함수로 처리
  calculator(10, 5, add);      // 계산 결과: 15
  calculator(10, 5, subtract); // 계산 결과: 5
  calculator(10, 5, multiply); // 계산 결과: 50
  
  // 변수에 함수 할당하기
  Calculate myOperation = add;
  print(myOperation(20, 10)); // 30
  
  // 조건에 따라 다른 함수 사용하기
  bool isAdding = true;
  Calculate operation = isAdding ? add : subtract;
  print(operation(20, 10)); // 30 (add 함수 실행)
}

typedef의 장점:

  • 함수를 매개변수로 전달 가능
  • 런타임에 함수 변경 가능
  • 콜백 함수로 활용 가능

💡 중요 포인트
typedef는 함수를 실행하는 것이 아니라, 함수의 참조(주소)를 저장하는 거예요.
함수는 나중에 호출될 때 실행됩니다!

일반 함수는 런타임에 내용 변경이 불가능하지만, typedef를 사용하면 같은 시그니처를 가진 다른 함수로 쉽게 교체할 수 있어요. 이런 특성은 함수의 개선 기능이라고 볼 수 있죠!

알면 좋은 추가 기능들!

스프레드 연산자 (...)

컬렉션의 요소를 다른 컬렉션에 편리하게 삽입할 수 있어요.

void main() {
  List<int> list1 = [1, 2, 3];
  List<int> list2 = [0, ...list1, 4]; // [0, 1, 2, 3, 4]
  print(list2);
}

Late 키워드

변수 선언 후 나중에 초기화할 수 있게 해주는 기능이에요.

void main() {
  late String name;
  
  // 나중에 초기화
  name = '홍길동';
  print(name); // 정상 작동
}

이 키워드는 자바의 생성자 지연 초기화와 비슷한 개념이랍니다!

마치며

오늘은 Dart의 기초 문법 중 For-in 반복문부터 TypeDef까지 살펴봤어요. 특히 파라미터의 다양한 형태와 typedef의 활용법은 Flutter 앱 개발에서 정말 많이 사용되는 개념이니 꼭 익혀두세요!

다음 시간에는 이런 기초 개념을 활용한 간단한 프로젝트를 만들어볼 예정입니다. Dart의 기초를 튼튼히 다지고 Flutter의 멋진 세계로 함께 나아가요! 😊

다음 학습 계획

  • [25-04-04] 다트 기초 – 코드 팩토리 – Dart#1 마무리 및 기초 개념 정리용 프로젝트 시작하기

추가 노트

  • 주석으로 작업하는 습관을 들이면 코드의 가독성이 높아져요
  • 프린트 내용에 줄 바꿈을 원한다면 문자열 앞에 \n을 추가하세요!

여러분의 Dart 공부는 어떻게 진행되고 있나요? 궁금한 점이나 배우면서 어려웠던 부분이 있다면 댓글로 공유해 주세요! 함께 성장해요! 💪