[Dart] Variables

수연·2023년 8월 23일

dart

목록 보기
1/1
post-thumbnail

1. The Var Keyword

void main() {
	String name = 'suwith'; //방벙1
    var name = 'suwith'; //방법2
	name = 'garden';
}

함수나 메소드 내부에 지역변수를 선언할 때는 var를 사용하고
class에서 변수나 property를 선언할 때는 명시적 타입을 사용한다.
당연한 말이지만 다른 타입의 변수는 서로 대입할 수 없다.
var를 사용하는게 dart 스타일가이드의 권장 방식이다.

2. Dynamic Type

var name;
dynamic name;

변수를 선언할 때 dynamic을 쓰거나 값을 지정하지 않으면 dynamic타입이 된다.
이 데이터는 여러 타입을 가질 수 있기 때문에 정말 필요할 때만 사용해야 한다.
데이터 타입이 무엇인지 모를 때 주로 사용한다.

var name;
if(name is String){
	//이곳에서는 name을 String 취급
    }
if(name is int){
	//이곳에서는 name을 int 취급
    }

3. Nullable Variables

String? name = 'suwith';
name = null;

dart에서는 기본적으로 모든 변수가 non-nullable(null이 될 수 없는)이다.
null값을 참조할 때 일어나는 런타임 에러를 막기 위해 데이터 타입 뒤에 ?를 붙여줌으로써 데이터가 null이 될 수 있다고 명시해주는 것이다.

4. Final Variables

final name = 'suwith';
final String name = 'susu'; //이와 같이 타입을 더 구체적으로 적어도 됨

상수 타입 , 자바스크립트의 const와 같이 수정할 수가 없다.

5. Late Variables

 late final name;

final이나 var또는 명시적 데이터타입 앞에 붙여서 초기 데이터 없이 먼저 변수를 생성하고 추후에 데이터를 넣을 때 주로 사용한다.
값을 넣기 전까지는 변수 참조가 안됨
flutter로 data fecthing을 할 때 유용하다.
fianl 키워드를 혼자 사용하면 바로 선언을 해야하지만 late 키워드를 사용한다면 선언이 아닌 할당을 하더라도 그 변수의 수정을 막을 수 있기 때문이다.

[참고]
class 개념에서 이 변수의 기능이 쓰일 것.
class 내의 인스턴스 변수가 final이면 만들면서 바로 할당해야하고 late final이면 만들고 난 후에 할당해도 됩니다.
또한 Nullable 타입이 아닌(?가 없는) 타입들은 빈 값(null)을 가질 수 없는데 late 키워드를 써줘서 사용하기 전에 할당한다고 알려줄 수 있죠.
즉, null-satefy가 보장됩니다.

6. Constant Variables

void main() {
const name = "tom"; // 컴파일 시점에 바뀌지 않는 값
final username=fetchAPI(); // 컴파일 시점에 바뀌는 값
}

자바스크립트의 const와는 다르며 dart에서 const는 compile-time constant를 만들어준다.
const 키워드는 컴파일 타임에 평가되므로, 변수는 반드시 선언시 초기화되어야 함

🧐 "late const 변수" 는 가능할까?

late와 const 키워드를 함께 사용할 수는 없다. late 키워드는 변수가 나중에 초기화될 것임을 나타내므로, 변수는 런타임에 초기화된다. 따라서 late const 는 유효하지 않은 문장이다.
const는 컴파일할 때 알고 있는 값을 사용해야 한다.
만약 어떤 값인지 모르고, 그 값이 API로부터 오거나 사용자가 화면에서 입력해야 하는 값이라면 그건 const가 아닌 final이나 var가 되어야 한다.

const와 final의 차이점

const: 컴파일 시점에 바뀌지 않는 값 (상수)
final: 컴파일 시점에 바뀌는 값 (API에서 받아온 값, 사용자 입력값)
const와 fianl의 가장 큰 차이점은 컴파일이 되는 시점에 그 값을 알 수 있는지 없는지의 차이다.
예를 들어 fetchApi를 하는 변수는 컴파일하는 시점에 그 변수를 알 수가 없다.

// 컴파일하는 시점에는 API의 값을 알 수 없다
const API = fetchAPI()

위 코드의 경우에는 const가 아닌 final이 더 적합하다.
final를 쓰는 대표적인 경우는 API fetching, 사용자가 화면에서 입력해야하는 값 등이 있다.
const를 쓰는 대표적인 경우는 max_allowed_price와 같은 상수에 쓰인다.


📝 Dart 변수 설정 방법 정리

  1. var 변수명 = 변수값 // 처음 할당한 변수값과 같은 타입으로만 업데이트 가능
  2. String 변수명 = 변수값 // 명시적으로 설정한 타입(String)으로만 업데이트 가능
  3. String? 변수명 = 변수값 // 명시적으로 설정한 타입(String) 또는 Null 타입으로만 업데이트 가능
  4. dynamic 변수명 = 변수값 // 처음 할당한 변수값과 다른 타입으로도 업데이트 가능
  5. final 변수명 = 변수값 // 한 번 할당한 변수값을 바꿀 수 없음
  6. const 변수명 = 변수값 // 컴파일 타임하기 전에 변수값이 할당되어야 하며 변수값을 바꿀 수 없음
  7. late 변수명 // 선언과 초기화를 분리하여 값을 나중에 할당할 수 있음

0개의 댓글