프론트/Dart

Dart #1. Hello World

따뜻한 개발자 2024. 10. 27. 19:24

Hello world

예시 코드: 

void main() {
  print('hello world');
}

 

결론

  • 모든 Dart 프로그램은 main 함수에서 시작한다.
  • 명령문 끝에는 세미콜론을 붙여야 하지만, 경우에 따라 Dart가 생략을 허용하기도 한다.

 

 

Variadbles

예시 코드:

void main() {
  var name = 'Alice'; // 타입 추론: String
  int age = 25; // 명시적으로 타입 지정
  print('$name, $age');
}

class Person {
  String name; // 타입 명시
  int age; // 타입 명시

  Person(this.name, this.age);
}

 

 

결론

  • Dart는 변수의 타입을 자동으로 추론하지만, 선언 후 초기화 시 타입 일관성을 지켜야 한다.
  • 함수나 메서드 내부의 지역 변수는 var를 사용하여 선언하는 것이 일반적이다.
  • 클래스의 속성이나 전역 변수 선언 시에는 타입을 명시하는 것이 관습이다.

Dynamic

예시코드:

void main() {
  dynamic name;  // 타입이 고정되지 않은 동적 변수

  if (name is String) {
    // 이 블록 안에서는 name이 String 타입임을 Dart가 인지
    print('name은 String 타입입니다.');
  }

  if (name is int) {
    // 이 블록 안에서는 name이 int 타입임을 Dart가 인지
    print('name은 int 타입입니다.');
  }
}

 

 

  • dynamic 타입은 모든 타입의 값을 담을 수 있으며, 초기화되지 않으면 타입이 고정되지 않는다.
  • is 연산자를 사용하면 타입을 검사할 수 있으며, 해당 블록 내에서는 해당 타입이 보장된다.
  • 이렇게 타입을 조건에 따라 구분하면 런타임 시 다양한 타입에 맞는 로직을 처리할 수 있다.
  • 꼭 필요한 때에만 사용하자

Null

예시코드:

void main() {
  String? name = 'jeongwon'; // name이 null일 수도 있고, String일 수도 있음.
  name = null;

  // name.length; // 컴파일 전에 IDE가 null 예외 가능성을 경고함.

  if (name != null) {
    print(name.length); // null 체크를 통해 경고가 사라짐.
  }

  // null 체크를 매번 피하고 싶을 때 ? 연산자를 사용.
  print(name?.isNotEmpty); // name이 null이면 아무것도 실행되지 않음.
}

 

 

  • String?과 같은 nullable 타입은 null과 특정 타입의 값을 모두 가질 수 있다.
  • IDE는 null 예외 가능성을 사전에 경고하여 NullPointerException을 방지한다.
  • if문을 사용해 null 체크 후 접근하면 경고가 사라진다.
  • ?. 연산자를 사용하면 변수가 null인지 확인 후 안전하게 메서드를 호출할 수 있다. 만약 변수가 null이라면 메서드는 실행되지 않는다.

Final

예시코드:

void main() {
  final name = 'jeongwon'; // final: 한 번 초기화 후 값 변경 불가
  name = 'jeongjae'; // 컴파일 에러: final 변수는 값을 변경할 수 없음
}

 

 

  • final 키워드를 사용하면 변수를 한 번만 초기화할 수 있다.
  • 초기화 이후에는 값을 변경할 수 없으며, 다시 할당하려고 시도하면 컴파일 에러가 발생한다.
  • final은 변경되지 않아야 하는 값(예: 상수)이나 초기화 후 고정되어야 하는 데이터를 선언할 때 유용하다.

Late

예시코드:

void main() {
  late final String name; // 초기값 없이 선언 가능
  
  // print(name); // 이 시점에서 사용하면 런타임 에러 발생

  name = 'jeongwon'; // 나중에 초기화
  print(name); // 정상 출력: jeongwon
}

 

 

  • late 키워드는 변수를 나중에 초기화할 것을 보장할 때 사용한다.
  • 초기값 없이 선언이 가능하며, 주로 API 요청 완료 후비동기 작업 이후 값을 할당할 때 유용하다.
  • late final을 사용하면 최초 초기화 후 값을 변경할 수 없도록 보장한다.
  • 초기화 전에 사용하면 런타임 에러가 발생하니 주의가 필요하다.

Const

예시코드:

void main() {
  // const API = fetchAPi(); // 컴파일 타임에 값을 알 수 없으므로 오류 발생
  const max_allowed_price = 120; // 컴파일 타임 상수

  print('최대 허용 가격: $max_allowed_price');
}

 

 

  • const 키워드컴파일 타임에 결정되는 상수를 선언할 때 사용한다.
  • API 요청과 같은 런타임 작업const로 선언할 수 없다.
  • const는 불변의 값을 보장하며, 주로 숫자나 문자열 같은 변경되지 않는 값을 선언할 때 유용하다.