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 {
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("멍멍!");
}
}