인프런 무료 강의
https://www.inflearn.com/course/lecture?courseSlug=dart-%EC%96%B8%EC%96%B4-%EC%9E%85%EB%AC%B8&unitId=107600
DartPad
https://dartpad.dev/
Dart
는 구글에서 개발한 프로그래밍 언어
크로스 플랫폼
애플리케이션 개발을 위해 사용, 주로 모바일 앱 및 웹 애플리케이션을 개발하는 데에 이용
객체 지향 프로그래밍
과 함수형 프로그래밍
의 특징을 결합, 유연하면서도 강력한 언어
Just-in-Time
컴파일러와 Ahead-of-Time
컴파일러를 지원
Just-in-Time
컴파일러는 개발자가 코드를 작성하면서 실시간으로 컴파일하여 실행하는 기능, 개발자들이 빠른 개발과 디버깅을 할 수 있게 함
Ahead-of-Time
컴파일러는 미리 코드를 컴파일하여 기계어로 변환, 실행 속도가 향상되고 모바일 앱의 성능을 최적화
Flutter
라는 UI 프레임워크를 통해 Dart를 사용하면 iOS, Android, 웹 및 데스크톱 애플리케이션을 모두 개발 가능!
var
는 할당된 값에 따라 타입이 유추된다.print(name.runtimeType)
으로 type 확인 가능var name = 'Ellie';
print(name.runtimeType); // String
name = 123; // 타입 비동일로 에러!
name = 'Amy';
int num = 10;
double num = 5.0;
double num2 = 2.2;
print(num+num2); // 7.2
bool isTrue = true;
String
String name = 'Ellie';
var
와 달리 재할당 시, 다른 타입을 넣어도 됨var num = 10;
dynamic num2 = 20;
num = 'hi'; // 타입 비동일로 에러!
num2 = false; // dynamic type 은 에러가 뜨지 않음
null
: 아무런 값도 있지 않다.nullable
: null이 될 수 있다.non-nullable
: null이 될 수 없다.String? name = 'ellie';
// ? 붙이면 nullable 이 됨
// String 일수도 있고, null 일수도 있다.
print(name!);
// ! 붙이면 현재 이 값은 null이 아니다라는 뜻
// null
double? num = 5.0;
// double 도 되고, null 도 될 수 있다는 의미
num ??= 1.0;
// ??= 는 왼쪽이 null 이면, 오른쪽으로 바꿔라.
final int num1 = 10;
const String num2 = '20';
// type 제거 가능!
final num3 = 30;
const num4 = 40;
// + type 이 맞는지 확인하고 싶을 때?
final ellie = 'name';
print(ellie is String); // true
print(ellie is int); // false
print(ellie is! bool); // true
List<String> sushi = ['연어', '광어', '계란', '새우'];
List<double> numbers = [10.2, 10.0, 11.78, 9.6];
print(sushi.length); // 4
print(sushi.indexOf('연어')); // 0
// List 에 추가
sushi.add('장어');
// List 에서 제거
sushi.remove('새우');
print(sushi); // [연어, 광어, 계란, 장어]
Map<String, int> myNote = {
'ice cream': 3000,
'tissue': 1000,
'sandwich': 4500,
};
// Map 에 값을 추가하고 싶을 때
myNote.addAll({
'tumbler': 17000,
});
print(myNote);
// => {ice cream: 3000, tissue: 1000, sandwich: 4500, tumbler: 17000}
// Map 에 있는 value 값을 가져오고 싶을 때
print(myNote['ice cream']);
// => 3000
// Map 에 값을 추가하고 싶을 때
myNote['candy'] = 500;
print(myNote);
// => {ice cream: 3000, tissue: 1000, sandwich: 4500, tumbler: 17000, candy: 500}
// Map 에 있는 값을 수정하고 싶을 때
myNote['tissue'] = 990;
print(myNote);
// => {ice cream: 3000, tissue: 990, sandwich: 4500, tumbler: 17000, candy: 500}
// Map 에 있는 값을 삭제하고 싶을 때
myNote.remove('candy');
print(myNote);
// => {ice cream: 3000, tissue: 990, sandwich: 4500, tumbler: 17000}
print(myNote.keys); // (ice cream, tissue, sandwich, tumbler)
print(myNote.values); // (3000, 990, 4500, 17000)
final Set<String> names = {
'hyun joo',
'ellie',
'orange',
'ellie'
};
print(names); // {hyun joo, ellie, orange} 중복 'ellie' 자동 제거
names.add('또롱이');
names.remove('orange');
print(names); // {hyun joo, ellie, 또롱이}
// Set 안에 어떤 요소가 있는지 없는지 확인하기
print(names.contains('ellie')); // true
enum Status {
approved,
pending,
rejected,
}
void main() {
Status status = Status.rejected; // 자동완성됨
if (status == Status.approved) {
print('승인');
} else if (status == Status.pending) {
print('대기');
} else {
print('거절');
}
}
// void - 공허
// void 자리에는 return 할 타입을 지정해주는 곳
void main() {
addNum(10, 90, 20);
}
addNum(int a, int b, int c) {
print(a+b+c); // 120
}
기본값
을 정해줘야 함)[]
대괄호로 감싸기void main() {
addNum(10, 90, 20);
}
addNum(int a, [int b = 0, int c = 0]) {
print(a + b + c);
}
void main() {
addNum(b: 90, c: 20, a: 10); // 순서 뒤바뀌어도 상관없음. 이름으로 인식
addNum2(z: 12, x: 9);
addNum3(5, b: 12);
}
int addNum({required int a, required int b, required int c}) {
print(a + b + c); // 120
}
// named parameter + optional parameter (required 삭제)
// 기본값 정해주기
int addNum2({required int x, int y = 0, required int z}) {
print(x * y * z); // 540
}
// positional parameter + named parameter + optional parameter
int addNum3(int a, {required int b, int c = 0}) {
int sum = a + b - c;
print(sum);
return sum; // 17
}
// arrow fn 화살표 함수 예시 => 만 추가
int addNum4(int a, {required int b, int c = 0}) => a + b * c;
void main() {
// Operation signature 를 사용하여, 같은 모양의 substract 를 입혀 사용
Operation mine = subtract;
int result = mine(30, 20, 1);
print(result);
int result2 = calculate(5, 2, 2, add);
print(result2);
}
// signature
// 해당 signature 과 같은 모양의 함수들을 입힐 수 있음
typedef Operation = int Function(int a, int b, int c);
int add(int x, int y, int z) => x + y + z;
int subtract(int m, int n, int o) => m - n - o;
// 위 방식보다, 이런 방식으로 많이 사용함
int calculate(int x, int y, int z, Operation mine) => mine(x, y, z);