[Dart] What is Dart
다트 언어 연습환경
다트 문법은 main() 함수가 entry point이다.
void main() {
print("Hello,World!");
}
변수
기본타입
- int
- double
- String
bool
- num 타입
int, double은 num 타입에 포함된다.
다트에서는 자동 형변환을 지원하지 않음. 반면 num타입에는 int, double 타입 모두 대입할 수 있음.
타입 추론
다트는 타입을 직접 명시하지 않고 var로 대체할 수 있는 타입 추론을 지원함.
var i = 10;
var d = 10.0;
var s = "hello";
var b = true;
상수
final String name = "임수빈"
// 타입생략 가능
final name = "임수빈"
산술 연산자
- +
- -
- *
- /
- ~/ (몫 int타입)
- % (나머지 int 타입)
타입 검사
- is (같은 타입이면 true)
- is! (다른타입이면 true)
int a = 10;
if(a is int) {
print('정수');
}
String text = 'hello;
if(text is! int) {
print('숫자가 아님');
}
형변환
같은 타입끼리 변환이 안 되고 더 상위 개념으로 변환할 수 있다.
// int와 double은 모두 num을 구현하는 타입이지만 서로는 관계가 없기 때문에 형변환 불가능
var c = 30.5;
int d = c as int; // error
dynamic d = 30.5;
num n = d; // as num 생략 가능
함수
함수형태
int f(int x) {
return x + 10;
}
void main() {
var result = f(10);
}
// 반환 타입 역시 타입 추론에 의해 생략 가능
void greaeting(String greet) {
print('hello $greet');
}
// 위 코드와 동일
greeting(String greet) {
print('hello $greet');
}
변수 앞에 $ 기호를 붙여 문자열 내에 변수를 삽입할 수 있다.
String _name = '임수빈'
int _age = 20;
void main() {
print('$_name은 $_age살입니다.');
print('$_name은 ${_name.length} 글자입니다.);
print('10년 후에는 ${_age + 10}살입니다.);
}
함수, 메서드
main 메소드 처럼 가장 바깥에 작성한 함수는 어디에서나 호출할 수 있는 함수이며, 이 책에서 함수라고 칭하는 대부분은 이러한 최상위 함수를 가리킴.
클래스 내부에 작성하는 함수를 method라고 부르며, 정의된 클래스에 관계된 기능을 수행함.
큰 개념에서 함수와 메서드는 모두 함수이다. 클래스에 정의된 함수를 메서드라 구분지어 부를 뿐이다.
클래스 내부에 선언된 함수이더라도 static 키워드를 붙이면 정적 메서드가 되며 함수로 볼 수 있다. static 키워드가 붙은 함수는 최상위 함수처럼 사용할 수 있다.
class MyClass {
//정적 메소드, 함수
static bool isEven(int number) {
return number % 2 == 0;
}
}
...
print(MyClass.isEven(10));
익명 함수
([인수명]) { [동작 또는 반환값]}
(number) {
return number %2 == 0;
}
람다식
([인수명]) => [동작 또는 반환값]
(number) => number % 2 == 0;
선택 매개 변수
함수 정의에서 {}로 감싼 매개변수는 선택적으로 사용할 수 있다.
void something(String name, {int age}) {}
void main() {
something('홍길동',age: 10); // ok
something('홍길동'); // ok
something(age: 10); // error
something(); //error
}
// 선택 매개변수는 기본값을 지정할 수 있다.
void something(String name, {int age=10}){}
분기와 반복
if else
String text 'hello';
if (text is int) {
print('정수')
} else if (text is double) {
print('실수');
} else {
print('정수도 실수도 아님');
}
삼항 연산자
[조건] ? [참일 때] : [거짓일 때]
var todo = isRainy ? '빨래를 하지 않는다' : '빨래를 한다';
Switch case
조건에 맞는 값이 여러 개 일 때 유용한 문법.
특히 열거(enum) 타입과 함께 사용할 때는 모든 케이스를 검사해야 하는 강제성이 생김.
사람의 실수를 방지하는 이런 기능이 있어서 특수한 경우에는 if문 보다 유용함.
enum Status { Uninitialized, Authenticated, Authenticating, Unauthenticated}
void main() {
var status = Status.Authenticated;
swtich(Status) {
case Status.Authenticated:
print('인증됨');
break;
case Status.Authenticating:
print(인증 처리 중);
break;
case Status.Unauthenticated:
print('미인증');
break;
case Status.Uninitialized:
print('초기화');
break;
}
}
for
var items = ['짜장','라면','볶음밥'];
for(var i =0; i<items.length; i++) {
print(items[i]);
}
Class
플러터 코드를 작성할 때 new 키워드는 일반적으로 생략함
var person = new Person();
var person2 = Person();
접근 지정자
변수명 앞에 _ 기호를 붙이지 않으면 외부에서 접근 가능하고, 붙이면 접근 불가능합니다.
class Person {
String name;
int _age;
void addOneYear() {
_age++;
}
}
import 'person.dart';
...
var person = Person();
person._age = 10; //error
생성자
사용자 정의 생성자를 추가하면 기본 생성자를 사용할 수 없게 되지만, 선택 매개변수를 사용하면 Person()도 호출할 수 있다.
(기본 생성자를 호출한 것은 아니며, 모든 매개변수에 null을 대입한 생성자를 호출함.)
class Person {
String name;
int _age;
Person({this.name, this._age});
}
var person = Person();
var person2 = Person(name: '홍길동',_age:20);
Getter, Setter
class Person {
String name;
int _age;
int get age => _age;
}
import 'person.dart'
var person = Person();
print(person.age);
믹스인
with 키워드를 사용하면 상속하지 않고 다른 클래스의 기능을 가져오거나 오버라이드할 수 있다.
class DarkGoblin extends Goblin with Hero {
}
열거 타입
Enum type은 상수를 정의하는 특수한 형태의 클래스.
로그인과 로그아웃 두가지 상태만 있는 시스템에서는 사용할 상태를 열거 타입을 정의하면 유용함.
enum Status {login, logout}
Switch 문과 함께 사용하면 열거 타입으로 정의된 모든 상수를 case로 검토하도록 강제하기 때문에 에러방지하는 효과도 있다.
switch(authStaus) {
case Status.login:
print('로그인');
break;
case Satus.logout:
print('로그아웃');
break;
}
컬렉션
다트는 List, Map, Set등의 컬렉션을 제공
List
순서가 있는 자료를 담는 컬렉션
- 다트는 배열을 제공하지 않는다.
List<String> items = ['짜장','라면','볶음밥'];