Frontend/Dart&Flutter

Dart 기초 (Variables, DataType)

괴발새발자 2023. 4. 21. 09:53

Flutter 공식 문서 : https://docs.flutter.dev

Dart 사용하기 : https://dartpad.dev 

  • JIT(Just In Time) 컴파일 AOT(Ahead of Time) 컴파일
    • JIT : Dart VM에서 개발 중일 때 사용
    • AOT : 앱 배포시 사용. native ARM, x64 머신 코드로 변환
  • null saftety를 통해 null 값을 참조하여 에러가 생기는 것 방지
  • dart와 flutter 모두 구글이 만듦 → flutter 맞춤형 언어

시작하기 전

  • 반드시 main method가 있어야함.
    실제로 실행하는 것은 이 안에 넣어야함.
  • 세미콜론을 반드시 써야함 / 안 쓰는 경우도 있음

Variables

  • 변수 선언시
    • var 사용 : 대체로 권장됨
    • String 등의 데이터 타입 사용 : class의 property를 작성할 때 권장됨
    var name = "니꼬";
    name = "alphabet";
    // 변수는 업데이트할 수 있으나 같은 데이터 타입이어야함
    
    String name2 = "nikko";
    name2 = "alphabet";
    // 대체로 var 사용이 권장됨 (컴파일러가 타입을 추론함) 메소드나 지역 변수 선언 시에는 var 사용이 나음
    // type 사용시 : class 의 property를 작성할 때 사용 권장.
  • dynamic type : 필요할 때만 쓰는 것이 좋음
void main() {
  var name;
  dynamic name;
  name = '니꼬';
  name = 1234;
  // 다이나믹 타입
  if (name is String) {
    name.// dynamic일 때는 쓸 수 있는 메서드가 많지 않지만 
         // dynamic이 아닌 타입을 지정할 경우 쓸 수 있는 메서드가 많음
  }
  if (name is int) {
    name.// dynamic일 때는 쓸 수 있는 메서드가 많지 않지만 
         // dynamic이 아닌 타입을 지정할 경우 쓸 수 있는 메서드가 많음
  }
  
}
  • null safety : null을 참조할 수 없도록 함. 어떤 변수 혹은 데이터가 null이 될 수 있음을 명시함.
    • 기본적으로 모든 변수는 null이 될 수 없음
    • 물음표 넣을 경우 변수가 null 또는 타입이 될 수 있음을 앎.
    void main() {
      String? nico = 'nico';
      // nico would be string or null
      nico = null;
      nico?.isNotEmpty;
      // nico가 null이 아니라면 isNotEmpty 속성을 보여줌
      if (nico != null) {
        nico.isNotEmpty;
      }
    }
  • final 변수는 수정할 수 없음. js의 const와 같음
void main() {
  final name = 'nico';
  name = 'las'; // 오류
  final String name2 = 'nico';
  name2 = '1'; // 오류
}
  • late : 초기 데이터 없이 변수 선언 가능
void main() {
  late final String name;
  print(name); // 에러 -> null saftety. 변수를 넣어야 사용할 수 있음.
  // do something, go to api or somthing
  name = 'nico'; // 데이터를 나중에 넣어줌
  name = '12'; // 에러
}
  • const : dart의 final과 비슷. compile time constant를 만듦.
void main() {
  const max_allowed_price = '12312324';
  // 컴파일 할 때 알 고 있는 값을 사용 (앱스토어에 앱 올리기 전에 아는 값)
  // api로 부터 오거나 사용자가 입력하는 값이라면 final이나 var가 되어야함
  // 컴파일할 때 평가됨
  max_allowd_price = '1234'; //에러
}

Data Types

  • 기본 자료형
void main() {
  // 모든 데이터 타입들이 class임
  String name = 'nico';
  bool alive = true;
  int age = 12;
  double money = 69.99;
  // integer 와 double의 부모 자료형 num
  num x = 12;
  x = 1.1;
}
  • List
void main() {
  var numbers = [1, 2, 3, 4,];
  List<int> numbers2 = [1, 2, 4, 5,];
  numbers.first; // 첫번째 요소
  numbers.last; // 마지막 요소
  numbers.add(1); // 마지막에 1을 추가함 [1, 2, 3, 4, 1]
}
// 마지막에 ,를 추가할 경우 세로로 포매팅 (vscode)
  • collection if
void main() {
  var giveMeFive = true;
  var numbers = [
    1, 
    2, 
    3, 
    4,
// collection if
    if (giveMeFive) 5,
  ];

  // 다음 코드와 같음
  if (giveMeFive) {
    numbers.add(5);
  }
}
  • String Interpolation
void main() {
  var name = 'nico';
	var age = 10;
  var greeting = 'Hello everyone, my name is $name and I\'m ${age + 2}!';
  // 변수 담을 때는 $변수 계산할 때는 ${변수 + ...} 로 사용
  
  print(greeting); 
  // Hello everyone, my name is nico and I'm 12!
}
  • Collection For
void main() {
 var oldFriends = ['nico', 'lynn'];
  var newFriends = [
    'lewis',
    'ralph',
    'darren',
    for(var friend in oldFriends) "❤️ $friend",
  ];
  print(newFriends) // [lewis, ralph, darren, ❤️ nico, ❤️ lynn]
}
  • Maps
void main() {
  var player = {
    'name': 'nico',
    'xp': 19.99,
    'superpower': false,
  };
  // Type : Map<String, Object>  --> 여기서 Object는 any와 같음
  Map<int, bool> player2 = {
    1: true,
    2: false,
    3: true,
  };
  Map<List<int>, bool> player2 = {
    [1, 2, 4, 5]: true,
  };
  List<Map<String, Object>> players = [
    {'name' : 'nico', 'xp': 19993.999}, 
    {'name' : 'nico', 'xp': 19993.999}, 
  ]
}
  • Sets : 중복되지 않는 요소의 자료형
void main() {
  var numbers = {1, 2, 3, 4);
  Set<int> numbers = {1, 2, 3, 4);
  numbers.add(1);
  numbers.add(1);
  numbers.add(1);
  numbers.add(1);
  print(numbers); // {1, 2, 3, 4}
}