void main(){
List<Map<String, String>> people = [
{
"name" : "로제",
"group" : "블랙핑크",
},
{
"name" : "지수",
"group" : "블랙핑크",
},
{
"name" : "RM",
"group" : "BTS",
},
{
"name" : "뷔",
"group" : "BTS",
}
];
print(people);
}
class Person{
final String name;
final String group;
Person({
required this.name,
required this.group,
});
}
위에 List 안 Map 원소들을 Person클레스에 인스턴스로 바꿔줄거임
이런걸 왜하냐 Map 자료형은 자유도가 너무 높음 이 Map 안에 name이 들어있는지 group 이 들어있는지 알길이 없음
즉 위와 같은 상황에서 다른 원소들에게 test라는 값을 넣어야 한다는 것을 뭐 어떻게 지정할 방법이 없음
구조화가 되어있지 않아서
이렇게 스펠링을 하나 틀려도 프로그래밍 적으로 알수 있는 방법이 없음
실제로 서버에서 데이터를 가져오면 위와 같은 형태로 들어옴 json형태
이걸 클레스 형태로 변경을 해두면 이 클레스 안에서 어떤 기능들을 할수있고 어떤값들이 있을수 없는지 있는지
널값이 있을수 없을 수 있는지 정의 할수 있기 때문에 이 데이터를 믿을수 있는 신뢰할수 있게 되는것임
그래서 실제로 서버에서 이렇게 데이터를 가져와서 클레스로 바꿔 사용하는경우가 99%임
어떤 데이터든 프론트 엔드에서 (플러터 뿐만아니라) 꼭이렇게 구조화를 해서 클레스 형태로 다루게 됨
클레스로 바꾸는 방법
void main(){
List<Map<String, String>> people = [
{
"name" : "로제",
"group" : "블랙핑크",
},
{
"name" : "지수",
"group" : "블랙핑크",
},
{
"name" : "RM",
"group" : "BTS",
},
{
"name" : "뷔",
"group" : "BTS",
}
];
print(people);
// 클레스로 바꿔주는 방법
final parsedPeople = people.map(
(x) => Person(
name: x['name']!,// ! 없으면 오류가 남 Map 이기 때문에
group: x['group']!,
),
).toList();
print(parsedPeople);
}
class Person{
final String name;
final String group;
Person({
required this.name,
required this.group,
});
}
// 클레스로 바꿔주는 방법
final parsedPeople = people.map(
(x) => Person(
name: x['name']!,// ! 없으면 오류가 남 Map 이기 때문에
// name , group값이 이 안에 존재하는지 확실하게 알수 없기 때문에 오류가남
// 하지만 우리가 눈으로 봤을때 이 값이 확실하게 있다고 ! 로 알려주는 것임
group: x['group']!, // 우리가 이 클레스로 바꿔주지 않으면 매번 쓸때마다 ! 해줘야하는데
// 그러면 에러가 여기저기서 날수도 있음
),
).toList();
결과
클레스를 출력하면 이렇게 나오는게 원래 클레스의 기본값이 인스턴스 오브 이렇게 나옴
이걸 변경 하는 방법 toSting() 함수를 이용하면됨(override 사용해서) 기본으로 오브젝트 클레스에 제공되는 함수임
이 함수를 변경하게 되면 이 인스턴스 값들이 출력될때 어떤형태로 나올지 수정이 가능함
void main(){
List<Map<String, String>> people = [
{
"name" : "로제",
"group" : "블랙핑크",
},
{
"name" : "지수",
"group" : "블랙핑크",
},
{
"name" : "RM",
"group" : "BTS",
},
{
"name" : "뷔",
"group" : "BTS",
}
];
print(people);
// 클레스로 바꿔주는 방법
final parsedPeople = people.map(
(x) => Person(
name: x['name']!,// ! 없으면 오류가 남 Map 이기 때문에
// name , group값이 이 안에 존재하는지 확실하게 알수 없기 때문에 오류가남
// 하지만 우리가 눈으로 봤을때 이 값이 확실하게 있다고 ! 로 알려주는 것임
group: x['group']!, // 우리가 이 클레스로 바꿔주지 않으면 매번 쓸때마다 ! 해줘야하는데
// 그러면 에러가 여기저기서 날수도 있음
),
).toList();
print(parsedPeople);
}
class Person{
final String name;
final String group;
Person({
required this.name,
required this.group,
});
@override
String toString(){
return "Person(name:$name, group:$group)";
}
}
추가적 이점
// 클레스로 변경했을때 아래와 같이 어떤게 가능한지 한눈에 볼수 있게됨
// 데이터 선에서 에러가 나는걸 줄여줄수 있음
for(Person person in parsedPeople){
print(person.name);
print(person.group);
}
전체코드
void main(){
List<Map<String, String>> people = [
{
"name" : "로제",
"group" : "블랙핑크",
},
{
"name" : "지수",
"group" : "블랙핑크",
},
{
"name" : "RM",
"group" : "BTS",
},
{
"name" : "뷔",
"group" : "BTS",
}
];
print(people);
// 클레스로 바꿔주는 방법
final parsedPeople = people.map(
(x) => Person(
name: x['name']!,// ! 없으면 오류가 남 Map 이기 때문에
// name , group값이 이 안에 존재하는지 확실하게 알수 없기 때문에 오류가남
// 하지만 우리가 눈으로 봤을때 이 값이 확실하게 있다고 ! 로 알려주는 것임
group: x['group']!, // 우리가 이 클레스로 바꿔주지 않으면 매번 쓸때마다 ! 해줘야하는데
// 그러면 에러가 여기저기서 날수도 있음
),
).toList();
print(parsedPeople);
// 클레스로 변경했을때 아래와 같이 어떤게 가능한지 한눈에 볼수 있게됨
// 데이터 선에서 에러가 나는걸 줄여줄수 있음
for(Person person in parsedPeople){
print(person.name);
print(person.group);
}
}
class Person{
final String name;
final String group;
Person({
required this.name,
required this.group,
});
@override
String toString(){
return "Person(name:$name, group:$group)";
}
}
결과
추가적 이점2
// 파싱된 자료에서 BTS만 뽑기 where이용
final bts = parsedPeople.where(
(x) => x.group == "BTS",
);
print(bts);
}
기존에 있는지 없는지 ! 이렇게 오류를 걱정해야하는 상황과 상반되게 확신을 가지고 코드를 작성할수 있음
그리고 함수형 프로그래밍은 여러개의 이 함수들을 연결해서 실행해도 됨 어짜피 새로운 값들을 계속 리턴해주는거라
이 리턴 값들로 계속 새로운 값들을 만들어 낼수 있음
이게 무슨말이냐면
// 클레스로 바꿔주는 방법
final parsedPeople = people.map(
(x) => Person(
name: x['name']!,
group: x['group']!,
),
).toList();
print(parsedPeople);
// 파싱된 자료에서 BTS만 뽑기 where이용
final bts = parsedPeople.where(
(x) => x.group == "BTS",
);
print(bts);
// 이렇게 한번에 끝낼수 있음 위처럼 2단계로 안하고
final result = people.map(
(x) => Person(
name: x['name']!,
group: x['group']!,
),
).where((x) => x.group == "BTS");
print(result);
final result = people.map(
(x) => Person(
name: x['name']!,
group: x['group']!,
),
).where((x) => x.group == "BTS");
print(result);
// .where((x) => x.group == "BTS"); 바로 where을 달아버림
// 어짜피 Person으로 파싱이 다 되어 있는 상태라
// 결론적으로 이렇게 한번에 할수 있는 것임
여기서 또다른 함수를 연동시킬수 있음
final result = people.map(
(x) => Person(
name: x['name']!,
group: x['group']!,
),
).where((x) => x.group == "BTS")
.fold<int>(
0,
(prev, next) => prev + next.name.length,
);
print(result);
이렇게 .fold 함수를 한번더 연결해서 그룹이 BTS인 인스턴스들을 따로 또 빼서
그중 이름에 길이를 다 더해 출력 함
원한다면 계속 갈수 있는것임 리턴값에 변환을 주면서
그래서 결론적으로 이 함수형 프로그래밍에 기본은
1. 실행하는 대상 List, Set, Map 과 완전히 다른 새로운 걸 생성해준다
2. 여러개의 함수들을 연결해나가며 새로운 값을 만들수 있다 (각 함수들을 지나갈때마다 매번 새로운 (형태의)값들이 생겨나는것임)
함수형 프로그래밍을 할때 주의 해야하는 것은?
코드가 간결해지긴 하지만 너무 많은 함수들을 연결연결 해버리면 다른 사람과 협업시 힘들수 있음
+ 내가 내코드를 봐도 못알아 볼수도 있기에
진짜 필요한 기능들만 연동하고 코멘트를 작성 해주자
전체 코드
void main(){
List<Map<String, String>> people = [
{
"name" : "로제",
"group" : "블랙핑크",
},
{
"name" : "지수",
"group" : "블랙핑크",
},
{
"name" : "RM",
"group" : "BTS",
},
{
"name" : "뷔",
"group" : "BTS",
}
];
// 클레스로 바꿔주는 방법
final parsedPeople = people.map(
(x) => Person(
name: x['name']!,
group: x['group']!,
),
).toList();
print(parsedPeople);
// 파싱된 자료에서 BTS만 뽑기 where이용
final bts = parsedPeople.where(
(x) => x.group == "BTS",
);
print(bts);
final result = people.map(
(x) => Person(
name: x['name']!,
group: x['group']!,
),
).where((x) => x.group == "BTS")
.fold<int>(
0,
(prev, next) => prev + next.name.length,
);
print(result);
// .where((x) => x.group == "BTS"); 바로 where을 달아버림
// 어짜피 Person으로 파싱이 다 되어 있는 상태라
// 결론적으로 이렇게 한번에 할수 있는 것임
// + 거기에 또 fold 함수 연동
}
class Person{
final String name;
final String group;
Person({
required this.name,
required this.group,
});
@override
String toString(){
return "Person(name:$name, group:$group)";
}
}
'APP > Dart' 카테고리의 다른 글
dart로 배우는 함수형 프로그래밍 : cascading operator (리스트의 값들을 새로운 리스트에 풀어 넣는 함수) (0) | 2022.08.19 |
---|---|
dart로 배우는 함수형 프로그래밍 : fold 함수 (0) | 2022.08.19 |
dart로 배우는 함수형 프로그래밍 : reduce 함수 (0) | 2022.08.19 |
dart로 배우는 함수형 프로그래밍 : Map자료형을 Mapping 하는 방법 (0) | 2022.08.18 |
dart로 배우는 함수형 프로그래밍 : 리스트에 map 함수, arrow 함수 이용해서 maping 하는 방법 (0) | 2022.08.18 |