반응형
컬렉션 - List, Set, Map 완벽 가이드를 알아보자.
- 플러터를 시작하기 전 다트(Dart) 언어의 개념에 대해 정리를 해보고자 합니다.
- 다트(Dart) 언어 개념 정리 포스팅 후 플러터(Flutter) 개념 정리로 넘어갈 예정입니다.
- 플러터(Flutter) 개념 정리 후 실습이 시작 된다고 보시면 될 것 같습니다.
소개
- 다트(Dart) 프로그래밍 언어는 현대적이고 효율적인 애플리케이션 개발을 위한 다양한 기능을 제공합니다.
- 그 중에서도 컬렉션은 데이터를 구조화하고 관리하는 데 필수적인 요소입니다.
- 다트는 세 가지 주요 컬렉션 타입인 List, Set, Map을 제공하며, 각각 고유한 특성과 사용 사례를 가지고 있습니다.
- 이번 포스팅에서는 이러한 컬렉션들의 특징, 사용법, 그리고 실제 개발 시 활용 방법에 대해 자세히 알아보겠습니다.
List 컬렉션
List는 다트에서 가장 기본적이고 널리 사용되는 컬렉션 타입입니다. 순서가 있는 객체의 집합을 나타내며, 배열(Array)과 유사한 개념입니다.
List의 특징
- 순서가 있는 컬렉션
- 중복 요소 허용
- 인덱스를 통한 접근 가능
- 동적 크기 조정 가능
List 생성하기
// 빈 List 생성
List<int> numbers = [];
// 초기값을 가진 List 생성
List<String> fruits = ['apple', 'banana', 'orange'];
// 고정 길이 List 생성
List<int> fixedLengthList = List.filled(5, 0);
// 생성자를 사용한 List 생성
List<int> generateList = List.generate(5, (index) => index * 2);
List 조작하기
List<String> colors = ['red', 'green', 'blue'];
// 요소 추가
colors.add('yellow');
// 특정 위치에 요소 삽입
colors.insert(1, 'purple');
// 요소 제거
colors.remove('green');
// 인덱스로 요소 제거
colors.removeAt(0);
// List 순회
for (var color in colors) {
print(color);
}
// 람다 함수를 사용한 List 변환
List<String> upperColors = colors.map((color) => color.toUpperCase()).toList();
- List는 다양한 메서드와 속성을 제공하여 데이터를 효율적으로 관리할 수 있게 해줍니다. 예를 들어,
sort()
,reverse()
,where()
등의 메서드를 사용하여 List를 정렬하거나 필터링할 수 있습니다.
Set 컬렉션
Set은 중복되지 않는 고유한 항목들의 컬렉션입니다. 순서가 없으며, 각 요소는 Set 내에서 한 번만 나타날 수 있습니다.
Set의 특징
- 중복 요소 불허
- 순서 없음
- 빠른 검색 및 요소 존재 여부 확인
- 수학적 집합 연산 지원 (합집합, 교집합 등)
Set 생성하기
// 빈 Set 생성
Set<int> numberSet = {};
// 초기값을 가진 Set 생성
Set<String> fruitSet = {'apple', 'banana', 'orange'};
// List로부터 Set 생성
List<int> numberList = [1, 2, 2, 3, 3, 4];
Set<int> uniqueNumbers = Set.from(numberList);
Set 조작하기
Set<String> colors = {'red', 'green', 'blue'};
// 요소 추가
colors.add('yellow');
// 요소 제거
colors.remove('green');
// 요소 존재 여부 확인
bool hasRed = colors.contains('red');
// Set 순회
for (var color in colors) {
print(color);
}
// 집합 연산
Set<String> moreColors = {'blue', 'yellow', 'purple'};
Set<String> unionColors = colors.union(moreColors);
Set<String> intersectionColors = colors.intersection(moreColors);
- Set은 중복을 허용하지 않는 특성 때문에 고유한 값들의 컬렉션을 관리할 때 유용합니다. 특히 데이터의 유일성이 중요한 경우 (예: 사용자 ID, 이메일 주소 등)에 적합합니다.
Map 컬렉션
Map은 키-값 쌍의 컬렉션입니다. 각 키는 고유해야 하며, 각 키는 정확히 하나의 값과 연관됩니다.
Map의 특징
- 키-값 쌍으로 데이터 저장
- 키는 고유해야 함
- 값은 중복 가능
- 빠른 검색 및 업데이트
Map 생성하기
// 빈 Map 생성
Map<String, int> ages = {};
// 초기값을 가진 Map 생성
Map<String, String> capitals = {
'USA': 'Washington D.C.',
'UK': 'London',
'Japan': 'Tokyo'
};
// Map 생성자 사용
Map<int, String> numberWords = Map.fromEntries([
MapEntry(1, 'one'),
MapEntry(2, 'two'),
MapEntry(3, 'three')
]);
Map 조작하기
Map<String, int> scores = {'Alice': 95, 'Bob': 85, 'Charlie': 90};
// 요소 추가 또는 업데이트
scores['David'] = 88;
// 요소 제거
scores.remove('Bob');
// 키 존재 여부 확인
bool hasAlice = scores.containsKey('Alice');
// 값 가져오기
int? aliceScore = scores['Alice'];
// Map 순회
scores.forEach((key, value) {
print('$key: $value');
});
// 키 목록 가져오기
List<String> names = scores.keys.toList();
// 값 목록 가져오기
List<int> allScores = scores.values.toList();
- Map은 복잡한 데이터 구조를 표현하거나 키를 통해 빠르게 값을 검색해야 할 때 유용합니다. 예를 들어, 사용자 정보, 설정 값, 캐시 데이터 등을 저장하는 데 적합합니다.
컬렉션의 고급 기능
다트는 컬렉션을 더욱 효과적으로 다룰 수 있는 다양한 고급 기능을 제공합니다.
스프레드 연산자 (...)
스프레드 연산자를 사용하면 한 컬렉션의 모든 요소를 다른 컬렉션에 쉽게 추가할 수 있습니다.
List<int> list1 = [1, 2, 3];
List<int> list2 = [4, 5, ...list1]; // [4, 5, 1, 2, 3]
Set<int> set1 = {1, 2, 3};
Set<int> set2 = {4, 5, ...set1}; // {4, 5, 1, 2, 3}
Map<String, int> map1 = {'a': 1, 'b': 2};
Map<String, int> map2 = {'c': 3, ...map1}; // {'c': 3, 'a': 1, 'b': 2}
컬렉션 if와 for
컬렉션을 생성할 때 조건문과 반복문을 사용할 수 있습니다.
bool addOrange = true;
List<String> fruits = [
'apple',
'banana',
if (addOrange) 'orange',
];
List<int> squares = [
for (var i = 1; i <= 5; i++) i * i,
];
불변 컬렉션
const
키워드를 사용하여 불변(immutable) 컬렉션을 생성할 수 있습니다.
const List<int> unchangeableList = [1, 2, 3];
const Set<String> unchangeableSet = {'a', 'b', 'c'};
const Map<String, int> unchangeableMap = {'x': 1, 'y': 2};
- 불변 컬렉션은 한 번 생성되면 내용을 변경할 수 없으며, 이는 데이터의 무결성을 보장하는 데 도움이 됩니다.
컬렉션 사용 시 주의사항
- 타입 안정성 : 가능한 한 컬렉션의 타입을 명시적으로 지정하여 타입 안정성을 확보하세요.
- 널(Null) 안정성 : 널이 될 수 있는 값을 다룰 때는 주의가 필요합니다. 널 안정성 연산자 (
?.
,??
,!
)를 적절히 사용하세요. - 성능 고려 : 대규모 데이터를 다룰 때는 적절한 컬렉션 타입을 선택하고, 효율적인 알고리즘을 사용하세요.
- 동시성 처리 : 멀티스레드 환경에서 컬렉션을 사용할 때는 동시성 이슈에 주의하세요.
- 메모리 관리 : 큰 컬렉션을 다룰 때는 메모리 사용량에 주의를 기울이세요. 필요하지 않은 데이터는 적시에 제거하세요.
결론
- 다트의 List, Set, Map 컬렉션은 각각 고유한 특성과 용도를 가지고 있습니다. List는 순서가 있는 데이터를, Set은 고유한 요소들의 집합을, Map은 키-값 쌍의 데이터를 효과적으로 관리할 수 있게 해줍니다. 이러한 컬렉션들을 적절히 활용하면 다양한 데이터 구조를 효율적으로 구현하고 관리할 수 있습니다.
- 개발자는 각 컬렉션의 특성을 이해하고, 상황에 맞는 적절한 컬렉션을 선택하여 사용해야 합니다. 또한, 다트가 제공하는 고급 기능들을 활용하여 더욱 간결하고 효율적인 코드를 작성할 수 있습니다.
- 컬렉션은 거의 모든 프로그래밍 작업의 기초가 되므로, 이들을 능숙하게 다루는 것은 다트 개발자에게 필수적인 기술입니다. 지속적인 학습과 실습을 통해 다트의 컬렉션을 마스터하면, 더 효율적이고 견고한 애플리케이션을 개발할 수 있을 것입니다.
- 마지막으로, 컬렉션을 사용할 때는 항상 성능, 메모리 사용량, 그리고 코드의 가독성을 고려해야 합니다. 적절한 컬렉션의 선택과 효율적인 사용은 애플리케이션의 전반적인 품질을 크게 향상시킬 수 있을거라 생각합니다.
맺음말
- 이번 포스팅에서는 다트의 컬렉션 List, Set, Map에 대해 알아보았습니다.
- 다음 포스팅에서는 다트의 제네릭에 대해 알아보고자 합니다.
반응형
'다트(Dart) 언어 강좌' 카테고리의 다른 글
비동기 프로그래밍을 알아보자 (0) | 2024.07.28 |
---|---|
제네릭을 알아보자 (0) | 2024.07.27 |
예외 처리를 알아보자 (0) | 2024.07.26 |
Getter와 Setter 를 알아보자 (0) | 2024.07.26 |
추상 클래스와 인터페이스를 알아보자 (0) | 2024.07.25 |