1. dart-web
dart로 쓴 코드를 JS로 변환해주는 컴파일러
2. dart-native
dart로 쓴 코드를 다양한 운영체제에 맞게 변환해주는 컴파일러
1. JIT 컴파일러
개발중에는 dartVM을 이용하여 내가 쓴 코드의 결과를 바로 보여준다.
2. AOT 컴파일러
배포할때는 내가 쓴 코드를 기계어로 변환하여 앱을 빠르게 만들어준다.
프로그램을 더욱 안전하게 만들어준다.
// 명령어: dart run main.dart
void main(){
print('Hello World!');
}
var name = 'ho998';
dynamic whatever;
whatever = 123;
whatever = 'string';
whatever = true;
String? name = 'name'; // String or Null 이다.
name?.length; // name이 null이 아닐 경우에 length 구하기
개발자가 null값을 참조할 수 없도록 한다.
final name = 'test';
final isWork = true;
한번 선언한 변수의 값을 수정할 수 없다.
const와 비슷하다.
late final APIdata;
// do something ...
APIdata = 'apidata';
초기 데이터없이 변수선언이 가능하다.
추후에 데이터를 넣는 방식으로 사용된다. (API 통신에서 많이 쓰임)
const max_allowed_price = 15000;
const API_KEY = '...';
// static 사용 X
class notStatic {
int number = 10;
}
notStatic test = notStatic();
print(test.number); // 10
// static 사용 O
class Player {
static int hp = 10;
static const int mp = 20;
}
print(Player.hp); // 10
Player.hp++;
print(Player.hp); // 11
print(Player.mp); // 20
객체 선언없이 변수에 접근할 수 있게 도와준다.
값 변경을 하지 못하게 하기 위해서는 static const
를 사용한다.
String name = 'name';
bool isWork = false;
int age = 123;
double cm = 12.43;
num intOrDouble = 12;
num은 int,double의 부모 class격이다.
var numbers1 = [1,2,3,4,5]; // 정수형 리스트 1
List<int> numbers2 = [1,2,3,4,5] // 정수형 리스트 2
var isFive= true;
var numbers = [
1,
2,
3,
4,
if(isFive) 5,
]; // isFive가 true면 리스트에 5를 추가
var velog = 'velog';
var text = '이건 $velog 블로그 입니다.'; // 이건 velog 블로그 입니다.
var age = 10;
var text = '${age + 2}는 몇으로 나올까'; // 12는 몇으로 나올까
var oldYears = ['2020', '2021', '2022'];
var years = [
for (var oldYear in oldYears) oldYear,
'2023',
'2024',
'2025',
];
print(years); // [2020, 2021, 2022, 2023, 2024, 2025]
// Map<String, Object>의 타입을 갖고있는 monster 변수
var monster = {
'name': 'lizard',
'type': 'fire',
'hp': 20.25,
'mp': 19.10,
};
// Map<String, Object>의 타입을 갖고있는 player 변수
Map<String, Object> player = {
'name': 'jack',
'job': 'knight',
'hp': 10.15,
'mp': 5,
};
Object는 Typescript에 any와 같다.
var numbers = {1,2,3,4,5};
Set<String> names = {'jack','hanna','tom'};
Set의 값은 유니크하다 = 중복값이 없다.
void returnVoid(String name){
print('hello $name !!!');
}
String returnString(String name){
return 'hello $name @@@';
}
void sayHello(String name, String country, int age){
print('이름은 $name이고, 나라는 $country이며, 나이는 $age 입니다.');
}
sayHello('choi','korea',22); // argument의 위치를 외워야 한다.
void sayHello({
required String name,
required String country,
required int age}) {
print('이름은 $name이고, 나라는 $country이며, 나이는 $age 입니다.');
}
sayHello({
name: 'choi',
country: 'korea',
age: 22,
}); // argument가 무엇인지 정확히 파악된다.
void sayHello(
String name,
int age,
[String? country = 'korea']){
print('이름은 $name이고, 나라는 $country이며, 나이는 $age 입니다.');
}
sayHello('choi', 22); // choi, 22, (korea)
country 변수의 default값은 'korea'이고, 선택적으로 입력 가능하다.
String getUpper(String? text){
return text?.toUpperCase() ?? "TEXT IS NULL";
}
getUpper("choi"); // "CHOI"
getUpper(); // "TEXT IS NULL"
✅ [left ?? right]: left가 NULL이면, right를 반환한다.
String? name;
name ??= 'choi'; // name이 NULL이면 choi를 할당
name ??= 'zzz'; // name에 'choi'라는 값이 있으므로 실행되지 않음
✅ [left ??= right]: left가 NULL이면, left에 right를 할당한다.
typedef IntList = List<int>; // typedef
// typedef 적용
IntList reverseList(IntList list){
var reversed = list.reversed();
return reversed.toList();
}
class Player {
String name = 'anony';
int age = 50;
void sayHello(){
print('my name is $name !!');
}
}
void main(){
var player = Player();
player.sayHello(); // 'my name is anony !!'
}
class Player {
String name;
int age;
// ✅ 생성자 Constructor
Player(this.name, this.age);
}
void main(){
// ✅ 생성자 Constructor
var player = Player('choi', 25); // name='choi', age=25
}
class Player {
String name;
String job;
int age;
int key;
// ✅ Named Constructor Parameters
Player({
required this.name,
required this.age,
required this.key,
required this.job,
});
}
void main(){
// ✅ Named Constructor Parameters
var player = Player(
name : 'choi',
age: 25,
key: 199,
job: 'dev',
); // name='choi', age=25, job='dev', key=199
}
class Player {
String name, team;
int age, points;
// 🔵 Named Constructor (Named Parameter)
Player.createBluePlayer({
required String name, required int age
}) : this.name = name,
this.age = age,
this.team = 'blue',
this.points = 0;
// 🔴 Named Constructor (Positional Parameter)
Player.createRedPlayer(String name, int age)
: this.name = name,
this.age = age,
this.team = 'red',
this.points = 0;
}
void main(){
// 🔵 Named Constructor (Named Parameter)
var bluePlayer = Player.createBluePlayer(
name: 'choi',
age: 23,
); // name='choi', age=23, team='blue', points=0
// 🔴 Named Constructor (Poisitional Parameter)
var bluePlayer = Player.createBluePlayer('kim', 31); // name='kim', age=31, team='red', points=0
}
class Player {
String name, team;
int points;
Player({
required this.name,
required this.team,
required this.points,
});
}
void main(){
// ✅ Cascade Operator
var kim = Player(name: 'choi', team: 'blue', points: 0)
..name='kim' // kim.name = 'kim';
..team='red' // kim.team = 'red';
..points=1500; // kim.points = 1500;
}
> CascadeOperator(..)는 가장 앞에 있는 class(kim)를 가르킨다.
enum Team = {red, blue}
class Player {
String name;
int points;
Team team; // ✅ enum Team
Player({
required this.name,
required this.team,
required this.points,
});
}
void main(){
// ✅ enum Team -> team='blue'
var kim = Player(name: 'kim', team: Team.blue, points: 0);
}
// ✅ 추상화 클래스
abstract class Human {
void walk(); // 추상화 메소드
}
// ✅ Inheritance(상속) = extends Human
class Player extends Human {
String name;
int age;
// ✅ 추상화 메소드 구현
void walk(){
print('플레이어는 걷는다');
}
}
// ✅ Inheritance(상속) = extends Human
class Coach extends Human {
String name;
int age;
// ✅ 추상화 메소드 구현
void walk(){
print('코치는 걷지 않는다.');
}
}