Flutter/Dart 문법

[Dart] List<Map<>>을 Class로 전환하기(연습)

Chafle 2023. 3. 23. 19:53
반응형

서버에서 데이터를 가져올 때

보통 Json으로 가져오게 되는데

Map형태와 매우 유사하다

 

그래서 가져온 데이터를 우리는 Class로 변환할 줄 알아야한다!!!!!!

기본 중에 기본이라우

 

 

  List<Map<String, String>> idol = [
    {'name': '민지', 'group': '뉴진스'},
    {'name': '혜린', 'group': '뉴진스'},
    {'name': 'RM', 'group': 'BTS'},
    {'name': '뷔', 'group': 'BTS'},
    {'name': '하니', 'group': '뉴진스'},
  ];

 

위와 같은 데이터를 가져왔다고 치자..

이 Map데이터를 Class로 변환해보자

근데 왜 변환하는가?????????????????????????????????????

 

Map은 key value로 이루어진 각각의 item이 구조화가 돼있지 않기 때문에

 

자유도가 너무 높다, 신뢰도가 너무 낮다

 

그래서 신뢰도를 높이기 위해

Class안에 정의를 해야되고 Class로 정의내려졌을 때

기능을 할 수 있는 상태가 된다.

 

 

class Person {
  final String name;
  final String group;
  
  Person({
    required this.name,
    required this.group
  });
}

Person Class를 만들었다 이제 이 안에 정의를 하면 된다.

 

map을 통해 데이터를 가공하자

 

 

1. 넘어온 List,Map 데이터를 map을 통해 Person Class로 return 할 것이다.

 

 final parsedIdol = idol.map((x)=>Person())

 

 

2. Class의 파라미터에 받아온 Map의 Key값을 할당 (Map을 Class의 파라미터로 할당)

 

    final parsedIdol = idol.map((x)=>Person(
      name: x['name'],
      group: x['group']
    ));

 

 

3. Map의 값이 확실하게 있는 것을 알았으니 !를 통해 옵셔널을 풀어주자 (그 이후 List로 값을 일단 도출해보자)

 

    final parsedIdol = idol.map((x)=>Person(
      name: x['name']!,
      group: x['group']!
    )).toList();
      print(parsedIdol);

 

 

이렇게 나오는 이유는 Class의 기본값이 Instance of 'Classname' 이기 때문이다.

이것을 이제 풀어야되는데 푸는 방법은 @override 이다.

 

 

 

4. Class에는 toString이라는 기본 함수가 있는데 이것을 재정의 해줘야 한다.

변경 이후에 값을 출력해보면

class Person {
  final String name;
  final String group;

  Person({required this.name, required this.group});
  
  @override
  String toString(){
    return 'Person(name: $name, group: $group)';
  }
}

 

Map데이터가 Person Class로 알맞게 들어간 것을 볼 수 있다.

 

 


이제 Map데이터가 Class데이터로 신뢰할 수 있는 데이터가 됐으니 기능을 수행할 수 있게 됐다.

 

parsedIdol 객체를 사용하여 데이터를 가공하면 된다.

 

1. for in loop로 이름과 그룹을 한번 알아보자

  for(Person person in parsedIdol) {
    print(person.name);
    print(person.group);
  }

person에 .을 찍으면 Person에 들어가있는 파라미터를 그대로 사용할 수 있음을 알 수 있다.

 

코드가 아주 잘 출력 됐음을 알 수 있다.

 

2. where로 필터링을 해보자

 

  final bts = parsedIdol.where(
  (x) => x.group == '뉴진스');
  
  print(bts);

 

parsedIdol이 Person의 Class로 갖춰져있기 때문에 where에 붙어 loop를 탈 x도 Person Class의 파라미터를 사용할 수 있다.

위 코드를 실행해 보면

필터링이 잘 됐음을 알 수 있다.

 

 

3. 코드를 간략하게 하기 위해 Map -> Class로 mapping을 해줌과 동시에 필터링을 걸 수 있다.

 

  final result = idol.map(
  (x) => Person(
  name: x['name']!,
  group: x['group']!
  )).where((x) => x.group == 'BTS');
  
  print(result);

반응형