1. Dart 언어의 특징
- Statically typed language
- 강력한 객체지향 언어
- 단일상속, mixin 지원
2. Type
- 기본 자료형
- int : 정수형
- double : 실수형
- num : int, double을 포함하는 타입
- bool : true, false
- String : 문자열 (' ')
- 집합 자료형
- List : 중복을 허용하며 순서가 있는 집합
- Set : 중복을 허용하지 않고 순서가 없는 집합
- Map : key-value 쌍으로 구성된 집합
타입 선언
- 기본 자료형 : 형식 변수명;
String name;
int age;
- 집합 자료형 : 타입<요소타입>;
List<int> numbers = [0, 1, 2];
Map<String, int> scores = {
'english' : 100,
'math' : 90,
'science' : 80
}
- 함수 : 반환타입 함수명;
void main() {
print('Hello!');
}
String greeting() {
return 'Hello!';
}
var/dynamic
- var : 타입 추론
var 키워드를 사용하면 타입을 선언하지 않아도 변수에 할당된 초기값에 따라 타입이 자동으로 추론됨 (단, 이후 해당 변수는 타입 변경 불가)
void main() {
var age = 5; //int
var name = dana; //String
var human = true; //bool
age = 20; //ok
age = 'hi'; //Error : age는 int타입, 'hi'는 String타입
}
- dynamic : 동적 타입 지정
변수 선언 시 dynamic을 붙여주면 컴파일러가 해당 변수에 모든 형식을 허용함 (이후 타입 변경 가능)
void main() {
dymanic something = 9;
something = 'apple';
print(something); //apple
}
final, const, static
- 변수의 형식을 확장하는 키워드
- final, const 모두 불변하는 상수를 의미하지만 약간의 차이 존재
- const : 앱의 life cycle에서 절대 변하지 않음을 의미하기 때문에 불변 변수의 앞에 const를 붙여 주면 플러터가 그 부분을 rebuild하지 않기에 앱의 속도가 빨라짐 (성능 up)
- const : compile-time constant로 앱 빌드 시 값이 정해지는 반면, final은 run-time constant로 앱 빌드 시에는 값이 정해지지 않지만 앱 실행 시 값이 정해짐
- static은 클래스 레벨의 변수를 의미, 클래스의 각 인스턴스는 하나의 static 값을 공유함
3. Operator
기본 연산자
- ~/
void main() {
print(55~/2) ; //27
}
- as
강제 형변환 키워드, 부모 타입의 객체를 자식 타입의 객체로 형변환(다운캐스팅)할 때 사용
- is / is!
void mai() {
var age = 0;
print(age is int); //true
print(age is num); //true
print(age is! num); //false
}
null-aware 연산자
객체가 null일 경우를 인지하여 에러 발생을 막고 다른 값을 할당시키는 연산자
- A?.B
Optional chaining, A가 null이 아니면 A 객체의 B 속성을 사용하고, null이면 null 반환(A는 name, B는 length)
void main() {
String? name;
print(name.length); //Error : null값
print(name?.length); //?. 로 처리 시 Error가 나지 않음
}
- A ??= B
위와 반대로 B가 null이면 백업값 할당, 아니면 B 반환(A는 myAge, B는 age)
void main() {
int age;
int myAge = 24;
myAge ??= age;
print(myAge); //age가 null이므로 24 반환
}
4. Function
함수의 구조
- 기본구조 : 리턴값 타입 함수명 (파라미터 타입 파라미터) {}
String sayHi(String name) {
return 'Hi $name!';
}
- 화살표 함수 : '{return 리턴값}'을 '=> 리턴값'으로 축약 가능
String sayHi(String name) => 'Hi $name!';
- main 함수
파라미터
- named parameter : 파라미터를 중괄호로 감싸면 named parameter가 됨
void main() {
void introduce({required String name, required int age}) {
print('I am $name. $age years old!');
}
introduce(name: 'Sam', age: 5);
}
- optional parameter : 파라미터를 대괄호로 감싸면 선택형 인자 설정 가능
void main() {
void introduce(String name, int age, [String? food]) {
print('I am $name. $age years old!');
if(food is String) {
print('I like $food!');
}
}
introduce('Tom', 7); //I am Tom. 7 years old!
introduce('Sam', 5, 'ice cream'); // I am Sam. 5 years old! I like ice cream!
}
- default parameter : = 연산자 사용
void main() {
void introduce(String name, int age, [String food = 'chocolate']) {
print('I am $name. $age years old! I like $food!');
}
introduce('Tom', 7) // I am Tom. 7 years old! I like chocolate!
}
5. Null Safety
1) nullable
- 일반 타입 뒤에 물음표를 붙여주면 해당 변후는 해당 타입 또는 null이 될 수 있음을 나타냄
- 초기화 없이 사용하면 null 값으로 할당됨
void main() {
String? name;
int? age;
bool? student;
print(name); // null
}
2) non-nullable
- 물음표 없이 사용하면 자동적으로 null이 될 수 없는 값으로 인식됨
- 사용 전 반드시 초기값 할당
void main() {
String name;
int age;
bool student;
print(name); // Error
}
- required
: 함수에서 네임드 파라미터나 옵셔널 파라미터를 설정할 때, non-nullable로 지정하기 위해 타입 앞에 붙여줌
void greeting({required String name}) {
print('Hello $name!');
}
- late
: 클래스에 non-nullale 프로퍼티가 필요하지만 디폴트값이나 초기화를 시키지 않을 경우 나중에 값을 할당한다는 의미
class Cat {
late String name;
late int age;
}
'Flutter' 카테고리의 다른 글
[Flutter] 쉬운 플러터 6강 숙제 (0) | 2023.06.21 |
---|---|
[Flutter] 쉬운 플러터 5강 숙제 (0) | 2023.06.21 |
[Flutter] 쉬운 플러터 2강 숙제 (0) | 2023.06.21 |
[Flutter] StatelessWidget, StatefulWidget (0) | 2023.06.21 |
[Flutter] 플러터 시작하기 (0) | 2023.06.20 |