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 총정리
- var 변수명 = 변수값
- 처음 할당한 변수값과 같은 타입으로만 업데이트 가능
- String 변수명 = 변수값
- 명시적으로 설정한 타입(String)으로만 업데이트 가능
- String? 변수명 = 변수값
- 명시적으로 설정한 타입(String) 외에 Null 타입으로도 업데이트 가능
- dynamic 변수명 = 변수값
- 처음 할당한 변수값과 다른 타입으로도 업데이트 가능
- final 변수명 = 변수값
- 한번 할당한 변수값을 바꿀 수 없음
- late final String 변수명
- 처음 변수명을 선언할 때 변수값을 할당하지 않아도 됨
- 나중에 명시적으로 설정한 타입(String)으로 변수값을 설정할 수 있음
- 한번 할당한 변수값을 바꿀 수 없음
- const 변수명 = 변수값
- 컴파일하기 전(compile-time)에 미리 변수값을 정해줘야 함
- 한번 할당한 변수값을 바꿀 수 없음
'개발자 > SupaBase && Flutter' 카테고리의 다른 글
06. (Dart 개념_노마드코더 강의)설계도에 빗댄 Dart 개념 총정리 (2) | 2024.10.23 |
---|---|
05. (Dart 개념_노마드코더 강의)Classes (0) | 2024.10.23 |
04.(Dart 개념_노마드코더 강의) Functions (2) | 2024.10.23 |
03. (Dart 개념_노마드코더 강의) Data Type (1) | 2024.10.23 |
01. (Dart 개념_노마드코더 강의) Flutter가 Dart를 선택한 이유 (0) | 2024.10.23 |