상세 컨텐츠

본문 제목

솔리디티 강좌 22강 loop (for,while,do-while)

솔리디티 깨부수기 - 기본

by D_One 2021. 9. 22. 12:23

본문


유튜브를 통해, 쉽고 간편하게 이해 해보아요!

https://youtu.be/7Qplgyxp4VA

구독/좋아요 해주셔서 감사합니다 :) !!


안녕하세요. 

 

오늘은 loop(반복문) 에 대해서 알아 보려고 합니다.

먼저 loop 에는 3 가지 방법이 있습니다.

for, while, do-while 문이 있습니다. 

 

이 loop 도 다른언어의 loop과 같답니다.

loop은 왜 쓸까요? 

loop은 보통, 배열의 값들을 반복시켜, 배열안의 값들을 체크하거나, 꺼낼때 쓴답니다.

 

먼저 for-loop 부터 볼게요.

 

    for (초기값; 값이 얼마나 forloop을 돌아야하는지; forloop 한번 돌때마다 값의 변화;) {
            forloop 내용
      }

먼저 위와 같은 형태를 뜁니다. 

 

말로 설명하는것 보다, 예시를 통해보는게 더 이해가 잘갈거예요.

    event CountryIndexName(uint256 indexed _index, string _name);
    string[] private countryList = ["South Korea","North Korea","USA","China","Japan"];

    function forLoopEvents() public {
        for(uint256 i =0; i<countryList.length; i++){
        emit CountryIndexName(i,countryList[i]);
        }
    }

먼저 저희는 CountryIndexName 라는 이벤트countryList 라는 배열이 있습니다.

CountryIndexName 는 _index 와 _name 이라는 값을 받아, 출력 합니다.

countryList는 배열인데 초기값 설정이 되어, "South Korea","North Korea","USA","China","Japan" 인것을 알 수 가있습니다. 

 

저희는 for-loop을 사용하여, 배열의 인덱스 0의 South Korea 부터 인덱스 5의 Japan 까지 순회해보도록 하겠습니다.

물론 각 인덱스들을 순회 할때,  CountryIndexName은 배열의 인덱스 값(_index)과 배열의 값 나라라 이름(_name)을 받아서 출력 할 것입니다.  

 

자 인제 본격적으로 forLoopEvents 함수를 살펴 보겠습니다.

여기서 가장 주목할 점은, for loop 이겠죠.

 

for(uint256 i =0; i<countryList.length; i++)

for (초기값; 값이 얼마나 forloop을 돌아야하는지; forloop 한번 돌때마다 값의 변화;)

for 괄호 안에는 3개의 자리가 있답니다.

 

제일 첫번째는 초기값입니다.

초기 값은 말그대로, for loop이 시작하는 값입니다. 

그러면 for(uint256 i =0; i<countryList.length; i++)에서,

저희는 uint256 i = 0 으로 해주었으니, 시작하는 값의 변수는 i 이며, 시작하는 값은 0 부터 시작하겠다 라고 할 수 있습니다.

 

두번째 자리는, 값이 얼마나 forloop을 돌아야하는지 입니다.

즉,  for loop을 몇번만 돌게해라 라고 제한을 걸어 두는거죠.

그러면 for(uint256 i =0; i<countryList.length; i++)에서,

저희는, countryList 배열을 순회 할 것이니, 당연히 countryList 길이 만큼 돌아야겠죠.

지나번 강의때 배열의 길이 length를 구하려면, countryList.length 를 써줘야 구할수 있겠죠.

 ["South Korea","North Korea","USA","China","Japan"] 이니, length 는 5가 될 것입니다. 

 

다시 쓰면, 

for(uint256 i =0; i<5; i++) 가 되겠죠.

즉 i 는 countryList 의 길이 4 까지 (i < 5: 5 미만) 가겠죠.

4까지 가야하는 이유는, 인덱스는 0 부터 시작하니, 당연히 마지막 인덱스값은 4 가 되겠죠 : (0,1,2,3,4) 는 총 5개입니다.

 

마지막 세번째 자리는 forloop 한번 돌때마다 값의 변화 입니다.

즉 for loop 이 한번 돌면, i 값을 어떻게 변화(증감) 시켜주나 입니다. 

그러면, for(uint256 i =0; i<countryList.length; i++) 

볼수 있듯이 i++ 이니 1씩 증가 한다고 볼 수 가 있습니다. 

(이렇게 uint 변수값에 ++를 써주면 1 씩 증가한답니다)

 

자 인제 for(uint256 i =0; i<countryList.length; i++) 이 이해가실거예요.

 function forLoopEvents() public {
        for(uint256 i =0; i<countryList.length; i++){
        emit CountryIndexName(i,countryList[i]);
        }
    }

자 그러면 for loop 이 어떤순서로 도는지 한번 볼게요. 

 

for(uint256 i =0; i<countryList.length; i++){

      emit CountryIndexName(i,countryList[i]); 

      }

 

for-loop 순서 

1. uint256 i =0;  // i 는 0 부터 시작. 

2. i < countryList.length(=5) 보다 작은가? 작다면 for loop 실행 

3. emit CountryIndexName(i,countryList[i]);  // i 값 0 과 countryList[0](=South Korea)가 이벤트로 출력

4. i++ // i 가 1 증가 하여 0에서 1이 된다.

5. i<countryList.length // i (=1) 이 countryList.length(=5) 보다 작은가? 작다면 for loop 실행 

6 emit CountryIndexName(i,countryList[i]);  // i 값 1 과 countryList[1](=North Korea) 가 이벤트로 출력

7. i++ // i 가 1 증가 하여 1에서 2가 된다.

8. i<countryList.length // i (=2) 이 countryList.length(=5) 보다 작은가? 작다면 for loop 실행

9 emit CountryIndexName(i,countryList[i]);  // i 값 2 과 countryList[2](=USA) 가 이벤트로 출력

10. i++ // i 가 1 증가 하여 2에서 3가 된다.

11. i<countryList.length // i (=3) 이 countryList.length(=5) 보다 작은가? 작다면 for loop 실행

12 emit CountryIndexName(i,countryList[i]);  // i 값 3 과 countryList[3](=China) 가 이벤트로 출력

13. i++ // i 가 1 증가 하여 3에서 4가 된다.

14. i<countryList.length // i (=4) 이 countryList.length(=5) 보다 작은가? 작다면 for loop 실행

15. emit CountryIndexName(i,countryList[i]);  // i 값 4 과 countryList[4](=Japan) 가 이벤트로 출력

16. i++ // i 가 1 증가 하여 4에서 5가 된다.

17. i<countryList.length // i (=5) 이 countryList.length(=5) 보다 작은가? 5<5 되기에, for loop을 종료 '

 

위와 같이 for loop 이 돌아 가는것을 보았으니, 인제 while 과 do-while 문을 볼게요.

 

While

    초기값

    while (값이 얼마나 forloop을 돌아야하는지) {
    whileloop 내용
    whileloop 한번 돌때마다 값의 변화;

    }

while도 for loop 이 갖고 있는 세가지의 자리 값들이 있아요.

그 세자리의 자리값들의 위치만 다르답니다, 그러나 본질은 같아요. 

 

쉽게 예시로 볼게요.

 

    function whileLoopEvents() public {
        uint256 i = 0;
        while(i<countryList.length){
             emit CountryIndexName(i,countryList[i]);
             i++;
        }
    }

for loop 과 비교하여 생각하면 이해하기가 쉬워요.

 

uint256 i = 0 은 loop의 초기값이라 볼 수 있겠네요.

그리고 while(i<countryList.lengt)while loop이 얼마 만큼 돌아야하는지를 나타내는지 알 수가 있네요.

즉 countryList.lengt는 5이니, i는 4까지 되니 총4번 돌겠네요.

그리고, i가 현재 0이니, 4이하 일때, 조건이 충족이 되어, emit CountryIndexName(i,countryList[i]); 이 실행되겠네요. 

그러고 나서, i 값은 1이 오르겠네요. 

1이 올라도, i는 0 에서 1이 되니까, 여전히 조건이 충족이되니 이벤트를 출력하겠네요.

 

 

Do-while 

    초기값
    do{
          dowhileloop 내용
    }
    while (값이 얼마나 forloop을 돌아야하는지)

do-while 은 while 과 for loop 과 비슷하나, 한가지 다른점은 순서가 다르다는 것 입니다.

do-while: loop 내용 실행 -> loop이 얼마 만큼 돌아야하는지 조건 체크

for 과 while: loop이 얼마 만큼 돌아야하는지 조건 체크 -> loop 내용 실행

 

예시를 보겠습니다. 

 

    function doWhileLoopEvents() public {
        uint256 i = 0;
        do{
            emit CountryIndexName(i,countryList[i]);
            i++;
        }
        while(i<countryList.length);
    }

현재 이렇습니다.

초기값 -> loop 내용 (이벤트 출력) -> i값증가 -> i <countryList.length (i 가 while 조건에 충족하는지 체크)

 

그러나 이러한 방식은, 맨처음 초기값을 체크를 하지 않기에 이런경우가 발생할 수가 있습니다.

 

    function doWhileLoopEvents() public {
        uint256 i = 2;
        do{
            emit CountryIndexName(i,countryList[i]);
            i++;
        }
        while(i<1);
    }
}

현재 저의는 while 의 조건문을 i는 1 미만의 값 즉 1 는 0 까지 가능하다라고 제한을 걸어 두었습니다.

그러나, 이러한 조건문은 제일 맨나중에 체크 되기에,  i = 2 의 값을 갖고도 loop의 내용 이벤트를 출력 하게 된답니다.

출력후 i++가 되어 2에서 3이되고 난후에, 조건문이 체크되어 while 문이 멈춥니다.

 

영상을 참고 해주세요.

관련글 더보기