본문 바로가기

Flutter/Dart

Dart의 Functional Programming 활용

1️⃣ List의 asMap(), toSet() 

void main() {
  List<String> blackPink = ['로제', '지수', '리사', '제니', '제니'];
  
  print(blackPink);
  print(blackPink.asMap());
  print(blackPink.toSet());
  
  Map blackPinkMap = blackPink.asMap();
  
  print(blackPinkMap.keys);
  print(blackPinkMap.values);
}

📝 실행 결과

[로제, 지수, 리사, 제니, 제니]
{0: 로제, 1: 지수, 2: 리사, 3: 제니, 4: 제니}
{로제, 지수, 리사, 제니}
(0, 1, 2, 3, 4)
(로제, 지수, 리사, 제니, 제니)

 

📌 asMap()을 사용하면 인덱스를 키로, 리스트 요소를 값으로 가지는 Map으로 변환
📌 toSet()을 사용하면 중복된 요소를 제거한 Set으로 변환

 


 

2️⃣ map()을 활용한 데이터 변형

void main() {
  List<String> blackPink = ['로제', '지수', '리사', '제니'];
  
  final newBlackPink = blackPink.map((x) {
    return '블랙핑크 $x';
  });
  
  print(blackPink);
  print(newBlackPink.toList());
  
  final newBlackPink2 = blackPink.map((x) => '블랙핑크 $x');
  
  print(newBlackPink2.toList());
  
  String number = '13579';
  
  final parsed = number.split('').map((x) => '$x.jpg').toList();
  
  print(parsed);
}

📝 실행 결과

[로제, 지수, 리사, 제니]
[블랙핑크 로제, 블랙핑크 지수, 블랙핑크 리사, 블랙핑크 제니]
[블랙핑크 로제, 블랙핑크 지수, 블랙핑크 리사, 블랙핑크 제니]
[1.jpg, 3.jpg, 5.jpg, 7.jpg, 9.jpg]

 

📌 map()을 사용하면 각 요소를 변환하여 새로운 리스트를 생성할 수 있습니다.

 


 

3️⃣ where()을 활용한 필터링

void main() {
  List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
  
  final evenNumbers = numbers.where((x) => x % 2 == 0).toList();
  final oddNumbers = numbers.where((x) => x % 2 != 0).toList();
  
  print(evenNumbers);
  print(oddNumbers);
}

📝 실행 결과

[2, 4, 6, 8, 10]
[1, 3, 5, 7, 9]

 

📌 where()를 사용하면 특정 조건을 만족하는 요소들만 필터링

 


 

4️⃣ reduce()와 fold()를 활용한 값 누적

void main() {
  List<int> numbers = [1, 3, 4, 5, 7];
  
  final result = numbers.reduce((prev, next) => prev + next);
  
  print(result);
}

📝 실행 결과

20

 

📌 reduce()는 리스트의 모든 요소를 하나로 축소하는 역할을 합니다.

 

🔹 fold()를 활용한 개선

void main() {
  List<int> numbers = [1, 3, 4, 5, 7];
  
  final sum = numbers.fold<int>(0, (prev, next) => prev + next);
  
  print(sum);
}

📝 실행 결과

20

 

📌 fold()는 reduce()와 유사하지만, 초기값을 설정할 수 있어 더 유연

 


 

5️⃣ 리스트 결합 (캐스케이드 문법)

void main() {
  List<int> even = [2, 4, 6, 8];
  List<int> odd = [1, 3, 5, 7];
  
  print([...even, ...odd]);
  print(even == [...even]);
}

📝 실행 결과

[2, 4, 6, 8, 1, 3, 5, 7]
false

 

📌 ... (spread operator)를 사용하면 리스트를 합칠 수 있으며, 새로운 리스트가 생성

 


 

6️⃣ Map을 클래스로 변환하여 구조화하기

 

Map은 자유도가 높지만, 구조화되지 않아 오타나 잘못된 값이 들어갈 위험이 있기 때문에

 이러한 문제를 방지하기 위해 클래스를 활용하는 것이 좋습니다.

class Idol {
  String name;
  int age;
  
  Idol({required this.name, required this.age});
}

void main() {
  List<Idol> idols = [
    Idol(name: '지수', age: 28),
    Idol(name: '로제', age: 27),
  ];
  
  for (var idol in idols) {
    print('이름: ${idol.name}, 나이: ${idol.age}');
  }
}

📝 실행 결과

이름: 지수, 나이: 28
이름: 로제, 나이: 27

 

📌 클래스를 사용하면 데이터의 구조를 명확하게 정의할 수 있어 더 안전하고 신뢰할 수 있는 코드가 가능하다.

 

반응형