이번 스터디에서는 List심화단계를 다뤄보려 한다.
바로 소스로 확인해 보자.
1. Looping 활용
List<String> world = [
'한국',
'중국',
'일본',
'러시아',
'미국'
];
world.forEach((value){
print(value);
});
한국
중국
일본
러시아
미국
위 소스는 List의 forEach용법이다.
파라미터 자리인 value에 world의 값을 넣어주고, 이 value자리의 파라미터 값을 기능수행 영역에서 사용할 수 있다.
이번에는 forEach와 같은 기능을 수행하는 다른방법을 알아보자.
List<String> world = [
'한국',
'중국',
'일본',
'러시아',
'미국'
];
for(String value in world){
print(value);
}
한국
중국
일본
러시아
미국
해당 방식 또한 forEach와 같은 결과를 추출한다.
world의 value값을 String 변수에 넣어, 기능수행 영역에서 사용할 수 있다.
※여기서 말하는 기능수행 영역은 중괄호 안쪽 영역.
2. Mapping - map활용
List<String> world = [
'한국',
'중국',
'일본',
'러시아',
'미국'
];
final newList = world.map((value){
return '이 국가명은 ${value}입니다';
});
(이 국가명은 한국입니다, 이 국가명은 중국입니다, 이 국가명은 일본입니다, 이 국가명은 러시아입니다, 이 국가명은 미국입니다)
map의 경우, 기능수행영역 안의 리턴값을 받을 수 있다.
기능수행영역 안에서 출력(return)할때마다 계속해서 누적 후, newList변수에 신규 할당하기 때문에,
변경된것 처럼 보인다. 하지만, 클래스world의 원값은 변함이 없다.
※ 추가로, 만약 List형태로 바꾸고 싶다면 newList.toList();로 처리할 수 있다.
print(world);
[한국, 중국, 일본, 러시아, 미국]
3. Reduce/Fold - reduce, "fold"
List<int> numbers = [
0,
1,
2,
3,
4,
5,
];
위 numbers의 값들을 합산해보자.
int total = numbers.fold(0,(vTotal,element){
return vTotal+element;
});
print(total);
첫번째 시작할 값, vTotal은 이전에 리턴해 준 값이다. -> (중괄호(기능수행영역)안에서 반복하면서)
결과값은 15가 추출된다.
15
헷갈릴수 있으니, 중괄호 안에서 수행될때의 값을 보자면 아래와 같이 진행된다고 보면 된다.
// index = 0
// element = 0
// vTotal = 0
// return = 0 + 0 = 0
// index = 1
// element = 1
// vTotal = 0
// return = 0 + 1 = 1
// index = 2
// element = 2
// vTotal = 1
// return = 1 + 2 = 3
// index = 3
// element = 3
// vTotal = 3
// return 3 + 3 = 6
index는 List값의 자리번호이며, 첫번째 파라미터 0번부터 element자리에 List값을 할당하며 반복된다.
그리고 vTotal 파라미터 자리엔 이전에 리턴받은 결과값이 누적되는 방식이다.
3. Reduce/Fold - "reduce", fold
사용방식은 fold와 큰 차이를 보이지 않는다.
fold에서는 시작값인 0을 지정하는데, reduce에서는 생략된다.
int total2 = numbers.reduce((vTotal, element){
//print(vTotal + element);
return vTotal + element;
});
print(total3);
15
※여기서 팁
위에 소스를 dart에서는 아래와 같이 간소화가 가능하다.
int total3 = numbers.reduce((total, element) => total + element);
print(total3);
15
위 소스에서 보이는 "=>" 이것은 arrow함수라고 한다.
중괄호안에 다양한 기능(계산 등)을 구현하는 것이 아닌, 한줄로 처리하는 간단한 기능이라면
위와 같이 하는 방법도 있다.
맨 위에서 다뤘던, world클래스 가지고도 해본다면 아래와 같이 구현할 수 있다.
final newList2 = world.map((value)=> '이 국가명은 $value입니다.');
print(newList2);
(이 국가명은 한국입니다., 이 국가명은 중국입니다., 이 국가명은 일본입니다., 이 국가명은 러시아입니다., 이 국가명은 미국입니다.)
어떤 방식이든 코딩하는데 정답은 없다.
상황에 따라서 유연하게 대응하며 만들어 나가면 되는것이다.
스터디 끝.