Dart는 Dart Web과 Dart Native, 2개의 컴파일러를 가지고 있다.
개발할 때 JIT 컴파일러 사용
프로덕션으로 배포할 때 AOT 컴파일러 사용
바이너리(Binary)
: 컴퓨터(CPU)가 이해하고 실행할 수 있는 기계어 코드로 된 파일
하나의 Dart 소스 코드로부터 Windows 운영체제에서 실행할 수 있는 Windows용 바이너리와, macOS에서 실행할 수 있는 macOS용 바이너리를 생성할 수 있다는 뜻이다.
이렇게 하면 하나의 코드로, 동일한 애플리케이션을 여러 플랫폼에서 실행할 수 있게 된다.
이제 syntax부터 하나씩 뽀개보자..
main()
함수main
함수는 모든 Dart 프로그램의 엔트리 포인트로, 프로그램이 시작되는 지점이다.main
함수 내부에 작성한 코드가 프로그램 실행 시 호출되므로, 모든 Dart 프로그램은 main
함수를 포함해야 하며 그 안에 코드를 작성해야 한다.void main() {
// main 함수 안에 코드 작성
}
;
;
)은 문장의 종료를 나타내는데 중요하다.void main() {
print('Hello World');
}
Dart에서 변수를 선언하는 법은 크게 2가지가 있다.
var
키워드로 선언void main() {
var name = '지은';
name = '지지'; // 가능
name = 1; // 에러 발생
}
void main() {
String name = '지은';
name = '지지'; // 가능
name = 1; // 에러 발생
}
그렇다면 어떨 때
var
를 사용하고 어떨 때 타입을 지정하여 선언하는가?
- 관례적으로 함수나 메소드 내부에 지역 변수를 선언할 때는
var
키워드를 사용하고,- 클래스나 객체의 멤버 변수나 속성을 선언할 때는 변수의 의도를 명확하게 하기 위해 타입을 지정한다.
만약 내가 어떤 변수에 한 가지 타입의 값이 아니라 여러 가지 타입의 값을 저장하고 싶다면?
dynamic
키워드를 사용하면 된다.
dynamic
변수dynamic
키워드를 사용해 여러 가지 타입을 가질 수 있는 변수를 선언할 수 있다.dynamic
키워드로 선언된 변수는 값을 할당할 때마다 타입이 변경된다.void main() {
dynamic name;
name = 1;
name = true;
name = '지지';
}
var
키워드를 사용해 변수를 선언하고 초기값을 주지 않으면, 해당 변수는 dynamic 변수가 된다.
void main() {
var name; // 선언만 하고 값 할당 X
name = 1;
name = true;
name = '지지';
}
is
키워드를 사용해 동적으로 타입을 확인할 수 있다.void main() {
dynamic name;
name = '지지';
if (name is String) {
print(name.length); // 문자열 길이 출력: 2
}
name = 1
if (name is int) {
print(name.isEven); // 짝수 여부 출력: false
}
}
Final
변수: 수정할 수 없는 변수
const
키워드와 비슷하다.void main() {
final name = '지은';
final String name = '지은'; // 타입 지정 가능
name = '지지'; // 변수 재할당 불가능
}
Late
modifier late
modifier를 사용하면 final 변수를 초기값 없이 선언할 수 있게 해준다.
late
로 선언한 변수는 선언 시점에 값을 할당하지 않아도 되며, 나중에 필요한 시점에서 값을 할당할 수 있다.void main() {
late final String name; // 선언
// ...
name = '지은'; // 할당
}
void main() {
late final String name;
print(name); // 에러 발생
}
Constant
변수상수(const) 변수는 컴파일 단계에서 평가되므로 변수의 값을 선언 시점에서 알아야 한다.
const
변수는 런타임시 값이 변경되지 않는 것이 보장된다.void main() {
const API = '123123'; // O
const API = fetchApi(); // X
}
null
값을 참조하지 못하도록 하는 기능으로,null
관련 오류를 방지하고 컴파일 시간에 미리 발견할 수 있도록 도와준다.?
를 붙여 해당 변수가 null
값이 될 수 있음을 나타내야 한다.void main() {
String name = '지은';
name = null; // 불가능
String? dog = '지지';
dog = null; // 가능
}
null
여부를 확인해야 한다.void main() {
String? dog = '지지';
dog = null;
print(dog.length); // 불가능 (null에 length 프로퍼티가 없으므로 에러 발생)
if (dog != null) {
print(dog.length); // 가능
}
}
null
여부를 간편하게 확인하고 싶을 때는 null-aware 연산자 ?.
를 사용할 수 있다.void main() {
String? dog = '지지';
dog = null;
print(dog?.length); // dog가 null이 아니라면 dog의 length를 출력한다. (null이면 null을 반환)
}
Null Safety는 Nullable 변수들을 올바르게 처리하도록 코드를 작성하게 함으로써 런타임 오류를 방지해주고 코드의 안정성을 높여준다.
dart 공부하시는 군요 !
final과 null부분에서 저도 오류를 많이 경험했던 기억이.... ㅠㅠㅠ js에서 안하던 부분을 신경써야해서 어렵더라구요...