솔리디티 강좌 22강 loop (for,while,do-while)
유튜브를 통해, 쉽고 간편하게 이해 해보아요!
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);
}
}