상세 컨텐츠

본문 제목

솔리디티 강좌 23강 반복문2- break, continue

카테고리 없음

by D_One 2021. 9. 23. 12:19

본문


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

https://youtu.be/vAhfV6WoGpo

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


 

 

안녕하세요

 

오늘은 loop에서 사용되는 break 와 continue에 대해 알아보려고 합니다.

 

loop이 돌때,

break : loop을 완전히 끝내게 합니다, loop의 조건문 상관없이요.

예를들어, 초기값 i가 0 이고, 5 미만까지 총 5 번 돌아야하는 loop 있다고 가정할시, 

i 값이 break 를 만난다면, 값이 0 이든 3 이든 상관없이 loop을 끝냅니다. 

 

continue : 그 다음 반복으로 바로 점프 합니다, loop 안에 실행해야하는 내용이 있어도요. 

예를들어, 초기값 i가 0 이고, 5 미만까지 총 5 번 돌아야하는 loop이 있고,

이 loop은 돌때마다, i 값을 이벤트로 출력 해준다는 loop의 내용이 있다고 가정하겠습니다.

그러나, i 의 초기값 0 이 loop의 내용 이벤트를 출력하기전에 continue를 만나게 된다면, 이벤트 출력을 건너뛰고, 

바로 그다음 반복문으로 점프 합니다. 그러니 i 값은 0 에서 1이 되겠습니다.

 

예시를 통해 좀 더 쉽게 볼게요.

 

break

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract lec23{
    
    event CountryIndexName(uint256 indexed _index, string _name);
    string[] private countryList = ["South Korea","North Korea","USA","China","Japan"];
    function useBreak() public {
        for(uint256 i =0; i<countryList.length; i++){
            if(i==2){
                break;
            }
            emit CountryIndexName(i,countryList[i]);
        }
     }

    
}

현재 저희는 지난번 예제와 동일하게,

CountryIndexName 과 countryList 가 있습니다.

먼저 countryList는 ["South Korea","North Korea","USA","China","Japan"] 를 갖고있는 길이 5 인 배열입니다.

(인덱스는 0 부터 시작하니, 끝은 4 이겠네요)

그리고 CountryIndexName 이벤트는, 위의 배열값과 해당되는 인덱스 값을 출력하기위해 정의되었습니다.

 

자 인제 useBreak 함수를 볼게요.

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

for loop 의 초기값 i는 0 이고, i 는  countryList의 길이 5 미만일때만 반복문이 실행이 되고, i++은 반복문이 끝날때마다 i 씩 증가 한다 라는걸 알 수 있겠죠.

 

 

        for(uint256 i =0; i<countryList.length; i++){
            if(i==2){
                break;
            }
            emit CountryIndexName(i,countryList[i]);
        }

 

CountryIndexName 이벤트를 출력하기전,i == 2  즉 i 가 2가 된다면, if 문 안의 내용을 실행하게 되겠습니다.

if 문 안의 내용은 break; 입니다.

다시 말하자면, 반복문이 돌아서 i가 2가 되면, 해당 for loop은 완전히 멈추고 끝나게 되겠습니다.

즉 for loop의 조건문이 i 가 5 미만 까지 돈다고 하여도, i 가 2 가 되면, break 를 만나서 2의 이후 값 3과 4로 가는건 불가능 합니다. 

 

continue

 

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract lec23{
    
     event CountryIndexName(uint256 indexed _index, string _name);
     string[] private countryList = ["South Korea","North Korea","USA","China","Japan"];
     
     function useContinue() public {
        for(uint256 i =0; i<countryList.length; i++){
            if(i%2==1){
                continue;
            }
            emit CountryIndexName(i,countryList[i]);
        }
     }

break 에서 보았던 예제와 매우 유사한 예제입니다.

 

다른점은, for loop 안에 

            if(i%2==1){
                continue;
            }

 

라는 점입니다. 

 

먼저 if 문의 조건을 보면,

i%2 == 1 이라는 조건입니다.

 

다소 생소 하실 수도 있습니다.

% 의 의미는 나머지를 나타 냅니다.

 

예를들어,

 

0 나누기 2의 나머지는 0

1 나누기 2의 나머지는 1

2 나누기 2의 나머지는 0

3 나누기 2의 나머지는 1 

4 나누기 2의 나머지는 0

 

여기서 알 수 있듯이, 

2로 나누어서 나머지가 0이라면, 짝수 그리고 1 이라면 홀수라는 걸 알 수가 있습니다. 

 

즉 i%2 == 1 일때는 i 의 값이 홀수 일때를 나타낸걸 알 수 있어요. 

if 문은 홀수 일때만, if문의 내용을 실행한다 입니다.

if문의 내용은 continue 이니, CountryIndexName을 건너뛰고 그 다음 i 값으로 갈수 있다고 볼 수 있겠네요.

다시 말하자면, i의 값이 홀수가 된다면, CountryIndexName 이벤트를 건너 뛰고, 그 다음 반복문으로 간다.

i 값이 짝수가 된다면, if문이 실행이 되지 않기에 CountryIndexName 이벤트가 출력된다.

 

이 함수는 CountryIndexName는 짝수번째의 countryLista의 인덱스와 값이 실행 된다.

 

영상 참고 바랍니다.