2018.03.17


* Dart2를 A Tour of the Dart Language 문서를 바탕으로 간단히 정리해 본다. 


공식 안내 문서의 첫 번째 예제 샘플을 살짝 수정하여 테스트해 봤다. 


Hello Dart2 :)



결과




코드를 통해 알 수 있는 특징들.

  • Indent block은 2칸. 
    • 강요 사항은 아니겠지만 로마에선 로마법을 따르는 것이... (Effective Dart: Style 참조)
  • 코드 내의 Comment는 //로 사용하면 된다.
  • main()이 시작점이다.
  • 변수 선언은 var로 한다. var로 변수를 선언할 경우 타입은 알아서 판단한다.
    • (당연하지만) 명시적으로 타입을 지정하여(String) 변수를 선언할 수도 있다.
  • 함수 선언 시 리턴 값이 없는 경우(void) 생략이 가능하다.
    • 그렇다면 리턴 값은 var가 될 수 있을까?

안된다.

  • console 출력은 print. 변수를 출력하고 싶을 때는 $[변수명] 또는 ${[변수명]}
    • 코드의 끝에는 ';' 붙여야 한다. (대부분의 언어에서 당연한 건데 요새 주 개발 언어가 swift / python이다 보니 새삼스레 눈에 들어온다.)



코드를 통해서는 보이지 않지만 안내서에 나와있는 알아두어야 할 기본적인 사항들

  • Dart의 모든 것은 Object 클래스에서 파생된 object이다.( Everything you can place in a variable is an object, and every object is an instance of a class. Even numbers, functions, and null are objects. All objects inherit from the Object class.)
  • var 말고 num 같이 지정된 정적 타입으로 변수를 선언하면 사용자의 의도가 분명해지고, 해당 변수에 대해 정적 타입 검사가 가능하다. (var를 쓰기보단 사용 의도를 확실히 하도록 정적 타입으로 변수를 선언하는 것이 좋을 것 같다.)
  • Strong mode : Strong mode에서는 정적 검사 및 런타임 검사를 실행함으로써 런타임 전에도 코드 오류를 잡을 수 있다고 하는데 Dart2에서는 Strong mode가 선택 불가한 기본 사양이라고.. Dart1을 접하지 않았던 나에게는 그냥 넘어가도 되는 이야기 같다.
  • 함수 내에서 함수를 만들 수 있다.
  • public / private / protected 같은 접근 제한자가 없다. 다만 _(밑줄)로 시작하는 식별자는 비공개라고 한다. (이거 마음에 든다.) 
  • 식별자는 문자 또는 _(밑줄)로 시작한다.
  • 다트 도구는 경고 및 오류의 두 가지 종류의 문제를 보고 한다. 경고는 코드가 작동하지 않을 수도 있지만 프로그램 실행을 방해하지는 않는다. 오류는 컴파일 타임 또는 런타임 시로 나누어 볼 수 있는데, 컴파일 타임 오류일 경우는 코드가 전혀 실행되지 않고, 런타임 오류일 경우는 코드가 실행되는 동안 예외가 발생한다.
  • 값이 할당되지 않은 모든 변수의 초기값은 null이다.


좀 더 코드를 뜯어보면.

  • void printNumber(num aNumber)에서의 num은 무엇인가?

Dart의 Built-in Type 중 하나. Dart에는 아래와 같은 Built-in Type이 있다고 한다.

  • Number : 숫자. subtype으로 int, double가 있다. 결국 저 num은 int 또는 double 형태의 변수를 의미한다. int의 범위는 -2^53 ~ 2^53. double은 64비트형. int, double로 명시적으로 써도 되고 num으로 퉁쳐도 되는 것 같다.
  • String : 문자열
  • Boolean : true / false
  • List : [1, 2, 3]
  • Map :   key, value로 구성.

var map = {

  'hello': 'world',

  'name': 'genkino'

};


var code = {

  42: 'Answer to the Ultimate Question of Life, the Universe, and Everything',

  52: 'genkino's nickname'  

};

  • Runes : UTF-32 코드값으로 이루어진 문자열. 다른 언어에서 보지 못한 독특한 자료형이다.

var clapping = '\u{1f44f}';


Runes input = new Runes(

  '\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}');

 print(new String.fromCharCodes(input));


뭐.. 이런 식으로 사용된다고 한다. 다양한 이모티콘이 출력된다.


  •  Symbol : 안내서를 봤을 때는 명확히 이해가 가지 않는다. Dart에서 선언된 연산자 또는 식별자라고 하는데 꼭 사용할 필요는 없지만 이름으로 식별자를 참조하는 API의 경우에는 식별자 이름이 변경되지만 식별자 심벌은 변경되지 않으므로 쓸만하다(?)라는 설명이 붙어있다. unique id 같은 용도인가..? 이 부분은 Dart를 좀 더 사용하면서 자연스럽게 알게 될 것이라고 기대(;;) 해 본다. 


하나만 더 확인하고 넘어가자면

  • final / const : 둘 다 선언하면 값을 변경할 수 없다는 공통점이 있는데 약간의 차이가 있다. final의 경우는 한번 값을 할당하면 재 할당을 할 수 없다는 의미라면 const의 경우는 상수같이 사용된다는 의미..?(컴파일 타임에 상수처럼 사용된다..?) java에서의 final과 c에서의 const가 연상된다.

final과 const의 차이를 눈으로 확인할 수 있는 코드를 만들어 보았다.


// Code

...

final DateTime now = new DateTime.now();

const DateTime coNow = new DateTime.now(); 

now = new DateTime.now();

...


// Run

Warning: Cannot resolve setter.   

now = new DateTime.now();   

^^^ 


main.dart:11:26: Error: Not a compile-time constant.   

const DateTime coNow = new DateTime.now();

                                              ^^^^^^^^^^^^^^^^^^


new DateTime.now()의 값은 실행 시에 결정되는 값인데 final / const는 각각 다르게 반응한다.


final의 경우 컴파일 시 에러가 나지 않지만 한번 값이 할당되면 재 할당을 할 수 없다. (Warning에 setter가 없다고 나온다. getter만 있다는 설명이 더 명확한 듯) 실행 시에 결정되는 값을 할당할 수 있다.


const는 실행 시에 결정되는 값은 할당할 수 없다. 애초에 런타임 전에 정해지는 값만 할당 가능하다. (24라던가 24*2 라던가 'hello world' 라던가...)


하나 더 만들어 봤다.


  • const list = [1, 2]; 는 에러. 
  • const는 const 성격의 값만 할당이 가능하다. 아마도 list는 런타임 시에 값이 정해지는 타입인 것으로 보인다.
  • final의 경우는 앞의 예제에서도 확인했듯이 런타임 시에 값이 정해지는 타입도 할당 가능.
  • const로 할당된 값(Instance)은 각자 다른 변수에 할당하더라도 같은 Instace이기 때문에 비교를 하면 true
  • const가 아니라면 같은 값일지라도 다른 instance이기 때문에 비교 시 false

아직 명확하지는 않고 쓰임을 어떻게 구분할지 아직 확실히 들어오지는 않다만,

  • final은 setter가 없이 getter만 존재하는 형태.
  • const는 상수처럼 취급.

으로 정리해본다.


오늘은 여기까지.






+ Recent posts