Dart Basic

Bona의 블로그 입니다.·2023년 7월 10일
0

Dart

목록 보기
1/1
post-thumbnail

🍑 Dart란? 

  • google에서 만든 프로그래밍 언어

  • flutter에서 사용함.

  • dart는 두 개의 컴파일러를 가지고 있다.

    • Dart Web : Dart코드를 JavaScript로 변환해주는 컴파일
    • Dart Native : Dart코드를 여러 CPU의 아키텍처에 맞게 변환해준다.
      즉, IOS, Android, Windows, Linux, Mac으로 컴파일 할 수 있다.
  • Dart의 컴파일 방법 ⇒ just-in-time, ahead-of-time

    • JIT(just-in-time)
      : 수정 시 코드의 결과를 바로바로 보여준다.
      코드가 가상 머신에서 작동하고 있기 때문에 조금 느리다. 그래서 이 방식은 개발 중에만 사용한
    • AOT(ahead-of-time)
      : 코드 작성 후 컴파일 할 때 아키텍처를 지정해주어서 컴파일을 먼저하고 그 결과인 바이너리를 배포하는 것 (개발 중이라면 수정할 때마다 전체를 컴파일 해야 하는 단점)
    • flutter를 사용해 개발 중일 때에는 dart 가상 머신(dart VM)이 just-in-time 컴파일러를 제공한다. 그러나 개발이 완료된 후 배포를 할 때에는 AOT컴파일러를 사용한다.
      (native ARM이나 x64 기계어로 컴파일하기 위해서)
      ⇒ 개발 중에는 빠른 피드백, 최종 앱은 컴파일 되어 빠른 속도
      ⇒ 모바일 앱 개발에 적합하다.
  • null safety
    : 개발자가 null 값을 만들어냈을 때 애플리케이션이 망가지는 이슈를 해결하기 위해서 dart는 null safety를 도입함 ⇒ 프로그램을 빌드 시 좀 더 안전하게 할 수 있다.

  • flutter와 dart 모두 구글이 만들었다
    ⇒ 따라서 구글을 flutter를 위해 dart를 최적화 할 수 있다. 즉, 프레임워(flutter)를 위해서 프로그래밍 언어(dart)를 고칠 수 있다.





🍑 VARIABLES(변수) 

🥨 main 함수

  • main함수는 모든 Dart 프로그램의 Entry point이다.

  • main 함수에서 쓴 코드가 호출된다. (만약 main이 없다면 실행이 되지 않음)

  • dart는 자동으로 세미콜론을 붙여주지 않기 때문에 직접 붙여야 한다. (일부러 세미콜론을 안 쓸 때가 있기 때문)


🥨 변수

  • 변수를 만드는 2가지 방법

  • var
    : 함수나 메소드 내부에 지역변수를 선언할 때 사용
    이 방식은 자료형을 지정해주지 않으므로 dart가 추측해서 사용하는데 업데이트 할 때 자료형이 일치하지 않으면 에러가 난다.
    예를 들어 var name = "pizza"; 라고 했을 때 name변수의 자료형은 String인데 name의 값을 1(정수형)으로 업데이 하려고 하면 안된다.

  • 타입(자료형) 지정 : class에서 변수나 property를 선언할 때


🥨 Dynamic 타입

  • 여러가지 타입을 가질 수 있는 변수에 쓰는 키워드이다.
    (해당 변수의 타입을 알 수 없을 때 주로 사용)

  • 변수를 선언할 때 dynamic을 쓰거나 값을 지정하지 않으면 dynamic 타입을 가진다.


🥨 Nullable Variables

  • Null Safety
    : 개발자가 null 값을 참조할 수 없도록 하는 것이다.
    String뒤에 '?'를 붙여줌으로서 name이 String 또는 null이 될 수 있다고 명시해준 것입니다.

  • 기본적으로 모든 변수는 non-nullable(null이 될 수 없음)이다.


🥨 final 변수

  • var대신 final로 변수를 만들게 되면 이 변수는 수정할 수 없게 된다.
    (딱 한 번만 설정 될 수 있음)

🥨 late 변수

  • 초기 데이터 없이 먼저 변수를 생성하고 추후에 데이터를 넣을 때 주로 사용한다.

  • flutter로 data fecthing을 할 때 유용하다.

  • late 변수를 만들고, API에 요청을 보낸 뒤에 API에서 값을 보내주면 그 응답 값을 late변수에 넣어 사용할 수 있다.


🥨 Constant 변수

  • dart에서 const는 compile-time constant를 만들어준다.

  • const는 컴파일할 때 알고 있는 값을 사용해야 한다.

  • 만약 어떤 값인지 모르고, 그 값이 API로부터 오거나 사용자가 화면에서 입력해야 하는 값이라면 그건 const가 아닌 final이나 var가 되어야 한다.

  • const : 컴파일 시점에 바뀌지 않는 값 (상수)
    final : 컴파일 시점에 바뀌는 값 (API에서 받아온 값, 사용자 입력 값)





🍑Data Types 

🍧 Basic

  • 아래 타입을 포함한 거의 대부분의 타입들이 객체로 이루어져 있다. (함수도 객체)
    이것이 Dart가 진정한 객체 지향 언어로 불리는 이유이다.

    🔢 num

  • 숫자형의 대표격인 타입,
    int와 double은 서로 간에 형변환이 불가능하지만, num을 통해서는 가능하다

  • 이렇게 형변환을 해야 하는 변수의 경우 처음부터 num으로 타입을 지정하면 된다.

  • 다양한 숫자 값을 받아야 되는 경우 int와 double보단 num을 쓰는 것을 권유

    void main() {
    	num a = 7;
    	num b = 3.14;
    	a = b;
    	print(a);
    }

    📌 int ⇒ 정수
    📌 double ⇒ 실수


🍧 Lists

  • dark에서 list를 선언하는 것은 두 가지 방법이 있다.

🍧 Collection If / For

  • dart의 유용한 점은 collection ifcollection for을 지원하는 것이다.

  Collection if

  • collection if를 사용하면 '존재할 수도 안 할 수도 있는 요소'를 가지고 올 수 있다.

  Collection for

  • 반복(for)을 사용하여 컬렉션을 구축하는 데 사용할 수 있다.

🍧 Maps

  • 일반적으로 map은 key와 value를 연결하는 객체이다.
    키와 값 모두 모든 유형의 객체가 될 수 있고, 각 키는 한 번만 발생하지만 동일한 값을 여러 번 사용할 수 있다.

🍧 Sets

  • set도 두 가지 방법으로 정의할 수 있다.

    • var을 사용
      var numbers = {1, 2, 3};

    • 자료형 명시
      Set numbers = {1, 2, 3};

  • list는 대괄호([ ])를 쓰며 set은 중괄호({ })를 쓴다.
    set의 요소들은 유니크하다. 🟰 set은 중복이 허용되지 않는다.
    (list의 요소는 중복이 허용된다.)





🍑 Function(함수) 

🍬 Function

  • Dart는 진정한 객체 지향 언어이므로 함수도 객체이며 타입이 Function이다.
    이는 함수를 변수에 할당하거나 다른 함수에 인수로 전달할 수 있음을 의미

🍬 Named Parameters

  • Dart의 function은 ‘named parameter’라는 것을 지원 한다.
    argument(전달 인수)에 이름을 붙인 것 이름만 정확히 안다면 순서는 상관 없다
    반대로 potional parameter는 순서를 꼭 지켜야 한다.


🍬 Optional Positional Parameter

  • Dart에서 [ ] 은 optional, positional parameter를 명시할 때 사용된다.

🍬 QQ Operator

  • ?? 연산자를 이용하면 왼쪽 값이 null인지 체크해서 null이 아니면 왼쪽 값을 리턴하고 null이면 오른쪽 값을 리턴한다.

  • ??= 연산자를 이용하면 변수 안에 값이 null일 때를 체크해서 값을 할당해줄 수 있다.
    변수의 값이 null일 때 값을 할당해 주는 연산자이기 때문에 null이 아니면 값이 할당되지 않는다.


🍬 Typedef

  • typedef를 이용하면 자료형을 간편하게 작성할 수 있다.
    자료형에 사용자가 원하는 alias(별칭)를 붙일 수 있게 해준다.
    다음은 typedef를 사용한 예시이다.




🍑 Class 

🍒 dart에서 class 만들기

  • class에서 property 만들기
    class에서 property를 선언할 때는 타입을 지정해준다.
    function 내에서 variable을 사용할 때에는 var을 사용하면 된다 (타입 명시 필수X)

🍒 Constructors

 consturctor method(생성자 함수)

  • constructor method(생성자 함수)는 클래스 이름과 같아야 한다.(대소문자까지)
  • 좀 더 간단하게 constructor 사용하기 (argument의 위치가 중요!!)

🍒 Named Constructor "Parameters"

  • 생성자 함수에서 positional argument를 사용하는 것은 클래스가 커지면 비효율적인 방법이 된다. argument가 3개만 되어도 혼동이 올 수 있다. (아래 참고)
  • named argument를 가진 생성자 함수로 바꾸면 된다.

 named argument를 가진 생성자 함수: 중괄호({}) 사용

  • 하지만 여기에는 큰 문제가 있다.
    변수가 null일 수도 있기 때문에 required를 이용하거나 기본 값을 지정해주어야 한다.

🍒 Named Constructors

  • 조금 다르게 동작하는 또 다른 Constructor를 가지고 싶다면?
    예를 들어, 두 개의 Constructor를 만들고 싶다고 한다
    (xp를 0으로 초기화 시킨 blue팀, red팀 player를 만든다고 가정)

  • Named Constructor란?
    class를 초기화하는 method, 필요에 따라 다른 인자를 받을 수 있다.
    콜론(:)을 사용하여 클래스의 property를 초기화 한다


🍒 Named Constructors2

  • Named Constructor는 flutter에서 매우 많이 사용되는데 api에서 json형태의 데이터를 받아서 바로 Flutter Dart class를 생성할 때 자주 사용된다.
  • API로부터 여러 Playter가 들러있는 목록을 받는다고 가정했을 때…


🍒 Cascade Notation

  • Cascade Operator : 일종의 sugar syntax

🍒 Enums

  • enum은 우리가 코드를 작성할 때 실수를 하지 않게 도와준다.
    flutter에는 여러 옵션들이 많다(color, margin, padding, style, 정렬 등)
    그래서 오타 같은 실수들이 자주 발생할 수 있고 이런 실수들은 눈에 잘 안 보일 수도 있다. 이런 상황을 방지하기 위해 사용하는 것이 enum이다.

  • enum type의 변수들은 해당 enum type에 생성된 값들 중에서만 값이 할당될 수 있다.

  • 예시
    enum 생성 시 { } 안의 내용에 따옴표로(””,’’) 묶지 않는다 (= 텍스트 형태로 쓰지 않는다.)
    이런 방식으로 새로운 “타입”을 생성한다.

  • enum은 새로 생성하기 보다는 기존의 것을 자주 사용하게 될 것이다.

🍒 Abstract Classes (추상화 클래스)

  • 추상화 클래스는 (추상화 클래스를 extends 한) 클래스들이 직접 구현해야 하는 메소드들을 모아 놓은 일종의 청사진이라 보면 된다.
    추상 클래스에서는 기능을 구현하지 않는다.

  • 추상 클래스를 확장하는 클래스는 추상클래스의 파라미터도 상속받는다.

  • 그럼 추상 메소드가 필요한 이유는 무엇일까?
    공통된 필드와 메소드를 통일하기 때문이다.
    클래스가 여러 개일 경우에는 전에 사용했던 필드 및 메소드와 이름과 규격이 달라질 수 있다. 추상클래스는 필드와 메소드를 같은 이름과 규격으로 만들게 함으로써 통일성을 유지해준다.

🍒 Inheritance

  • 상속을 하고 super를 이용해 부모 클래스의 생성자를 호출할 수 있다.

  • 상속한 부모 클래스의 프로퍼티에 접근하게 하거나 메소드를 호출할 수 있다.
    이 때, 가장 중요한 것은 확장한 부모 클래스가 생성자를 포함하고 있는데
    그 클래스를 다른 어떤 곳에서 사용하려면 필요한 값을 전달해야 하고
    그 부모 클래스의 생성자를 호출해줘야 한다.


🍒 Mixins

  • Mixin은 생성자가 없는 클래스이다. 클래스에 프로퍼티들을 추가할 때 유용하다.
    extends가 아닌 with를 통해 Mixin의 프로퍼티들을 가져올 수 있다.
    extend를 사용하여 상속받은 클래스는 자식 클래스, 상속한 클래스는 부모클래스가 되는 것이고, 자식 클래스는 부모 클래스를 super를 통해서 접근할 수 있다.

  • Mixin은 with라는 키워드를 통해서 단순히 Mixin 내부의 프로퍼티와 메소드들을 가져오는 것 뿐이다.

  • 강의에서는 에러가 안 났는데 vsCode에서 에러가 남
    참고 링크에 들어가 보니 mixin을 쓰려면 표시하라는 얘기였다.
    최근 버전부터는 mixin 사용법이 수정 된 듯

    mixin이자 class여야 한다면 ⇒ mixin class 클래스명 { }
    순수 mixin 이면 ⇒ mixin 클래스명 { }



profile
제가 공부하고 공유하고 싶은 글을 올리고 있습니다.

0개의 댓글