이 글은 제가 유일하게 아는 언어인 C언어와 구별되는 Dart의 특징적 개념만을 정리하였으므로
프로그래밍 자체가 처음이신 분들은 이해하기 어려울 수 있습니다.
dynamic type vs var type
둘 다 데이터 타입을 명시적으로 지정하지 않고, 컴파일러가 할당된 값의 데이터 타입을 기반으로 타입을 추론하도록 한다.
이로써 코드를 간결하게 작성할 수 있는 장점이 있다.
그러나 var type으로 선언된 변수는 한 번 초기화했을 당시의 자료형만 계속 쓸 수 있다.
var name = 12;
// 위와 같이 integer로 초기화되어 있다면
// name이라는 변수에는 string이나 bool 같은 자료형의 데이터는 저장할 수 없다.
name = 43; [O]
name = 'string'; [X]
name = true [X]
dynamic type은 초기화 당시와는 상관없이 아무 자료형이나 저장할 수 있다.
dynamic name = 12;
// 위와 같이 integer로 초기화되어 있다면
// name이라는 변수에 아무 자료형이나 막 들어갈 수 있다.
name = 43; [O]
name = 'string'; [O]
name = true [O]
Nullable & Non-nullable
어떤 type이든 type 끝에 물음표를 붙이면 그 type으로 선언된 변수에는 Null이 들어갈 수 있다는 뜻.
물음표가 없다면 그 type에는 Null이 들어갈 수 없음.
String? name = '블랙핑크' //Nullable
String name = '블랙핑크' //Non-nullable
tip.
Nullable type의 변수인데 이 변수를 사용할 때 뒤에 느낌표가 붙어 있으면
이 변수 안에는 Null이 들어가 있지 않다는 뜻.
String? name = '블랙핑크';
Print(name!);
즉, 정리하자면
초기화할 때 type 뒤에 ?가 붙어 있다 -> 이 변수 안에 Null이 들어갈 수도?
변수를 사용할 때 변수 뒤에 !가 붙어 있다 -> 여기 안에 있는 건 Null일 수가 없음! 그럴 수가 없음!
final vs const
둘 다 변수 값을 한 번 선언하면 그 값을 다시 바꿀 수 없게 만든다.
final Const name = '에스파';
const String name = '블랙핑크';
그러나 값이 결정되는 타이밍에 큰 차이점이 있다.
final은 파일이 컴파일된 후 실행될 때 값이 결정되지만, const는 컴파일 당시에 값이 결정된다.
const는 실행 파일이 만들어지는 과정에서 이미 고정되어 있는 값이기 때문에 실행 파일에서는 그 안의 값을 조작할 수 없다.
하지만 final은 실행될 때 값이 결정되기 때문에 실행 파일에서 그 값을 조작할 수 있다.
만약 프로그램이 실행될 때 final을 따로 할당하지 않는다면 원래 저장되어 있는 값이 그대로 확정된다.
하나의 예시만 더 살펴보자.
DateTime now = DateTime.now();
print(now);
DatetTime.now() 이 method는 코드가 실행이 되는 순간을 불러온다.
그러면 위의 코드에서 DateTime now 이 변수에는 final을 붙일 수 있을까?
실행파일이 실행되는 순간에 값이 결정이 되기 때문에 붙일 수 있다.
그럼 const는?
붙일 수 없다. 이미 고정되어 있는 값이기 때문에 runtime에 호출되는 DateTime.now() method가
힘을 쓸 수가 없다. 만약에 써버리면 에러를 뱉어버리기 때문에 안 된다.
연산자
C랑 거의 비슷하지만 몇 가지 차이점이 있다.
후위 증가 연산을 하려면 한 칸씩 띄워줘야 한다.
number ++;
number --;
?? -> Null 병합 연산자
좌변의 값이 Null이면 우변의 값을 내보낸다.
좌변의 값이 Null이 아니면 좌변의 값을 내보낸다.
String name;
print(name ?? "널이 아님");
is 연산자
변수의 데이터 타입을 확인하는 데 이용됨.
int number 1;
print(number is int); //number는 int 자료형인가?
print(number is String); //number는 String 자료형인가?
print(number is! int); //number는 int 자료형이 아닌가?
print(number is! String); //number는 String 자료형이 아닌가?
List
그냥 배열이다. index 쓰는 것도 c랑 똑같다.
List<String> blackpink = ['제니', '리사'];
List<int> numbers = [1, 2, 3, 4, 5, 6];
배열 이름 뒤에 .을 찍으면 함수 리스트가 쭉 나오는데 그 함수들을 바로 적용시킬 수 있다.
List<String> blackpink = ['제나', '리사'];
print(blackpink.length);
blackpink.add('지수');
Enum
구조체랑 비슷한데 좀 다름
상태를 저장하는 느낌? 잘 모르겠다.
enum TrafficLight {
red,
yellow,
green,
}
void main() {
TrafficLight currentLight = TrafficLight.red;
if (currentLight == TrafficLight.red) {
print("Stop");
} else if (currentLight == TrafficLight.yellow) {
print("Slow down");
} else if (currentLight == TrafficLight.green) {
print("Go");
}
}
Positional parameter vs optional parameter vs named parameter
Positional parameter
함수에 들어가는 인자는 크게 두 가지로 구분되는데
positional parameter는 함수를 사용할 때 반드시 줘야 하는 인자값이다. 안 주면 오류가 난다.
addNumbers(int x, int y, int z);
여기서 x, y, z는 모두 함수를 사용할 때 반드시 줘야 하는 인자값으로 positional parameter라고 할 수 있다.
Optional parameter
하지만 optional parameter는 함수를 사용할 때 줘도 되고 안 줘도 되는 인자값들이다.
addNumbers(int x, [int y, int z]);
대괄호 안에 들어간 y와 z는 꼭 없어도 된다.
addNumbers(1);
addNumbers(1, 2);
addNumbers(1, 2, 3);
위 세 가지 방식 중 어떻게 써도 상관이 없다.
addNumbers(int x, [int y = 20, int z = 30]);
위와 같이 하면 y와 z가 안 들어왔을 경우 그냥 20이랑 30으로 처리하라는 이야기다.
named parameter
순서가 별로 중요하지 않다.
positional parameter는 인자의 위치에 따라 어떤 변수로 들어갈지가 정해지지만
named parameter는 아래와 같이 처리한다.
addNumbers({
required int x,
required int y,
required int z,
})
이런 함수가 있으면
addNumbers(y: 20, z: 10);
이런 식으로 name이 어떤 변수에 들어갈지를 결정해주기 때문에 위치가 중요하지 않다.
Typedef
함수와 기능이 비슷하지만 Body가 없다.
간단한 함수를 편리하게 사용할 수 있는 기능이다.
typedef Operation = int Function(int x, int y, int z);
int add(int x, int y, int z);
int sub(int x, int y, int z);
int cal(int x, int y, int z, Operation operation){
return operation(x, y, z);
}
void main() {
Operation operation = add;
int result = operation(10, 20, 30);
print(result);
operation = sub;
int result2 = operation(10, 20, 30);
print(result2);
int result3 = calculate(40, 50, 60 sub);
}
'프로그래밍 언어 > 다트' 카테고리의 다른 글
다트 클래스 사용법 기초 (0) | 2023.09.06 |
---|