변수에 자주 사용되는 var, const, late, final, dynamic에 대해 알아 볼 것 이며,
Function의 파라미터, 클로저, 익명 함수, 렉시컬 스코프에 대해서도 알아볼 것입니다.
주로 사용하는 타입에 대해 알아보겠습니다.
| 변수 | 범위 | 값 |
|---|---|---|
| int | 64비트 이하의 정수 값. | 0,1 |
| double | 64비트 부동 소숫점 숫자 | 0.5,123.456 |
| String | UTF-16 코드 단위 | "스트링" |
| bool | 참,거짓 | true,false |
| List | 배열 | ["Text","Text2"] |
| Set | 고유한 항목의 정렬되지 않은 컬렉션 | {"불소","염소","브롬"} |
| Map | 키와 값으로 이루어진 컬렉션 | {"a":"A","b":"B"} |
// 간단한 선언과 값들
int x = 1;
int hex = 0xDEADBEEF;
double y = 1.2;
double exponents = 1.42e5;
-------------------------------
String text = "Text";
String text2 = '작은따옴표';
String multiLine = """이것은
여러줄입니다.
"""
String numberWithString = "$text $x"; // "Text 1";
------------------------------
bool isTrue = true;
bool isFalse = false;
------------------------------
List fruit = ["Apple","Banana"];
fruit.add("Melon");
Set fruitSet = {"불소","염소"};
fruitSet.add("브롬");
Map gifts = {"first":"partridge","second","turtledoves"};
gifts["first"]; // partridge
gifts["second"] = "apple"; // 값 재할당
var 의 경우 값을 할당할때 변수의 타입이 추론된다는 특징이 있다.
dynamic 의 경우 TypeScript의 Any 처럼 어느 값이든 할당이 가능하다.
var name = "임의값" ; // String
name = "임의텍스트" ; // String
name = 0; // Error : A value of type 'int' can't be assigned to a variable of type 'String'.
var test;
test = "String";
test = 0; // 이 경우엔 첫 할당에서 타입이 지정되지 않아 dynamic 타입처럼 작동한다.
dynamic d_name = "String";
d_name = 0; // 에러가 발생하지 않는다.
late 의 경우 값의 초기화를 뒤로 미룰 수 있게 해주는 키워드이다.
Dart 2.12 버전에서 키워드가 추가 되었으며, 해당 키워드를 사용함으로써 다른 개발자에게 값이 추후에 초기화 된다는 것을 인지 시킬 수 있다.
late String? apiCallData; // 선언시 null
Timer(Duration(seconds: 3), () { // package:async/async.dart Timer
apiCallData = "변경";
});
const,final 두 키워드의 경우 상수라는 공통점이 있다.
차이점은 const는 컴파일시 상수로 지정 되어 런타임 도중에는 변경이 불가하다.
const String fixed_const = "고정된 값";
final String fixed_final = "고정된 값";
_anyfn(String getText){
final String anyText = getText;
// const String anyText_const = getText ; // 에러 컴파일시 값을 초기화 해야됨.
// anyText = "변경"; // 에러 값이 이미 초기화 된 상태에선 재할당이 불가능
// fixed_const = "변경"; // 위 에러와 동일
}
// 좋은 형태
bool isNoble(int atomicNumber) {
return _nobleGases[atomicNumber] != null;
}
// 좋지 않음
isNoble(atomicNumber) {
return _nobleGases[atomicNumber] != null;
}
// 화살표 함수를 이용한 짧은 형태
bool isNobel(int atomicNumber) => _nobleGases[atomicNumber] != null;
// => expr; == {return expr;}
파라미터(매개변수) 선언 방식은 크게 3가지로 나뉩니다.
anyText1(String text1,String text2)
anyText2({required String text1, required String text2})
anyText3(String text1,[String text2])
void anyText1(String text1,String text2){...};
anyText1("텍스트1번","2번");
void anyText2({required String text1, required String text2}){...}
// required는 필수값을 나타냄
anyText2({text1:"1번텍스트",text2:"2번텍스트"});
void anyText3(String text1,[String text2]){...};
anyText3("필수 1번텍스트");
anyText3("필수 1번텍스트","선택적 2번텍스트");
인수로 [List<String_>] 매개 변수를 가지고 있으며 리턴 값은 void 입니다.
void main([List<String> arguments]){
... App
}
다음 3가지 조건을 충족한다면 1급 객체로 표현한다
- 변수나 데이터에 할당 할 수 있어야 한다
- 객체의 인자로 넘길 수 있어야 한다
- 객체의 리턴값으로 리턴 할 수 있어야 한다
// 변수나 데이터에 할당 할 수 있어야 한다
var functionObject = (int a,int b) => a + b;
// 객체의 인자로 넘길 수 있어야 한다
var functionObject2 = (Function func) => func();
// 객체의 리턴값으로 리턴 할 수 있어야 한다.
hocFunc(int num) => (Function func) => func(num)
hocFunc(3)(print); // 3
<InkWell
onTap=(){
// 익명 함수
}
onTap=()=> returnValue
// 익명 함수 람다
/>
void main(){
var language = 'Dart';
void printLanguage(){
language = 'DartLang';
print("Language is ${language}");
}
printLanguage(); // Language is DartLang
}
// ----------------------------------------
void main() {
String language = "Dart";
void outerFunction() {
String level = 'one';
String ex = "scope";
void innerFunction() {
Map level = {'count': "Two"};
print('ex: $ex, level: $level');
print('Language: $language');
}
innerFunction();
print('ex: $ex, level: $level');
}
outerFunction();
// outer -> inner / ex: scope, level {count:Two}
// outer -> inner / Language: Dart
// outer / ex: scope, level:one}
}
void main() {
// Create a function that adds 2.
var add2 = makeAdder(2);
// Create a function that adds 4.
var add4 = makeAdder(4);
var add23 = makeAdder(2)(3);
assert(add2(3) == 5);
assert(add2(3) == add23);
assert(add4(3) == 7);
}