언제 var을 사용하고 언제 타입 명시할까?
메소드 안에서 지역변수 선언 : var, dynamic(var이랑 dynamic이랑 같다고 보면 된다. dynamic타입은 계속 value의 타입이 변해도 괜찮다. 정말 필요할때만 사용하자.)
클래스 필드 정의 : 타입명시
타입체크 키워드 : is
e.g. if(name is String){print(name.length);}
null safety : 개발자가 null참조 못하도록 강제함.
기본적으로는 null을 넣지 못하게 되어있고(기본적으로 Nullable이 아니고) null을 허용하려면 코틀린과 동일하게 ? 를 넣어야한다. (String? name = "parker") 다만 이 상황에서는 개발자가 코드상으로 Null check를 해주어야 안전하다. 이를 위해 isNotEmpty를 사용한다.
자바와 동일하게 final 키워드 존재
아래와 같은 패턴 가능
final name = "name";
final String name = "name";
코틀린의 lateinit과 비슷한 late키워드 존재
아래 패턴이 가능해짐.
late final String name;
name = "abc";
dart에는 const와 final키워드 둘 다 존재함.
final은 자바의 final이라고 생각하고 const는 static이라고 생각하자. dart에서 const 상수는 compile-time constant를 만들어준다. 컴파일 시간에 동작하니까 static메모리에 적재하는건 아니지만(CustomClass.variable)처럼 접근은 못하지만 컴파일 시간에 값이 할당된다.
기본 프리미티브타입도 거의 다 object타입이다.
list의 선언방식은 아래와 같다.
var numbers = [1, 2, 3, 4];
dynamic numbers = [1, 2, 3, 4];
List<int> numbers = [1, 2, 3, 4];
선언 시 데이터 맨뒤에 ,를 붙여주면 자동으로 한 줄에 한 아이템씩 포매팅해준다.
값 집어넣는 패턴은 다음과 같다.
number.add(5);
collection if가 존재한다.
var iAmFiveFlag = true;
var numbers = [1, 2, 3, 4, if(iAmFiveFlag) 5] // 여기서 5 추가함
ui에 대해 사용자가 로그인 했는지 안했는지에 대해 체크해서 가능
String interpolation
text에 변수를 추가하는 방법. 코틀린과 똑같다.
var name = "kevin";
var personAge = 5;
var agingRate = 3;
var message = "this is $name speaking who got ${personAge + agingRate} years old";
print(message);
'를 표현하려면 앞에 \ 를 추가한다.
collection for
var oldData = ["a", "b", "c"[;
var newData = ["d", "e", "f", for(var data in oldData) "$data",];
map
map = dictionary
var person = {
'name' : 'kevin',
'age': 20,
'height': 163.4,
}
dart의 최상위 클래스는 Object
Map<List<int>, bool> player = {
[1,2,3,4,5]: true
}
set
Set<int> numbers = {1,2,3,4};
unique 보장
function
dart에서 함수는 한줄짜리도 정의 가능
String sayHello(String name) => "Hello $name";
String sayHello(String name){
return "Hello $name";
}
named parameter지원 (중괄호 필수)
String sayHello({String name = "anon", int age = -1}){
print("age : $age name:$name";
}
sayHello(age: 12, name:'kevin');
required 지원
String sayHello({required String name, required int age}){
print("age : $age name:$name";
}
sayHello(age: 12, name:'kevin');
not required지원
String sayHello({required String name, [required int? age= -1]){
print("age : $age name:$name";
}
sayHello(name:'kevin');
operator
? :: nullable
String capitalizeName(String? name) => name != null ? name.toUppercase() : 'ANON';
String capitalizeName(String? name) => name.toUpperCase() ?? 'ANON'; ( ?? 의 좌항이 null이면 우항을 return) (QQ operator)
String? name;
name ??= "ANON"; (??의 좌항이 null이면 값을 대입)
typedef
c에서 typedef생각하자.
typedef ListOfInts = List<int>;
ListOfInts foo1(){
}
class
자바처럼 new 키워드 사용할 필요 없이 그냥 val cc = CustomClass() 로 사용하면 된다.
dart의 필드는 default 접근제어자가 아니라 public이라 그냥 .찍고 호출이 가능하다.
constructor
다른 언어와 기본적인 사용법은 똑같지만 아래와 같은 방식도 가능
class CustomClass{
String name;
int age;
CustomClass(this.name, this.age);
}
named constructor도 지원
cacade notation지원
void main(){
var nico = Player(name: 'nico', xp:1, team: 'red');
nico.name = 'las';
nico.xp = 1200000;
nico.team = 'blue';
}
==>
void main(){
var nico = Player(name: 'nico', xp:1, team: 'red');
..name = 'las';
..xp = 1200000;
..team = 'blue';
}
abstract class 지원
mixin 지원
mixin :: 생성자가 없는 클래스
중간에 properties를 추가하기 용이함
extends로 상속이 아닌 with 키워드를 이용해 프로퍼티와 메서드를 현재 클래스에 [담아준다]
'dart' 카테고리의 다른 글
Intro to Dart for Java Developers 정리(1) (0) | 2022.03.16 |
---|