개발자/SupaBase && Flutter

02. (Dart 개념_노마드코더 강의) Variables

푸루닉 2024. 10. 23. 17:18

2.0 Main

  • main함수는 모든 Dart 프로그램의 Entry point이다.
  • main 함수에서 쓴 코드가 호출된다. (만약 main이 없다면 실행이 되지 않음)
  • dart는 자동으로 세미콜론을 붙여주지 않기 때문에 직접 붙여야 한다. (일부러 세미콜론을 안 쓸 때가 있기 때문)
    void main(){  
    print("hello world");  
    }  

2.1 Var

dart에서는 변수를 var 키워드 또는 명시적 타입을 사용해 만든다.

void main(){  
var name = "jisu"  
}  
void main(){  
String name = "jisu"  
}  

당연한 말이지만 다른 타입의 변수는 서로 대입할 수 없다.

보통
함수나 메소드 내부에 지역변수를 지정할 때는 var를 사용하고
class에서 변수프로퍼티를 선언할 때는 명시적 타입을 사용한다.

var를 사용하는게 dart 스타일가이드의 권장 방식이다.

2.2 Dynamic

dart는 여러 타입을 가질 수 있는 dynamic 타입을 지원한다.

dynamic name;  

만약 변수를 선언할 때 아무런 값을 지정하지 않거나, 타입을 선언하지 않으면 자동적으로 dynamic 타입을 가진다.

void main(){  
var name; // }  

dynamic 타입은 언제 사용될까?
대표적으로 타입을 알기가 힘들 때 사용한다. 예를 들어 json을 작업할 때 같은 경우다.

하지만 dynamic 타입은 다양한 타입을 가질 수 있기 때문에 정말 필요할 때만 사용해야 한다. (위험 방지)

2.3 null safety

null safety는 개발자가 null 값을 참조할 수 없게 하는 것이다.

다음 코드를 보자.

bool isEmpty(String string) => string.length == 0;  

main(){  
isEmpty(null);  
}  

다음과 같은 코드는 어떻게 실행될까?

정답은 NoSuchMethodError를 실행한다. 왜 이렇게 실행될까?
바로 String을 보내야 할 곳에 null을 보냈기 때문이다.
null에는 length라는 속성이 없기 때문이기도 하다.

이와 같은 에러는 컴파일러에서 잡을 수 있는 에러가 아니다.
이런 상황이 발생하지 않도록 null를 삭제하기에는 null 값은 유용하다.

그럼 어떻게 null 값을 참조하는 것을 dart는 어떻게 보호할까?
dart에서는 변수가 null이 될 수 있음을 명확히 표시해야한다.

다음 코드를 보자

void main(){  
String name = "jisoung";  
name = null;  
}  

이 코드는 에러가 난다. name이 null 값을 참조할 수 있다고 알려주지 않고 null 값을 참조하기 때문이다.

그러면 다음 코드를 보자.

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

이 코드는 에러가 나지 않는다. 차이점이 보이는가? 바로 ?를 사용해 이 변수에는 null이 참조될 수 있음을 알려주는 것이다. 만약 ?를 붙인 변수는 이 변수가 null인지 아닌지 확인해야 한다.

void main(){  
String? name = "jisoung";  
name = null;  
if(nico != null){  
nico.isNotEmpty;  
}  
}  

2.4 final 변수

var대신 final로 변수를 만들게 되면 이 변수는 수정할 수 없게 된다. (딱 한 번만 설절될 수 있음)
자바스크립트의 const랑 비슷하다.

void main() {  
final name = "pizza";  
name = "ham"; // 수정 불가  

final String username = "tom";  
name = "tom2"; // 수정 불가  
}  

2.5 late 변수

초기 데이터 없이 먼저 변수를 생성하고 추후에 데이터를 넣을 때 주로 사용한다.
flutter로 data fecthing(서버 혹은 API에서 정보를 가져오는 과정)을 할 때 유용하다.
late 변수를 만들고, API에 요청을 보낸 뒤에 API에서 값을 보내주면 그 응답값을 late변수에 넣어 사용할 수 있다.

void main() {  
late final String name;  

print(name); // name 변수에 접근 불가  
}  
void main() {
    late final String name;
    // do something, go to api
    name = 12;
}

2.6 Constant 변수

dart의 상수는 자바스크립트와 다르다.
자바스크립트의 상수는 dart의 fianl과 같다.
dart의 const는 compile-time constant를 만들어 준다.
const와 fianl의 가장 큰 차이점은 컴파일이 되는 시점에 그 값을 알 수 있는지 없는지의 차이다.

예를 들어 fetchApi를 하는 변수는 컴파일하는 시점에 그 변수를 알 수가 없다.

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

위 코드의 경우에는 const가 아닌 final이 더 적합하다.

final를 쓰는 대표적인 경우는
API fetching, 사용자가 화면에서 입력해야하는 값 등이 있다.

const를 쓰는 대표적인 경우는
max_allowed_price와 같은 상수에 쓰인다.(앱에서 사용할 상수들)

  • late와 const는 같이 사용할 수 없다.
    void main() {
      late const API = 11; // late 키뭐드는 후에 변수가 초기화될 것임을 나타냄
    }

2.7 총정리

  1. var 변수명 = 변수값
  • 처음 할당한 변수값과 같은 타입으로만 업데이트 가능
  1. String 변수명 = 변수값
  • 명시적으로 설정한 타입(String)으로만 업데이트 가능
  1. String? 변수명 = 변수값
  • 명시적으로 설정한 타입(String) 외에 Null 타입으로도 업데이트 가능
  1. dynamic 변수명 = 변수값
  • 처음 할당한 변수값과 다른 타입으로도 업데이트 가능
  1. final 변수명 = 변수값
  • 한번 할당한 변수값을 바꿀 수 없음
  1. late final String 변수명
  • 처음 변수명을 선언할 때 변수값을 할당하지 않아도 됨
  • 나중에 명시적으로 설정한 타입(String)으로 변수값을 설정할 수 있음
  • 한번 할당한 변수값을 바꿀 수 없음
  1. const 변수명 = 변수값
  • 컴파일하기 전(compile-time)에 미리 변수값을 정해줘야 함
  • 한번 할당한 변수값을 바꿀 수 없음