flutter

Dart

Oct 10, 2020

Dart 요약

1. 연습환경

https://dartpad.dev/

2. 주석

3. 문장

print('hello world');
print("hello world");

4. 변수

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

한 번 설정한 값을 변경하지 못 하도록 한다.

final DateTime now = DateTime.now(); // 문제 없음
// const DateTime now = DateTime.now(); // compile error

7. 산술연산자

assert() 함수는 계산 결과가 참인지 검사한다. dartpad같은 웹에서는 동작 안 함

assert(2+3 == 5); // true

8. 증감연산자

++, —

9. 비교연산자

==, !=, >, <, >=, <=

10. 논리연산자

&&, ||, ==, !, !=

11. 타입 검사

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이 있다.

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, '헬로'];