셋은 객체 컬렉션으로, 각 객체는 한 번만 포함될 수 있습니다. 즉, 각 요소 유형의 객체는 집합에 포함되어 있거나 포함되지 않은 것으로 간주됩니다. Set 구현체는 일부 요소들을 구분할 수 없다고 간주할 수 있습니다. 이러한 요소들은 집합에서의 모든 작업에서 동일한 것으로 취급됩니다.기본 Set 구현체인 LinkedHashSet은 `Object.==` 및 `Object.hashCode`에 따라 객체가 동일하다고 간주합니다. 집합의 요소를 반복(iterate)하는 순서는 무작위이거나 특정 방식으로 정렬될 수 있습니다. 예시:- HashSet은 무작위로 정렬되며, 반복 순서가 지정되지 않습니다.- LinkedHashSet은 요소의 삽입 순서대로 반복합니다.- SplayTreeSet과 같은 정렬된 집합은 요..
길이를 가진 객체들의 인덱스 가능 컬렉션입니다.이 클래스의 서브클래스들은 다양한 종류의 리스트를 구현합니다. 가장 흔한 리스트 종류는 다음과 같습니다:고정 길이 리스트 (Fixed-length list)리스트의 길이를 변경할 수 있는 작업을 시도하면 오류가 발생합니다.가변 길이 리스트 (Growable list)이 클래스에서 정의된 API를 완전하게 구현합니다.기본 가변 길이 리스트(대괄호 []로 생성)는 내부 버퍼를 유지하며, 필요할 때 그 버퍼를 확장합니다. 이는 일련의 add 작업이 각각 상수 시간에 실행되도록 보장합니다. 길이를 직접 설정하는 것은 새로운 길이에 비례하는 시간이 걸릴 수 있으며, 내부 용량을 변경하여 다음 add 작업에서 버퍼 용량을 즉시 증가시켜야 할 수도 있습니다. 다른 리스트..
컬렉션이란?컬렉션은 객체 그룹을 나타내는 객체이며, 객체 그룹의 각각의 객체를 요소라고 부른다. 컬렉션은 비어 있을 수도 있고, 여러 요소를 포함할 수도 있다. 가장 일반적인 컬렉션 타입은 다음과 같다.- 리스트 : 인덱스를 통해 요소를 읽는 데 사용- 셋 : 중복 없이 요소를 포함하는 데 사용- 맵 : 키를 사용하여 요소를 읽는 데 사용 Iterable이란?Iterable은 순차적으로 접근할 수 있는 요소의 컬렉션이다. 다트에서 Iterable은 추상 클래스이므로 직접 인스턴스화할 수 없다. 하지만 리스트와 셋을 생성하여 새로운 Iterable을 만들 수 있다. 리스트와 셋은 모두 Iterable이므로, Iterable 클래스와 동일한 메서드와 속성을 가진다. 맵은 해시 테이블을 사용하여 키를 ..
널 안전성은 다트 2.0에서 도입된 가장 큰 변화이다. 다트가 처음 출시되었을 때는 널 안전성은 긴 소개를 필요로 하는 희귀한 기능이었다. 하지만 오늘날 Kotlin, Swift, Rust 등 다양한 언어들이 이 문제에 대해 각자의 해답을 제시하고 있다. 다음은 널 안전성을 사용하는 않는 경우의 코드이다.// 널 안전성을 사용하지 않은 경우:bool isEmpty(String string) => string.length == 0;void main() { isEmpty(null);} 이 다트 프로그램을 널 안전성을 사용하지 않고 실행하면 .length 호출 시 NoSuchMethodError 에러가 발생한다. 널 값은 Null 클래스의 인스턴스이며, Null에는 length라는 게터가 없다. 개발자달은 ..
다트는 엄격한 널 안전성(sound null safety)을 강제한다. 널 안전성은 널(null)로 설정된 변수를 의도치 않게 접근하는 것에 비롯되는 오류를 방지한다. 예를 들어, 메서드가 정수를 기대하지만 널을 받는 경우, 앱이 런타임 오류를 일으킬 수 있다. 이러한 타입의 오류는 널 역참조 오류(null dereference error)라고 하며, 디버깅하기 어렵다. 엄격한 널 안전성에서는 모든 변수에 값이 필요하다. 이는 다트가 모든 변수를 널이 될 수 없다고 간주한다는 의미이다. 선언된 타입의 값만 할당할 수 있다. 기본 타입 변수에는 절대 널 값을 할당할 수 없다. 변수 타입이 널 값을 가질 수 있음을 명시하려면 타임 주석 뒤에 ?를 추가하자. (예: int? i) 이러한 널-가능 타입은 널 또..
다트 라이브러리는 Future 또는 Stream 객체를 반환하는 함수들이 많이 있다. 이러한 함수들은 비동기적이다. 즉, 입출력과 같이 시간이 오래 걸릴 수 있는 작업을 요청한 후에도 작업이 완료될 때까지 기다리지 않고 반환되어, 다른 작업을 할 수 있게 된다. async와 await 키워드는 동기 코드를 비동기 코드와 유사하게 작성할 수 있도록 도와준다. Future 다루기완료된 Futurue의 결과가 필요할 때는 두 가지 방법이 있다.async와 await를 사용하기then()으로 처리하기async와 await 를 사용하는 코드는 비동기적이지만, 동기 코드와 매우 유사하게 보인다. 예를 들어, 비동기 함수의 결과를 기다리기 위해 await를 사용하는 코드는 다음과 같다.await lookUpVer..
다트에서 동시 프로그래밍이 어떻게 작동하는지에 대한 개념적 개요를 알아보자. 이 페이지에서는 이벤트 루프, 비동기 언어 기능 및 고수준의 아이솔레이트에 대해 설명한다. 다트에서의 동시 프로그래밍은 Future 및 Stream과 같은 비동기 API와 아이솔레이트를 모두 의미한다. 이를 통해 프로세서를 별도의 코어로 이동할 수 있다. 모든 다트 코드는 아이솔레이트에서 실행되며, 기본적으로 기본 메인 아이솔레이트에서 시작하여 명시적으로 생성한 후속 아이솔레이트로 확장될 수 있다. 새로운 아이솔레이트를 생성하면 해당 아이솔레이트는 고립된 메모리와 고유한 이벤트 루프가 있다. 이벤트 루프는 다트에서 비동기 및 동시 프로그래밍을 가능하게 한다. 이벤트 루프다트의 런타임 모델은 이벤트 루프를 기반으로 한다. 이..
유효한 조합클래스 수정자의 유효한 조합과 그에 따른 기능은 다음과 같다.Construct ? 인스턴스 생성 가능Extend ? 다른 클래스에 확장(상속) 가능Implement ? 다른 클래스에 구현(인터페이스) 사용 가능Min in ? 다른 클래스에 믹스인 사용 가능Exhaustive ? 포괄성 기능 지원 부적절한 조합다음은 같이 사용할 수 없는 수정자 조합들이다.base, interface, final - 이 수정자들은 확장과 구현을 제어하기 때문에 상호 배타적이다.sealed, abstract - 둘 다 인스턴스화를 할 수 없으므로 함께 사용하는 것은 중복이다.sealed와 base, interface, final - sealed 타입은 이미 다른 라이브러리에서 믹스인, 확장 또는 구현될 수 없으..