앱 개발/Dart

Dart Variables(변수)

태기 2024. 5. 7. 14:38

1. var

void main() {
    int i = 12;
    var name = 'la';
    i = 121212;
    name = 'lalalala';
}

 

변수를 생성할 때 2가지 방식이 있다.

  • (타입) (변수명) = (데이터);
  • var (변수명) = (데이터);

이렇게 만들어진 변수는 나중에 수정이 가능하다.

 

Dart의 스타일 가이드에 따르면 var를 가능한 많이 사용하는 것을 권장한다.

타입으로 선언하는 방식은 class의 property를 작성할 때 사용하는 것을 권장한다.

 

var는 컴파일러가 타입추론을 하기 때문에 메서드나 작은 함수 안에서 지역변수를 선언할 때 사용한다.

 

 

2. final

변수의 값을 수정하지 못하게 하고 싶을 때 사용한다.

void main() {
    final name = 'taek';
    name = '121212';
}

 

위와 같이 final로 선언하고 나서 밑에 다른 데이터로 수정하려고 하면 오류가 난다.

 

 

3. dynamic

dynamic 타입은 아주 조심스럽게 사용해야 하는 타입이다.

항상 사용하는게 아니라 어떤 데이터가 들어올지 모를 때 사용하는 타입이다. 

void main() {
    dynamic name;	// 무슨 변수가 들어올지 몰라서 데이터 초기화 X

    name = '1212';	// String
    name = 1212;	// int
    name = true;	// boolean
}

 

dynamic 안에 무언갈 사용하려면 타입 확인을 해줘야 한다.

 

위 사진과 같이 그냥 name. 을 사용하면 왼쪽처럼 사용할 수 있는것이 몇개 없다. 

그러나 예를 들어 오른쪽처럼 String인지 타입확인을 해주면 해당 타입에 관한 메서드들을 사용할 수 있다.

 

 

4. const

const는 우리가 컴파일 할 때 값을 알고 있는 변수를 만드는 방법이다.

만약 API_key 같은 것들이 있고, 앱을 컴파일하고 앱스토어에 올릴 때 그 값을 알고 있다면 const를 사용한다.

void main() {
    const api_key = '12121212';
    api_key = '12';
}

 

const -> compile-time constant

const도 수정할 수 없다.

 

final 과 비슷한데 차이점이라고 한다면 final은 런타임 중에 만들어질 수 있다.

-> 사용자가 앱을 실행하면서 변수를 만들 수 있다.

예를 들어 회원정보를 입력한 폼에 username을 받는다고 하면 다음과 같이 선언할 수 있다는 것이다.

 

 

5. null safety

void main() {
    String? name = 'taek';
    name = null;
    name?.isEmpty;
}

 

프로그램의 기능 - 잘못된 상태의 변수를 참조하는 것을 막아준다.

>> null 값을 참조하지 못하게 해줌

기본적으로 Dart의 모든 변수는 nullable이 아니다.

 

따라서 위와같이 '?'를 타입뒤에 붙여주면 nullable이 된다.

이어서 다음과 같이 'name'의 메서드를 사용하려고 하면 오류가 난다.

 

여기도 마지막 이미지처럼 변수명 뒤에 '?'를 붙여 사용하게 한다.

이것의 의미는 2번째와 같은 코드의 축약형이다. Dart는 name이 null이면 isEmpty를 호출하지 않을 것이다.

 

 

6. late

late는 final, var, String 같은 것들 앞에 써줄 수 있는 수식어이다.

Dart한테 아직은 어떤 데이터가 올지 모른다고 말해주는 것이다.

void main() {
    late final String name;
    name = '12';
    print(name);
}

dart는 이렇게 변수를 선언하면 사용하기 전에 꼭 데이터를 넣게 만든다.

데이터를 넣기 전엔 사용하면 안 된다고 알려준다. 

이게 late 수식어가 해주는 일이다.

 

이 late는 flutter로 API에서 데이터를 가져오는 일 등을 할 때 더 합리적이다.