欲速不達

일을 급히 하고자 서두르면 도리어 이루지 못한다.

Fantastic AI, Fantastic World

CS | Computer Science/FE | Front-end

[App] Dart 2. Variables

_껀이_ 2024. 4. 18. 11:49
728x90
반응형

Variables

Dart에는 여러가지 변수(Variables) 타입이 있다.

이번 포스팅에서는 파이썬을 비롯해 다른 언어에서도 사용하는 String, Int(Integer), Double 등을 제외하고 Dart에서 사용하는 특이한 변수형태를 알아본다.

 


1) var

var는 Dart에서 일반적으로 사용하는 변수 형태이다.

void main() {
  var name1 = '껀이';
  String name2 = '꺼니';
}

 

위와 같이 var name1으로 선언해서 사용한다.

이때 var로 지정한 name1은 입력값이 '껀이'라는 String이므로, name1은 String 타입으로 지정된다. 물론 name2처럼 명시적으로 String이라고 지정해도 된다. 결과는 같다.

 

또, 만약 var name1 = 1234 처럼 int 값으로 지정해주면 어떻게 될까?

name1은 int로 지정된다.

 

즉, Dart의 var 변수타입은 초기에 설정한 '값'이 어떤 타입인지를 추론해서 변수의 타입을 설정한다는 것이다.

 

또 하나의 특징은 초기에 지정한 타입으로만 변경가능하다는 것이다.

void main() {
  var name1 = '껀이';
  // name1은 String
  name1 = 'kuuneeee'; // -> 변경된다
  name1 = 1234; // -> 변경 안된다
}

 

# 참고로,

함수나 메서드 내의 '지역변수'를 지정할 때는 var,

클래스 내의 '변수'나 'property' 선언 시에는 명시적 타입을 사용한다.

 


2) Dynamic Type

Dynamic Type은 어떤 변수 타입이든지 될 수 있을 때 사용한다.

그래서 Flutter나 JSON처럼 동적인 데이터를 처리할 때 유용하다.

하지만, 남용하면 코드 가독성이 떨어지고 compiler가 타입을 확인하지 않아 발생할 수 있는 오류가 생길 수 있다.

 

void main() {
  var name;
  
  name = 'kuuneeee'; // String -> 변경가능
  name = 11; // int -> 변경가능
  name = trun; // boolean -> 변경가능
  
  if (name is String){
    // name이 String이면 if문 안으로 들어오기 때문에
    // 여기 안에서는 String이 가지는 메서드(name.~ 메서드)를 사용할 수 있음
  }
}

 

위의 코드처럼 var name으로만 선언하고 나중에 값을 지정하는 식으로 사용한다.

Dynamic Type에는 어떤 값으로든 변경이 가능하다. 

 

변수가 어떤 타입인지 알기 어려운 경우, Dynamic Type을 사용해서 값을 넣고 if 문으로 필터링 하는 식으로 사용할 수도 있다.


3) Nullable Variables

Nullable Variables는 Null Safety를 위해서 사용한다.

Null Safety는 개발자가 Null 값을 참조할 수 없도록 하는 안전장치로 볼 수 있다.

 

// Without Null Safety
bool isEmpty(String string) => string.length == 0;

main() {
  isEmpty(null);
}

// With Null Safety
void main() {
  String? name = 'kuuneeee';
  // 타입 뒤에 ? -> null 값일 수도 있다는 거 명시  => name은 String이거나 null 일 것이다
  name = null;
 
  // 1)
  if (name != null) {
    // 여기 안에서는 null이 확실하게 아닐 것
    name.isNotEmpty;
    }
  
  // 2)
  name?.isNotEmpty;
}

// Null Safety란, 어떤 변수, 혹은 데이터가 null이 될 수 있음을 명시하는 것
// null이라면 따로 처리해줄 수 있기 때문에 에러를 방지하는거

 

위 코드처럼 Null Safety가 없는 경우, main에서 null 값을 전달하면 에러가 발생한다.

isEmpty 함수에서 String을 인자로 전달해야 string.length 메서드를 호출해야 하는데 null은 해당 메서드가 없기 때문에 발생하는 에러이다.

 

그럼 Null Safety를 어떻게 쓸까?

타입 뒤에 ?를 붙이면, 해당 변수가 null 값일 수도 있다는 것을 의미한다.

그리고 1)의 if문으로 null 값이 아니면 isNotEmpty 메서드를 호출하게끔 할 수 있다. 

 

2)는 1)을 더 간략하게 표현한 것이다.

변수명 뒤에 ?을 붙이면 해당 변수가 null이 아닐때 isNotEmpty를 호출한다는 의미이다.


4) Final Variables

Final 변수는 초기 설정 타입에서 변경할 수 없게 설정하는 것이다.

 

void main() {
  final name = 'kuuneeee'; 
  // final String name = 'kuuneeee'; 이렇게 명시적 타입도 정해서 쓸 수도 있음
  // final 변수는 초기 설정 타입에서 변경할 수 없음 -> javascript나 typescript의 const
}

 

수정이 안된다는 점에서 javascript나 typescript의 const와 유사하다.


5) Late Variables

Late 변수는 다른 작업을 하고 나중에 값을 넣을 때 사용한다.

 

void main() {
  late final String name;
  ----------------------------------------
  // API에서 데이터 받아오고 등등 다른 작업
  ----------------------------------------
  name = 'kuuneeee'; // 변수에 데이터를 나중에 넣을 수 있게 해주는 거

  // 값을 넣기 전에 변수를 출력하거나 하는 등의 실수를 방지할 수 있음
  // Flutter로 data fetching을 할 때 유용
}

 

앱을 compile 했을 때 앱 내에서 보유한 값이 아니라 api 호출 등을 통해 값을 나중에 받아오는 경우 late를 사용할 수 있다.


6) Constant Variables

Constant 변수는 javascript나 typescript의 const와는 다르다.

Dart의 const는 compile-time constant를 만들게 된다.

 

void main() {
  const name = 'kuuneeee';
  // const 변수는 final 변수와 같이 업데이트 될 수 없음
  // compile-time(compile되는 시점)에 알고 있는 값이어야 한다는 것

  // API 키값을 예시로 들면, 
  const API1 = '12345';
  const API2 = fetchAPI();

  // API1은 현재 어플리케이션이 compile될 때, 알고 있는 값이므로 const 변수로 선언 가능
  // API2는 현재 어플리케이션이 compile될 때가 아닌 API 호출 시에 알게 되는 값이므로 const 변수로 선언 불가능
    // API2는 const가 아니라 final이 맞음
}

 

compile 될 때 알고 있고 변경되지 않아야되면 const,

compile 될 때 알고 있지 않지만 변경되지 않아야 한다면 final을 사용한다.

 

즉, const는 앱 내에서 지정한 어떤 값이 변경되지 않아야 하는 값을 지정할 때 사용한다.

728x90
반응형

'CS | Computer Science > FE | Front-end' 카테고리의 다른 글

[App] Dart 5. Classes  (1) 2024.04.19
[App] Dart 4. Functions  (0) 2024.04.19
[App] Dart 3. Data Types  (0) 2024.04.18
[App] Dart 1. say "Hello World!"  (0) 2024.04.18