다음 예제는 다트의 가장 기본적인 내용을 포함하는코드이다. 대부분의 프로그래밍 언어에서 사용하는 방식과 유사한 점이 많다. 추후 좀 더 자세히 알아보고 지금은 간단하게 훑어본다.
main.dart
Line 1) import : 패키지 내의 라이브러리를 사용하고자 할 때 라이브러리를 가져오기 위해 사용한다. 해당 라인은 lib 내의 dartEx01.dart를 dartEx01라는 prefix로 가져온다는 의미이다. 파이썬 경험자라면 익숙할 것이다.
Line 3) 주석은 // 을 사용한다.
Line 4) 함수 선언 : 두 매개변수를 더하여 리턴하는 함수이다. 함수명 앞에 리턴 타입이 생략된 것을 눈여겨볼 만하다. int형을 리턴해주고 있기 때문에 당연히 생략된 리턴 타입은 int형이다. 리턴 값이 없는 경우에도 void 생략이 가능하다.
Line 9) main() 함수 : 앱 실행을 시작하는 최상위 함수이다. lib 내의 파일은 보통 공유 가능한 코드를 포함하고 해당 코드를 bin 등에 공유한다. bin은 (main()를 포함하는) 파일을 실행하기 위한 다트의 엔트리 포인트를 포함한다. 그래서 main.dart가 bin 내에 있는 것이다.
Line 10~11) 다트 변수 선언은 var이라는 키워드를 사용한다. var는 특정 타입을 지정하지 않은 형태로 해당 변수가 참조하는 타입에 따라 결정된다. 변수에 할당이 아닌 참조라고 하는 이유는 다트의 모든 변수는 객체(object)이기 때문이다. 여기서는 숫자를 참조하기 때문에 int형으로 추론 가능하다.
Line 12) add() 함수를 호출하고 리턴 값을 result 변수가 참조한다.
Line 13) dartEx01.dart 내의 printResult() 함수를 호출한다. import시 dartEx01를 prefix로 지정하였기 때문에 'dartEx01.함수명'으로 호출하는 것이다. dartEx01.dart 내용은 다음과 같이 printResult()을 통해서 출력하는 내용이 전부이다.
dartEx01.dart
Line 2) 여타 프로그래밍과 비슷하게 콘솔에 텍스트를 표시하려면 print() 함수를 사용한다. 문자열 리터럴을 출력할 때는 '내용'이나 "내용"처럼 작은따옴표나 큰 따옴표 모두 사용 가능하다. 변숫값을 출력하려면 '$변수'로 사용한다. 변숫값과 함께 출력하려면 '내용 $변수명'으로 사용하면 된다. 만약 표현식을 출력하고 싶다면 '내용 ${표현식}'을 사용하면 된다.
ex) print('The number is ${aNumber + 10}.');
중요 개념
새롭지 않은 내용이 많지만 다트에도 이런 개념들이 있구나 하고 이해하면 좋을 것 같다.
- 모든 변수는 객체(object)이다. 모든 객체는 클래스의 인스턴스이다. 숫자, 함수, null도 객체다. 모든 객체는 Object 클래스로부터 상속된다.
- 타입 어노테이션은 타입 추론이 가능할 경우 옵션이다. 예를 들어 int number = 10;으로 명시적으로 타입을 지정하지 않고 var number = 10;으로 사용 가능하다는 의미이다.
- 타입이 예상되지 않는다고 명시적으로 표현하고 싶을 때는 dynamic 키워드를 사용한다. 이것은 하나의 변수가 여러 타입으로 변경 가능하다는 의미이다. var 키워드와 비교해보면 좀 더 이해하기 쉽다. var는 다음과 같이 String 타입으로 지정된 후에는 int 타입을 참조할 수 없다.
ex)
var name = "Kim";
name = 100;
Error: A value of type 'int' can't be assigned to a variable of type 'String'.
이때 dynamic 키워드를 사용하면 문제가 해결된다.
ex)
dynamic name = "Kim";
name = 100;
- 제네릭 타입을 지원한다.
- main()과 같은 최상위 함수를 지원한다.
- public, protected, private 키워드가 없다. 해당 라이브러리 내에 private 하려면 식별자 앞에 밑줄(_)을 붙인다.
- debug mode와 release mode의 두 가지 런타임 모드가 있다. debug mode는 dartdevc 컴파일러를 통해 좀 더 쉬운 디버깅을 제공한다. release mode는 dart2js 컴파일러를 통해 앱 사이즈와 성능을 최적화한다.