다트 언어는 타입 안전성을 갖추고 있다. 정적 타입 검사와 런타임 검사의 조합을 사용하여 변수의 값이 항상 변수의 타입과 일치하는 것을 보장한다. 이러한 특성 때문에 'sound typing'이라고도 불린다. 타입 주석은 필수적이지만, 다트는 타입 추론이 가능하므로 선택적으로 생략할 수도 있다. 정적 타입 검사의 이점은 컴파일 시간에 버그를 찾을 수 있다는 점이다. 예를 들어 다음 코드에서 printInts() 함수는 List를 출력하고, main() 함수는 리스트를 생성해서 printInts()에 전달하는 예제이다.void printInts(List a) => print(a);void main() { final list = []; list.add(1); list.add('2'); printIn..
타입 별칭타입 별칭은 typedef를 사용하여 타입을 쉽게 참조할 수 있게 해 준다.다음은 IntList라는 타입 별칭을 선언하고 사용하는 예제이다.typedef IntList = List;IntList il = [1, 2, 3]; 타입 별칭은 타입 매개변수를 가질 수 있다.typedef ListMapper = Map>;ListMapper m2 = {};Map> = m1 = {}; // 타입 별칭을 사용하지 않는 경우 함수 타입 별칭으로도 사용할 수 있다. 하지만 인라인 함수 타입을 사용하기를 추천한다.typedef Compare = int Function(T a, T b);int sort(int a, int b) => a - b;void maikn() { assert(sort is Compare); ..
제네릭리스트(List)에 대한 API 문서를 보면 실제로는 타입이 List으로 되어 있다. 표기법은 List가 제네릭 타입임을 나타낸다. 관례상 대부분의 타입 변수는 E, T, S, K, V와 같은 단일 문자를 사용한다. 왜 제네릭을 사용할까?다트는 타입 안전성 언어이므로 타입을 지정해야 한다. 제니릭은 타입을 코드 작성 시 결정할 수 있으므로 반복 코드를 줄일 수 있고, 타입을 지정해서 다른 타입을 할당하는 실수를 막을 수 있다. List에 문자열만 포함하려면 List으로 선언할 수 있다. 이렇게 하면 List에 문자열이 아닌 타입을 할당하는 실수를 감지할 수 있다.var names = [];names.addAll(['Seth', 'Kathy', 'Lars']);names.add(42); // E..
컬렉션다트는 리스트(List), 셋(Set), 맵(Map) 컬렉션을 기본으로 지원한다. 리스트(List)다트에서 여러 개의 값을 가지는 배열인 리스트(list)를 제공한다. 리스트 리터널은 대괄호([ ])로 둘러싸인 쉼표로 구분된 식 또는 값 목록으로 표시된다. var list = [1, 2, 3]; 위의 코드에서 list 변수는 List 타입으로 추론된다. 만일 선언 이후 list에 int가 아닌 값을 추가하면 에러가 발생한다. 리스트의 마지막 아이템에 콤마를 추가할 수 있다. 마지막 콤마는 아무런 의미가 없다. 이 콤마는 다음 아이템을 추가할 때 콤마를 빼먹지 않을 수 있기 때문에 에러를 방지한다.var list2 = [ 'Car', 'Boat', 'Plane',]; 리스트의 인덱..
레코드레코드는 여러 객체를 묶어서 단일 객체로 만들어 준다. 레코드는 크기가 고정되고, 서로 다른 타입을 가질 수 있고, 타입이 된다. 따라서 레코드는 익명, 불변, 집합 타입이라는 특성을 가지게 된다. 레코드는 값이 된다. 레코드를 변수에 저장할 수 있고, 중첩할 수 있다. 그리고 매개변수 타입과 리턴 타입이 될 수 있다. 또한 리스트, 맵, 집하보가 같은 데이터 구조에 저장할 수도 있다. 레코드 구문레코드 구문은 괄호 안에 쉼표로 구분된 이름 필드 또는 위치 필드로 이루어진다. 이름 필드는 이름과 값으로 이루어지고 위치 필드는 값으로만 이루어진다.var record = ('first', a: 2, b:true, 'last'); 레코드 타입 주석레코드 타입 주석은 괄호 안에 쉼표로 구분된 타입으로..
함수다트는 진정한 객체지향 언어이기 때문에 함수도 객체이고, 함수는 Function이라는 타입을 갖는다. 함수는 객체이므로 변수에 할당하거나 다른 함수에 인수로 전달할 수도 있다.bool isNoble(int atomicNumber) { return _nobleGases[atomicNumber] != null;} 타입을 생략해도 타입 추론으로 함수는 여전히 작동하지만 추천하지 않는다.isNoble(atomicNumber) { return _nobleGases[atomicNumber] != null;} 화살표 구문함수 본문에 표현식이 하나라면 화살표 구문(arrow syntax)를 사용할 수 있다.bool isNoble(int atomicNumber) => _nobleGases[atomicNumbe..
내장 타입다트 언어는 다음과 같은 내장 타입을 지원한다.숫자 - int, double문자열 - String불리언 - bool레코드 - ()리스트 - List집합 - Set맵 - Map룬 - Runes심볼 - Symbol널 - null 내장 타입은 리터럴을 사용하여 객체를 생성하는 기능이 포함된다. 예를 들어, 'name'은 문자열 리터럴이고, true는 불리언 리터럴이다. 다트는 모든 값은 객체(클래스의 인스턴스)가 된다. 따라서 생성자를 사용하여 값을 만들 수 있다. 예를 들어, Map() 생성자를 사용하여 맵을 만들 수 있다. 다른 일부 타입도 다트 언어에서 특별한 역할을 한다.Object: null을 제외한 모든 다트 클래스의 슈퍼클래스Enum : 모든 열거형의 슈퍼클래스Future와 Stream ..
다음 표는 다트 언어가 자체적으로 사용하는 키워드를 나열한 것이다. 이 키워드는 식별자로 사용될 수도 있지만, 다른 개발자에게 혼란을 줄 수 있으므로 피하는 것이 좋다. 이 키워드는 문맥에 따라 식별자로 사용될 수 있다.이 키워드는 타입의 이름(class, mixin, enum, extension type, 또는 type alias의 이름) 또는 확장(extension)의 이름 또는 import 접두사로 사용할 수 없다. 그 외의 모든 상황에서 식별자로 사용할 수 있다.이 키워드는 제한 없이 식별자로 사용할 수 있다.