Dart 기본 문법

context·2023년 3월 25일
0

Dart

목록 보기
1/2

특징

  1. UI 최적화 / 완전한 비동기 언어며, 이벤트 기반 / 아이솔레이트를 이용한 동시성 제공
  2. Null Safety, Spread Operator, Collection if
  3. 핫 리로딩으로, 렌더링 반영
  4. 멀티 플랫폼에서 로깅, 디버깅, 실행 / JS로 완전한 컴파일 지원

컴파일 플랫폼

Dart는 모바일이나 데스크톱 기기를 타게팅하는 네이티브 플랫폼과
웹을 타게팅하는 웹 플랫폼으로 컴파일을 할 수 있다.

네이티브 플랫폼은 JIT(Just In Time) 방식과 AOT(Ahead of Time) 방식을 사용.

  • JIT은 가상 머신에서 제공하는 기능으로, 코드 변경 사항을 즉시 반영하는 핫 리로딩 기능, 실시간으로 매트릭스를 확인하는 기능 및 디버깅 기능 제공.
    이를 통해서, 하드웨어 리소스를 적게 사용하는 것보다 빠르게 개발하는 효율적인 개발.
  • 반면, 소프트웨어 배포 시 컴파일이 돼 있어야 더욱 리소스를 효율적으로 사용하기 때문에, 배포 시에는 AOT 방식으로 ARM64나 x64 기계어로 다트 언어가 직접 컴파일 된다.

기초 문법

변수는 var 변수명 = 값 형식으로 선언. 타입 추론으로, 명시적 타입 선언 필요 없음.
타입이 추론된 이후에는, 해당 타입으로 고정된다.

  • dynamic
    해당 키워드로 변수 선언 시, 다른 타입에 값도 저장이 가능하다.
    ex) dynamic name = "name";

  • final / const
    final은 런타임, const는 빌드 타임 상수이다. 공통점은 선언 후, 값 변경이 불가.

void main(){
	final DateTime now = DateTime.now();
    print(now); // 한 번 now 값이 저장되면 추후 변경 불가.
}

void main(){
	const DateTime now = DateTime.now(); // Error
    // 이유는, 빌드 시에 값을 알아야하는데, 해당 DateTime.now() 함수는 런타임 시에 값을 알 수 있다.
    print(now); 
}

코드 실행 전, 값이 확정되면 const / 코드 실행 후 , 확정 시엔 final

타입은 string, int, double, bool

컬렉션

서로의 컬렉션 타입으로 자유로운 형변환이 가능하다.

  • list
    List<type> arr = [values]
    이터러블 메소드는 add(), where(), map() , reduce() 등 제공.
  • map
    Map<keyType, valueType> obj= {key : value}
  • set
    Set<type> obj = {values}

형변환은 .toList() , set.from(arr) 등으로 가능.

  • enum : 한 변수의 값을 몇 가지로 제한.
enum Status = {approve, pending, reject};
Status status = Status.approve;
print(status)

연산자

기본 수치 연산자 / 값 비교 / 논리 연산자는 타 언어들과 동일

  • null 허용 연산자 ( ? )
    double? number = 1
  • 기존 값이 null 일 때만, 값 수정이 되는 연산자
double? number; // null
number ?? = 3; // 3
number ?? = 4; // 3
  • 타입 비교 연산자 ( is )
    print(number is int); // true

제어문

ìf / switch / for / while 제공

  • 모두 타 언어와 동일하나, for문은 list와 유용한 for.. in 패턴 제공.
  • do while문 제공
    while문은 조건 확인 후, true일 경우, 반복문 실행.
    do while은 반복문 실행 후, 조건 확인
int total = 0;
do {
	total += 1;
} while (total < 10) ;

함수

// 기본 함수 형태
int add(int a, int b) {
	return a + b;
}
( return 값이 없을 경우, void 타입 )
  • parameter 지정 시, positional param / named param 으로 구분.
    위치에 맞게 , 순서대로 넣어주는게 positional
add(1, 2) // 위 add 함수는 무조건 return 1 + 2;

named는 좀 다르게 파라미터를 변환한다.

// named parameter 함수 형태
int add({required int a, required int b}) {
	return a + b;
}
// 호출 시
add(a : 1, b : 2);

required 키워드는 parameter가 null이 불가능한 타입일 경우, default value를 갖거나, 필수로 입력되어야 한다.

// 기본 값을 갖는 positional parameter 함수 형태
int add( int a, [int b = 2]) {
	return a + b;
}

// 기본 값을 갖는 named parameter 함수 형태
int add({required int a, int b = 2}) {
	return a + b;
}

// 섞어쓰는 경우의 함수 형태
int add(int a, {required int b}) {
	return a + b;
}
// 호출 시
add(1, b: 2)

익명 / 람다 함수

일회성, 다트에서는 둘을 구분짓진 않음. callback 함수 사용 시 유용.

(param) {function body} // 익명

ex) numbers.reduce((value, el) {
	return value + el
})

(param) => {one statement} // 람다

ex) numbers.reduce((val, el) => value + el)

typedef

해당 키워드는 함수 시그니처를 정의하는 값. 여기서 시그니처는 리턴 타입 및 매개 변수 개수와 타입 등을 말한다. 즉, 함수 선언부를 정의하는 키워드

// 일급 객체인 함수를 값처럼 사용.

typedef Operation = void Function(int x, int y);

void add(int x, int y) {
	print x + y
}
void calc(int x, int y, Operation oper){
	oper(x, y)
}
void main() {
	calc(1, 2, add)
}

try.. catch(예외 처리)

void main() {
	try {
   		final String name = "yjh" ;
        throw Exception("!!"); // 예외 발생문, 없다면 print까지 실행.
        print(name);
   } catch(e){
   		print(e);
   }
}

0개의 댓글