Dart 기초1

이제우·2024년 10월 2일

변수 선언

Dart에서는 두가지로 변수를 선언할 수 있다.

void main(){
	String name = 'jinjin';
    var age = 12;
}

타입 + 변수명 으로 선언할 수도 있으며
var + 변수명 으로 선언할 수도 있다.

Dart의 스타일 가이드에 따르면 메소드나 함수내의 지역변수는 var를 사용하는걸 권장하며
class나 properties엔 타입명으로 선언하는 게 좋다.

Dart는 타입을 추론할 수 있으며 한번 선언한 타입외의 변수값으로 재지정할 수는 없다.

void main(){
	String name = 'jinjin';
    name = 'dongdong'; // 가능
    
    var age = 12;  // dart가 알아서 int 타입을 추론해준다.
    age = true; // int 타입에서 boolean 타입으로 변환 시 에러가 발생한다.
}

dynamic 타입

Dart에서는 타입을 지정하지 않아도 되는 dynamic 타입으로 변수를 선언할 수 있다.
이 dynamic 타입은 정말 필요할때만 사용이 권장되며 웬만해선 사용하지 않는 것이 좋다.

void main(){
	var name; // var로 변수를 선언할 때 값을 지정하지 않으면 dynamic으로 지정가능
    dynamic time = 12; // dynamic으로 변수 선언
    
    name = 'jinjin';
    name = 123;
    name = true;
    time = "12시 30분";
    //어떤 타입으로 설정해도 오류가 나지 않는다.
    
    if(name is String){
    	// 이렇게 if문으로 dynamic변수의 타입을 잡아주면 dart가 해당 타입의 속성을 잡아준다 (name.length 등)
    }
}

null safety

Dart의 변수들은 기본적으로 nullable이 아니다. 즉, null값을 허용하지 않는다.

void main(){
	String name = null; // 에러발생
}

하지만 타입뒤에 ?를 붙힌다면 Dart는 해당변수가 null일 수도 있다는 즉 nullable이 허용된다.

void main(){
	String? name = null;
}

또한 Dart가 해당 변수는 null일 수 있음을 알기에 컴파일러가 에러를 미리 찾아준다.

void main(){
	int count(String word) => word.length;

    count(null); // 컴파일러가 에러를 잡아내진 못하고, null값에 length를 접근하니 런타임 에러가 발생한다.
}
void main(){
	int count(String? word) => word.length; // null일 수 있는 값에 length를 구하니 에러가 발생한다.

    count(null);
}

변수를 nullable로 허용한 뒤에는 null이 아닐 때를 구분하여 속성에 접근해야한다.

void main(){
	String? a = null;
    
    if(a != null){
    	print(a.length);
    }
    // 또는
    print(a?.length); // a가 null이 아닐때만 length를 구하는 축약어
}

final

final은 javascript나 typescript로 따졌을 때, const와 비슷한 상수이다.
const와 마찬가지로 값을 재 할당이 불가능하다.

void main(){
	final a = "1";
    a = "2"; // 같은 타입으로 재 할당하더라도 에러 발생
}

const

const 역시 상수지만, javascript나 typescript와는 다른 특징을 가진다.
compile-time constant로서 컴파일 시 값을 알고 있어야 하는 상수이다.

컴파일 이후 api를 받아오는 경우나 사용자의 입력 값을 지정하는 경우엔 const대신 final을 사용해야한다.

late

var, final, const에는 late를 붙힐 수 있는데, late를 사용하면 값을 나중에 할당해도 된다.
물론 값은 한번만 할당이 가능하다.

void main(){
	late final a;
    a = "2"; // 에러 발생 안함
}

late final은 api를 호출하여 값을 받아올 때 가장 유용하다.

profile
게으른 사람 중에 제일 부지런하게 사는 사람이 꿈

0개의 댓글