본문 바로가기
Flutter/Dart 입문

[Dart] 7. 반복문 : while, for, forEach, for (... in...)

by Couldi 2021. 10. 14.
반응형

21. 10.14.

- Could -

 

이 글은 프로그래밍 입문을 Flutter 때문에 Dart로 시작하는 사람들을 위한 글입니다.
프로그래밍 언어가 가지고 있는 기본 컨셉 자체를 Dart라는 언어를 통해 설명하고,
많은 분들이 Flutter를 위해 학습한다고 생각해, 추후 Flutter 학습에 도움이 되는 방향으로 작성되었습니다.
1. 반복문
    - while
    - for
2. 반복문 실전 사용 : forEach, for (... in...)

https://dart.dev/guides/language/language-tour#control-flow-statements

 

A tour of the Dart language

A tour of all the major Dart language features.

dart.dev

컴퓨터에서 코드의 흐름을 바꾸는 방법은 크게 두가지다. 조건을 줘서 실행을 되거나 안되게 만드는 방법과 조건을 줘서 코드를 반복실행하는 방법이 있다. 실질적으로 둘다 조건을 주는 방식이기 때문에 구분을 위해서 조건문은 분기문이라고도 부르기도 한다. 

앞서 control flow statements 중 조건문의 종류의 if, else, swich에 대해서 다뤘으므로, 이번에는 반복문의 종류인 while과 for에 대해서 알아보자.

1. 반복문(loops)

반복문은 말그대로 코드를 반복실행시키는 문장이다. 코드를 잘못짜면 코드가 무한히 실행되므로, 조건문보다 좀 더 섬세하게 다룰 필요가 있다.  반복문에는 크게 while문과 for문이 있다. 기능적으로 두가지의 차이는 없고, 문장을 적는 방식에 조금 차이가 있다. 어떤게 더 좋냐 물어본다면 취향차이라고 답하겠다.

 

while 

while (true) {
    print('안녕!');
}

모양은 if문과 거진 동일 하다. while을 적고 그 뒤에 () 안에 bool타입의 결과가 나오는 계산식이나 변수를 넣는다. 그리고 그 결과가 true라면 {} 안의 내용을 반복실행한다. 그래서 위의 예제를 DartPad에 넣고 실행한다면 () 안에 true가 들어있기 때문에 무한히 코드가 실행되게 된다. (해보니까 DartPad가 멈춰버렸다. 미안..) 

 

일반적으로는 외부에 별도의 변수를 만들고, ()안에 해당 변수가 포함된 조건식을 넣어 문장을 제어하는 방식을 사용한다.

아래 코드 처럼 사용한다.

 

int i = 0;

while (i < 10) {
    print(i);
    i++;
}

   

이건 DartPad에 실행해봐도 괜찮다. 그러면 0부터 차례차례 9까지 숫자가 출력된다. i 라는 변수에 0 을 넣었고 while 문안에 코드가 한번 실행될때마다 i++; 가 실행되면서 1씩 값이 증가한다. {} 안의 코드가 한번 실행될때 마다 i는 계속 커지게 되고, i가 10 이 되는 순간  i<10  이라는 조건이 false가 되면서 while문은 종료된다.

++가 뭐에요?
이건 증감연산자의 일종이다. 값을 1 증가 시킬때 사용한다. 아래 나오는 표현 모두 변수안에 값을 1 증가시키는 표현들이다.
i = i + 1;
i += 1;
i++;
1씩 숫자를 줄이기를 원한다면 + 부분을 -로 고치면 된다.
전위연산자, 후위연산자 같은 디테일한 개념도 있지만, 당분간은 이런 얘기를 들었다면 못들은척 하고 넘어가자. 시간이 지나서도 궁금하거든 구글링을 통해 알아봐도 된다.

 

while문으로 list 다루기

반복문은 list나 map을 다룰때 많이 사용된다. while문을 통해 list를 다뤄보자.

 

List<String> fruits = ['사과', '배', '포도', '귤', '딸기'];

int i = 0;

while(i<fruits.length) {
    print('나는 ${fruits[i]}를 좋아해');
    i++;
}

list를 while에서 다루는 코드다. 읽으면서 이해가 안되는 부분이 없는지 체크해보자. 앞서 다뤘던 개념들의 복습이며, 큰 무리 없이 읽혀야 정상이다. 유일하게 낯설게 느껴질 코드는 print문 안에 들어있는 ${} 일텐데, 이녀석은 해당 변수 안에 담긴 데이터를 문자열로 바꿔 보여주는 기능을 한다.

while문이 맨처음 실행되면 i=0 일것이고, while문 안에 i 의 자리에는 전부 0이 들어간다. 그러면 fruits[0]을 불러오게 되고 '사과' 라는 데이터가 문자열에 들어가 '나는 사과를 좋아해' 라는 문장이 출력된다. 이후 i++ 코드가 실행되며 i의 값은 1로 변하고 while문이 반복실행된다.

 

for

while문을 이해했다면 for문은 쉽다. while를 다루기 위해 변수를 만들고 증감연산자를 포함시키는 과정을 한큐에 이루어진다.

 

for (int i = 0; i < 10; i++) {
    print(i);
}

 

이런 구조로 이루어져있다. for 다음 () 안에 while과 다르게 세 종류의 자료를 적는다. 첫번째 적는 내용은 for문 안에서 사용할 변수이고, 두번째 적는 것은 조건식이다. 마지막으로 i에 증감을 담당하는 증감식을 적어주면 끝이다. while문을 좀더 보기 좋게 정리했다고 볼 수도 있다.

 

for문으로 list 다루기

List<String> fruits = ['사과', '배', '포도', '귤', '딸기'];

for (int i = 0; i<fruits.length; i++) {
    print('나는 ${fruits[i]}를 좋아해');
}

 

위의 while로 작성한 코드와 동일한 기능을 하는 코드이다. 어떤 코드가 더 한눈에 잘 들어오는가? 이해하기 쉬운 코드를 사용해라. 개인적으로는 while문과 for문 중 for문을 선호하기는 하지만 어디까지나 취향이니 강요할 생각은 없다.


 

2. 반복문 실전 사용

반복문은 flutter에서 list와 map 형태의 데이터를 다룰때 많이 사용하게 되는데 안타깝게도 앞서 설명한 while문과 for문에 대한 설명은 잘쓰이지 않는다. 더 간단하고 직관적으로 표현할 방법이 많기 때문인데 그래도 위에 설명한 내용이 반복문의 가장 기초가 되는 내용이니 꼭 알아두길 바란다.

 

forEach 메소드

앞서 list.length에 대해 설명하면서 유용한 메소드들이 많다고 얘기를 했었는데, forEach메소드도 그 중 하나이다.

 

  List<String> fruits = ['사과', '배', '포도', '귤', '딸기'];

  fruits.forEach((fruit) {
    print('나는 $fruit을 좋아해');
  });
  
  // Arrow function을 사용하면 이렇게도 표현 가능하다.
  // fruits.forEach((fruit) => print('나는 $fruit을 좋아해'));

 

앞서 while과 for를 사용했던 예제와 동일한 기능을 하는 예제이다. list에 있는 내용물을 기본으로 하여 자동으로 반복문을 실행한다.

.forEach( () {} ); 가 기본적인 형태이며, forEach문 안의 () 안에는 list안 요소 하나하나를 지칭할 변수명을 적어준다. 그리고 {}안에서 코드를 작성할때 () 안에 작성했던 변수명을 기준으로 코드를 짜주면 된다.  

 

 

Arrow function을 활용하면 더 짧게 코드를 짜는 것도 가능하나 이부분은 추후에 다루도록 하자. 우리가 주목해야 하는것은 오른쪽 하단에 뜨는 info 메세지이다.  내용을 보면 이렇게 함수같은 코드를 짜는 걸 지양하라고 한다. view docs를 보면 권장하는 코드 모양을 보여주니 참고하도록 하고, 위 코드를 권장하는 방식으로 재작성 하면 다음과 같다.

 

for ( .. in ..) 구문

  List<String> fruits = ['사과', '배', '포도', '귤', '딸기'];

  for (String fruit in fruits) {
    print('나는 $fruit을 좋아해');
  }

 

앞서 for문 안에 변수선언, 조건식, 증감식을 넣는 방식을 설명했다면, 여기에는 조금 다른 방식으로 코드를 적는다. fruit라는 새로운 변수를 선언하고 이 변수는 fruits라는 리스트의 개별 요소가 담긴다고 생각하면 된다. 이렇게 코드를 구성하면 list 안의 내용물의 변화에 따라 코드를 새로 수정해야할 필요도 없고, 읽기도 편하며 이해하기도 직관적이다.

 


cf) 반복문을 활용한 Map 다루기

Map<String, String> gifts = {
  'first': 'partridge',
  'second': 'turtledoves',
  'third': 'necklace',
  'fourth': 'flower',
  'fifth': 'golden rings'
};

gifts.forEach((String key,String value) {
  print('$key, I like $value');
});

Map은 key와 Value로 이루어져있다. 일반적으로 Map의 경우, 가지고 있는 구조가 다양하기 때문에 반복문을 잘 활용하지는 않으나, forEach에 대해 다룬 김에 이런것도 있구나 알고가면 좋을 것 같아 적는다. list에서 forEach를 쓸때랑 구조적으로 큰 차이는 없다. 차이가 있다면 () 안에 두개의 변수를 선언해주는데, 선언한 순서대로 key와 value를 받는다. (위 예제에서는 쉬운 이해를 위해 변수명 자체를 key와 value로 표기했지만, 편의상 k, v와 같이 알파벳으로 표현하기도 한다.)

 

Map에서는 반복문을 사용하는 것보다, 그 안에 들어있는 데이터에 어떻게 접근할지 생각하는게 더 중요하므로, 이런것이 있구나 정도만 알고 넘어가자.

 

Map<String, Dynamic> james = {
    'name': 'James',
    'Height': 186.5,
    'Weight': 78.1,
    'age': 43,
    'favorit color': ['red','orange', 'green'],
    'family': { 'wife': 'Lily',
                'son': 'Harry',
                'daugther': 'Marry'},
};

 

위와 같은 코드에서 가족들의 이름만 추출하고 싶다면 어떻게 해야할까?

james['family'].forEach((String key, String value) {
	print(value);
});

위와 같이 하면 된다. 맞추지 못했더라도 상관없다. 차근차근 읽어가면서 이게 왜 그 값들을 불러오게 되는지 생각할 줄 안다면 다른 구조의 Map을 접하더라도 데이터를 유연하게 사용할 수 있을 것이다.

반응형

'Flutter > Dart 입문' 카테고리의 다른 글

[Dart] 쉬어가기. Dart? Flutter?  (0) 2021.10.19
[Dart] 8. Function  (0) 2021.10.15
[Dart] 6. collection : Lists, Sets, Maps  (0) 2021.10.12
[Dart] 5. 조건문  (0) 2021.10.08
[Dart] 4. 변수와 연산  (0) 2021.10.07

댓글