[Dart] 기본 개념 정리🎯

김정현·2023년 12월 3일
0

Dart

목록 보기
1/3
post-thumbnail

💡 이 글은 노마드코더Dart 시작하기 강의 내용을 토대로 정리한 글입니다.

Dart만이 가진 최소한의 개념 및 문법을 정리하였으며, 저를 포함한 Dart 입문자에게 조금이나마 도움이 되었으면 합니다. (피드백도 언제나 환영입니다!🫰)
강의 후기: 필수 개념을 간단하고 쉽게 전달하는 무료 강의! 영어로 진행되기 때문에 언어 공부까지 일석이조!
(물론 난 한글 자막 켜놓고 봤지만..)

1. Variables

Keyword의미메모
var타입 미지정 및
타입 변경 불가
주로 함수 내 지역 변수로 사용
dynamic타입 미지정 및
타입 변경 가능
되도록 쓰지 않는 것을 권장
type + ?nullable 변수로 선언"Nullable variable" 설명 참고
final데이터 변경 불가run-time에 값 지정
const데이터 변경 불가compile-time에 값 지정
late늦은 초기화 선언final이나 var 앞에 사용

💡 Nullable variable ?

Dart의 모든 변수는 기본적으로 null값을 가질 수 없는 "non-nullable"이다.
이는 null값 참조로 인한 런타임 에러가 발생하지 않도록 하는 안전 장치가 된다.
하지만 경우에 따라 개발 시에 필요한 순간이 있을 것!
이 때 변수를 nullable하도록 선언하는 것이 “?” 키워드이다.


예시 코드

String? name = "developer";
name = null;  // null 대입 가능
name.length;  // null 참조 위험으로 error 발생
name?.length; // name이 null이 아니면 length 반환!

2. Data Types

Keyword의미메모
numint or double
List< type >데이터 컬렉션[ ]형태, 중복 가능
Set< type >데이터 컬렉션{ }형태, 중복 불가능
Map< type, type >{key:val}쌍의 데이터 컬렉션value의 type을 다양하게 사용 가능
(int, string, etc..)


3. Functions

  • "=>" syntax

    한 줄 짜리 함수라면 "=>"를 통해 간결히 작성 가능하다.

    // 아래 두 함수는 동일한 의미
    int add(int a + int b) { return a + b; }
    int add(int a + int b) => a + b;
  • Named parameters

    함수 param을 선언한 이름에 따라 기입하는 방식이다.
    (💡 required: 함수 호출 시, 반드시 기입해야하는 매개변수로 지정하는 modifier)

    void sayHello({required String name, required int age})
    {
      print("Hello, my name is $name and I'm $age.");
    }
    
    void main()
    {
        sayHello(
          name: "kim",
          age: 97
        );
    }
    >> Hello, my name is kim and I'm 97.
  • QQ operator

    1. left "??" right : left가 null이라면 right를, 아니라면 left를 반환
    2. left "??=" right: left가 null이라면 right을 left에 대입
    // 1. ?? 
    // name이 null이면 "anonymous"를,
    // 아니면 대문자로 변환된 값을 반환
    String capitalizeName(String? name) => name?.toUpperCase() ?? "anonymous"
    // 2. ??= 
    void main()
    {
      String? name;
      name ??= 'kim';
      name ??= 'another';    // null이 아니므로 대입 불가
      print(name);
    }
    >> kim

4. Classes

  • Constructor (Positional)

    class Player
    {
      final String name;
      int hp;
      
      Player(this.name, this.hp);    // 생성자를 해당 형식으로 간단히 작성 가능
    }
    
    void main()
    {
      Player player = Player('kim', 100);
    }
  • Constructor (Named)

    class Player
    {
     final String name;
     int hp;
     String team;
     int age;
     
     // named parameter 적용
     Player({
       required this.name,
       required this.hp,
       required this.team,
       required this.age
     });
     
     // team, hp는 기본값 지정
     Player.createBluePlayer({required String name, required int age}) 
       : this.name = name, this.age = age, this.team = 'blue', this.hp = 0;
    }
    
    void main()
    {
      Player player = Player(name: 'kim', hp: 100, team: 'red', age: 97);
     
      Player bluePlayer = Player.createBluePlayer(
        name: 'park',
        age: 98
     );
    }
  • Cascade Notation ("..")

    // class Player는 상단에 작성한 것으로 가정.
    void main()
    {
       Player player = Player(name: 'kim', hp: 100, team: 'one', age: 97)
       ..name = 'new'    // player.name과 동일
       ..hp = 120000     // player.hp와 동일
       ..team = 'two';   // player.team과 동일. ;은 맨 마지막 라인에만 작성
    }
  • Enum

    enum Team
    {
      red,
      blue
    }
    
    class Player
    {
      final String name;
      int hp;
      Team team;   // String대신 enum 적용
      int age;
      
      ...
    }
    
    void main()
    {
       Player player = Player(
         name: 'kim', 
         hp: 100, 
         team: Team.red,    // 'red'대신 enum 적용
         age: 97
       );
    }
  • Abstract class(추상 클래스)

    abstract class Human
    {
      void walk();  // * C++의 순수 가상 함수 느낌
    }
    
    class Player extends Human
    {
      void walk() { print("player is walking"); }   // * 추상 클래스의 함수를 반드시 정의
    }
  • Inheritance(상속)

    abstract class Human
    {
     final String name;
     Human({required this.name});
     
     void sayHello() { print('Hello my name is $name'); }
    }
    
    class Player extends Human  // "extends" 키워드로 상속
    {
     final Team team;
     ...
     
     Player({required this.team, this.name}) 
       : super(name: name);  // * super(~)로 부모 클래스 생성자에 param 전달
     
     
     void sayHello() 
     { 
       super.sayHello();  // * super.으로 함수 접근 가능
       print("and I play for $team"); 
     }
    }
  • Mixins

    Mixin은 생성자가 없는 클래스로, 다른 클래스에서 Mixin의 프로퍼티나 메소드를 가져와 사용할 수 있다. (상속은 ❌)

    class Strong
    {
      const double strength = 96.129;
    }
    
    class Fast
    {
      const double speed = 99.828;
    }
    
    class Player with Strong, Fast  // "with" 키워드로 선언
    {
     ...
    }
    
profile
하고풍거(河鼓風去) 삭다하자(削多㰤慈)

0개의 댓글