Dart 요약
1. 연습환경
2. 주석
- // : 한 줄 주석
- /_ … _/ : 여러 줄 주석
- /// : 문서주석
3. 문장
- 세미콜론은 필수로 붙여야 한다.
- 문자열 묶음은 작은따옴표 또는 큰따옴표 사용한다. (작은따옴표가 표준)
print('hello world');
print("hello world");
4. 변수
- int : 정수
- double : 실수(소수점)
- String : 문자열
- bool : 참/거짓
- num : int와 double타입이 포함된다.
int a = 10;
double b = 20.0;
b = a // error : dart에서는 자동형변환을 지원하지 않는다.
num c = a; // ok
c = b; // ok
5. 타입추론
타입을 직접 명시하지 않고 var로 대체하는 타입추론이 가능하다.
var i = 1;
var s = 'hello';
var b = true;
6. 상수 final, const
한 번 설정한 값을 변경하지 못 하도록 한다.
- const : 컴파일 타임에 상수를 정의할 수 있다.
- final : 런타임에 결정된 값을 설정할 수 있다.
final DateTime now = DateTime.now(); // 문제 없음
// const DateTime now = DateTime.now(); // compile error
7. 산술연산자
- + : 더하기
- - : 빼기
- * : 곱하기
- / : 나누기(double)
- ~/ : 몫(int)
- % : 나머지(int)
assert() 함수는 계산 결과가 참인지 검사한다. dartpad같은 웹에서는 동작 안 함
assert(2+3 == 5); // true
8. 증감연산자
++, —
9. 비교연산자
==, !=, >, <, >=, <=
10. 논리연산자
&&, ||, ==, !, !=
11. 타입 검사
- is : 같은 타입이면 true
- is! : 다른 타입이면 true
int a = 10
if(a is int) {
print('정수');
}
12. 형변환 as
var c = 30.5;
ind d = c as int;; // error
int, double은 모두 num을 구현하는 타입이지만 서로 관계가 없으므로 형변환 불가능하다.
13. 함수
java의 함수와 비슷하다.
반환값이 void이면 생략가능하다.
print() 함수에서 변수 앞에 $ 기호를 붙여 문자열 내에 변수를 삽입한다.
String _name = '홍길동';
int _age = 33;
print('$_name은 $_age살입니다.');
14. 함수와 메서드
클래스 밖에 작성하는 함수를 최상위 함수라고 한다.
최상위함수는 어디에서나 호출할 수 있는 함수이다.
클래스 내부에 작성하는 함수를 메서드라 부르며, 정의된 클래스에 관계된 기능을 수행한다.
클래스 내부에 선언된 함수라고 static 키워드를 붙이면 정적 메서드가 되며 함수로 볼 수 있다.
static 키워드가 붙은 함수는 최상위함수처럼 사용할 수 있다.
15. 익명함수, 람다식
(number) {
return number % 2 == 0;
}
(number) => number % 2 == 0;
16. 선택 매개변수
함수의 정의에서 {} 로 감싼 매개변수는 선택적으로 사용할 수 있다.
void something(String name, {int age}){}
void main() {
something('홍길동', age:10); // ok
something('홍길동'); // ok
something(age:10); // error
something(); // error
}
17. 분기
if, else if, else
18. 삼항 연산자
var todo = isRainy ? '빨래를 하지 않는다.' : '빨래를 한다.';
19. switch case
20. for
21. class
var person = new Person();
var gildong = Person(); // new키워드 생략 가능
22. 접근 지정자
변수명 앞에 _ 기호를 붙이면 외부에서 접근이 불가능하다. (private)
class Person {
String _name;
int _age;
void addOneYear() {
age++;
}
}
void main() {
var gildong = Person();
gildong.name = 'gildong'; // error
}
23. 생성자
class Person {
String name;
int age;
//Person(this.name, this.age); // 기본생성자
Person({this.name, this.age}); 선택매개변수 사용시 기본매개변수도 사용 가능
}
void main() {
var gildong = Person(); // ok
var gildong = Person('gildong', 31); // ok
}
24. getter setter
_ 를 붙이면 프라이빗 변수이므로 클래스 외부에서 접근하기 위해서는 getter, setter 메서드가 필요하다.
class Bicycle {
int cadence;
int _speed;
int gear;
Bicycle(this.cadence, this._speed, this.gear);
int get speed => _speed;
set speed(int speedNum) {
_speed = speedNum;
}
void applyBrake(int decrement) {
_speed -= decrement;
}
void speedUp(int increment) {
_speed += increment;
}
}
void main() {
var bike = new Bicycle(2, 100, 1);
print(bike._speed);
bike.speed = 10;
print(bike._speed);
}
25. 상속
class Hero {
String name = '영웅';
void run(){}
}
class SuperHero extends Hero {
void run(){
super.run();
this.fly();
}
void fly(){}
}
void main() {
var hero = SuperHero();
hero.run(); // ok
hero.fly(); // ok
print(hero.name); // 영웅
}
26. 추상 클래스
추상 메서드는 선언만 되고 정의가 없는 메소드
추상 클래스는 추상 메서드를 포함하는 클래스
추상 클래스는 인스턴스화 할 수 없고 다른 클래스에서 implement 하여 기능을 완성하는 상속재료
이 때 대상 클래스에는 implements 메서드에는 @override 키워드를 사용한다.
abstract class Monster {
void attack();
}
class Goblin implements Monster {
@override
void attack() {
print('고블린 어택');
}
}
class Bat implements Monster {
@override
void attack() {
print('할퀴기');
}
}
여러 추상 클래스를 한 번에 implement하기
abstract class Flyable {
void fly();
}
class Bat implements Monster, Flyable {
@override
void atttack() {
print('할퀴기');
}
@override
void fly() {
print('펄럭펄럭');
}
}
27. 믹스인
with 키워드를 사용하면 상속하지 않고 다른 클래스의 기능을 가져오거나 오버라이드 할 수 있다. 이러한 기능을 믹스인(mixin)이라고 한다.
class Goblin implements Monster {
@override
void attack() {
print('고블린 어택');
}
}
class DarkGoblin extends Goblin with Hero {
// DarkGoblin은 Goblin이기도 하며 Hero이기도 하며 Monster이기도 하다.(다형성)
}
28. 열거 타입
enum은 상수를 정의하는 특수한 형태의 클래스이다.
enum Status {login, logout}
var authStatus = Status.logout;
switch(authStatus) {
case Status.login:
print('로그인');
break;
case Status.logout:
print('로그아웃');
break;
}
29. 컬렉션
dart에서 기본으로 제공하는 자료구조 컬렉션에는 List, Map, Set이 있다.
- List : 같은 타입의 자료를 여러 개 담을 수 있고 특정 인덱스로 접근할 수 있다.
- Map : key / value의 쌍으로 지정할 수 있고, 키를 통해 값을 얻는다.
- Set : 중복이 허용하지 않고, 찾는 값이 있는지 없는지 판단하고자 할 때 사용한다.
29.1 List
순서가 있는 자료를 담는 컬렉션 다른 언어에서는 대부분 배열을 제공하나 dart에서는 배열을 제공하지 않는다.
List<String> items = ['자바', '코틀린', '스위프트'];
items[0] = '다트'; // 인덱스는 0부터 시작
print(items.length); // 3
print(items[2]); // 코틀린
//print(items[3]); // error
for(var i = 0; i < items.length; i++) {
print(items[i]); // 다트 코틀린 스위프트
}
모든 타입을 대변하는 dynamic이라는 특수한 타입이 있다.
// List<dynamic> == var
List<dynamic> list = [1, 2, 4, '헬로'];
var list = [1, 2, 4, '헬로'];