EDOC/Flutter 스터디 (2025-1)

[1.1 ~ 1.2] 다트 입문하기 / 다트 객체지향 프로그래밍

SpruceMoon 2025. 3. 22. 11:13

1장: 다트 입문하기

1.1 다트 개요

  • 다트(Dart)는 구글에서 개발한 프로그래밍 언어로, 주로 플러터(Flutter) 앱 개발에 사용됨.
  • 2011.10. GOTO 콘퍼런스에서 공개되었고, 자바스크립트 대체 목적 언어로 개발되었으나 이 시도는 실패.
  • JIT(Just-in-Time) 컴파일AOT(Ahead-of-Time) 컴파일을 지원하여 개발 속도를 높이고 최적화된 성능을 제공함.

1.2 다트 실행 환경

  • 다트는 웹 기반 실습 환경인 DartPad를 제공하여 간단한 코드를 실행할 수 있음.
  • main() 함수는 다트 프로그램의 진입점이며, 필수적으로 포함해야 함.
void main() {
  print('Hello World');
}

1.3 변수와 데이터 타입

  • 다트는 강타입 언어이지만 타입을 자동 추론할 수 있음.
  • 기본 데이터 타입
    • int, double, bool, String, List, Map, Set
  • var, dynamic, final, const의 차이점
    • var: 변수의 타입을 자동 추론.
    • dynamic: 어떤 타입이든 변경 가능.
    • final: 한 번 할당하면 변경 불가능.
    • const: 컴파일 타임 상수.
final String name = 'Dart';
const int year = 2023;

1.4 리스트(List), 맵(Map), 셋(Set)

  • List: 배열과 비슷하며 요소를 순차적으로 저장.
  • Map: key-value 구조로 저장.
  • Set: 중복을 허용하지 않는 컬렉션.
List<String> names = ['Alice', 'Bob', 'Charlie'];
Map<String, int> scores = {'Alice': 95, 'Bob': 88};
Set<int> uniqueNumbers = {1, 2, 3, 3, 4}; // 중복 제거됨

1.5 연산자

  • +, -, *, /, % 등의 기본 연산자.
  • ??, ??= (널 병합 연산자) 지원.
int? a;
print(a ?? 10); // a가 null이면 10 출력
a ??= 20;       // a가 null이면 20 할당

1.6 제어문

  • if-else, switch-case, for, while, do-while을 지원.
for (int i = 0; i < 3; i++) {
  print(i);
}

1.7 함수

  • 기본 함수
  • 선택적 매개변수
  • 람다 함수
  • 익명 함수
int add(int a, int b) => a + b;

void greet({String name = 'Guest'}) {
  print("Hello, $name!");
}

1.8 예외 처리

  • try-catch를 이용하여 오류를 핸들링.
try {
  int result = 10 ~/ 0;
} catch (e) {
  print("예외 발생: $e");
} finally {
  print("실행 완료");
}

2장: 다트 객체지향 프로그래밍

2.1 클래스(Class)와 객체(Object)

  • 객체지향 프로그래밍(OOP)의 기본 개념을 지원.
  • 클래스는 객체를 생성하는 템플릿 역할.
class Person {
  String name;
  int age;
  
  Person(this.name, this.age);

  void introduce() {
    print("안녕하세요, 저는 $name이고, 나이는 $age살입니다.");
  }
}

void main() {
  Person p = Person('홍길동', 30);
  p.introduce();
}

2.2 생성자(Constructor)

  • this 키워드를 이용해 멤버 변수 초기화.
  • 이름이 있는 생성자(fromMap)를 정의할 수도 있음.
class Idol {
  String name;
  int members;

  Idol(this.name, this.members);

  // 이름 있는 생성자
  Idol.fromMap(Map<String, dynamic> map)
      : this.name = map['name'],
        this.members = map['members'];
}

2.3 캡슐화 (Encapsulation)

  • private 멤버는 _(언더스코어)를 사용하여 정의.
class Idol {
  String _name;

  Idol(this._name);

  String get name => _name; // Getter
  set name(String newName) => _name = newName; // Setter
}

2.4 상속 (Inheritance)

  • extends 키워드를 사용하여 부모 클래스의 기능을 상속받음.
class BoyGroup extends Idol {
  BoyGroup(String name, int members) : super(name, members);

  void sayMale() {
    print("이 그룹은 남성 아이돌 그룹입니다.");
  }
}

2.5 메서드 오버라이딩 (Method Overriding)

  • @override 키워드를 사용하여 부모 클래스의 메서드를 재정의.
class GirlGroup extends Idol {
  GirlGroup(String name, int members) : super(name, members);

  @override
  void sayName() {
    print("걸그룹: ${this.name}");
  }
}

2.6 인터페이스 (Interface)

  • implements 키워드를 사용하여 인터페이스를 구현.
class Singer {
  void sing() => print("노래 부르는 중...");
}

class Idol implements Singer {
  String name;

  Idol(this.name);

  @override
  void sing() {
    print("$name이 노래를 부릅니다.");
  }
}

2.7 믹스인 (Mixin)

  • mixin 키워드를 사용하여 다중 상속을 흉내낼 수 있음.
mixin Dancer {
  void dance() => print("춤을 춥니다!");
}

class Idol with Dancer {}

void main() {
  Idol idol = Idol();
  idol.dance(); // "춤을 춥니다!" 출력
}

2.8 추상 클래스 (Abstract Class)

  • abstract 키워드를 사용하여 인스턴스를 만들 수 없는 클래스를 정의.
abstract class Animal {
  void makeSound(); // 구현되지 않은 추상 메서드
}

class Dog extends Animal {
  @override
  void makeSound() {
    print("멍멍!");
  }
}