본문 바로가기

취미로 하는 게임코딩_gameCodingAsHobby/유니티와 C# 개념 정리_Concept Summary

유니티와 C# 개념 정리_011_반복문 Loop

반복문(Loop)

 

반복문(Loop, 루프)은 같은 작업을 반복해서 수행할 때 사용한다.

C#의 반복문 형식은 4가지가 있다.

 

1. while (와일, ~하는 동안)

while 반복문은 가장 기본적인 형식이다.

반복하기 전에 조건을 먼저 확인한 후 반복할 지를 결정한다.

2. do~while (두~와일)

while과 비슷하지만 먼저 반복한 후 조건을 확인하여 계속 반복할 지를 결정한다.

 

3. for (포, ~동안)

가장 일반적으로 사용하는 반복문이다.

초기문, 각 반복마다 증가하는 변수, 중지 조건을 포함하고 있다.

 

4. foreach (포이치, 각각~동안)

array(배열), List(리스트) 등에 포함되어 있는 모든 요소를 자동으로 반복해서 가져올 수 있다.

 

각 반복문을 유니티로 확인해본다.

 

 

While 반복문

while반복문의 형식은 아래와 같다. 

 

while ( ) { }

 

조건인 괄호 안이 'true(참)'인 동안에는 중괄호 { } 안의 내용을 반복한다.

 

while반복문은 무한 반복이 생길 수 있는 위험이 있기 때문에 주의해야 한다.

무한 반복(infinite loop, 무한루프)은 반복을 시작한 후 빠져나오지 못하고 무한 반복의 블랙홀에 빠지는 것을 말한다.

결과는 프로그램이 다운(정지) 된다.

이런 안전성 문제가 있기 때문에 애초에 불씨를 만들지 않기 위해 while 사용을 꺼리는 사람도 있다.

 

유니티에서 아래와 같은 코드를 작성하여 실행하면 무한루프에 들어간다.

 

7번줄에서 while(true) 는 항상 '참'이므로 9번줄을 무한반복하게 된다.

실제로 실행하면 '무한 루프!' 글자가 반복해서 출력되는 것이 아니라 유니티가 그냥 먹통이 된다.

무한루프에 빠지면 유니티는 출력하는 일이든 뭐든 아무 일도 하지 못하는 상태가 된다.

 

참고로 유니티가 무한루프에 빠진 경우에는 유니티를 강제 종료시켜야 한다.

Ctrl + Shift 를 함께 누른 상태로 Esc 키를 누른다.

Unity Editor를 선택한 후 작업끝내기 버튼을 클릭한다.

다른 방법으로는 윈도우를 다시시작하는 것이 가장 깔끔하다.

 

위 예에서 보았듯이 while(true) 는 무한반복 블랙홀을 만든다.

무한 반복에 빠지지 않게 하려면 탈출구를 만들어야 한다.

C#에서 탈출구는 return , break 를 사용한다.

 

While반복문 예

 

5번줄: int타입으로 testLoop(테스트 루프) 라는 변수를 선언하고 초기값을 0 으로 할당했다.

 

8번줄: while반복문의 조건은 ' testLoop 가 4 보다 작을 동안 ' 다시 말해서 (testLoop < 4 ) 가 true(참)일 동안이다.

 

10번줄: 조건이 true(참)일 경우 문자열(while loop: )과 변수(testLoop)값을 결합하여 출력하라.

처음에는 변수의 초기값이 0 이므로 ( 0 < 4 ) 는 참이므로 print( )메서드가 호출될 것이다.

 

11번줄: 변수값을 1 증가하라.(반복할 조건)

 

while문이므로 다시 반복된다.

 

8번줄: 이제 변수값은 1이다. (1 < 4)는 참이므로 10번,11번줄이 실행된다.

 

이런 식으로 반복되다가 (4 < 4)일 때는 false(거짓)이므로 더 이상 다음 줄로 넘어가지 않고 종료된다.

 

참고로 11번줄 코드가 없으면 어떻게 될까?

변수값의 변화가 없는 상태로 초기값이 조건에 들어가면 ( 0 < 4 )는 항상 true 이므로 무한반복의 블랙홀이 생긴다.

 

do-while 반복문

while 반복문과 비슷한 방식으로 처리하지만 단지 조건을 먼저 확인하느냐, 나중에 확인하느냐의 차이다.

while의 경우는 조건이 맞지 않으면 실행하지 않지만,

do~while의 경우는 최초는 무조건 실행한 후 조건을 검토하므로 최소 1회 반복은 보장된다.

 

위에서 보듯이 testLoop의 초기값이 5 이므로 while 반복문의 조건이 false(거짓)이지만 10번줄과 11번줄이 실행된다.

출력은 되지 않았지만 11번줄의 결과로 testLoop값은 6 이 되었을 것이다.

 

for 반복문

 

for반복문은 while에서 초기값 정하기, 조건, 변수값 바꾸기와 같은 코드가 분리되어 있던 것을 한 곳으로 모은 형태이다.

즉, while반복문을 좀 더 편리하게 사용할 수 있게 만든 것이다.

위의 while반복문을 for반복문으로 바꾸면 아래와 같다.

for반복문의 형태는 다음과 같다.

 

for( 초기화; 조건; 반복할 조건)

{ 조건이 참 일때 실행할 코드 } 

 

for 괄호 안에 초기화, 조건, 반복할 조건은 C#에서 코드 종료를 나타내는 세미콜론( ; )으로 구분하는 것을 명심해야 한다. (곰곰히 생각하면 당연하다.)

또한 for 괄호 안에 모두 작성하게 되어 무한반복에 빠질 위험도 적어진다.

 

참고로 위와 같이 for반복문 안에서만 1회용으로 사용할 경우에는, 변수명을 i, j, k 등과 같이 간단한 앨프벳을 쓰는 것이 일반적이다. testLoop와 대체하면 코드가 훨씬 더 간단하게 되는 것을 알 수 있다.

 

foreach 반복문

foreach반복문은 for반복문에서 변형된 것이다.

나열하거나 셀 수 있는 요소를 가진 데이터(array(배열) , List(리스트) 등)의 반복에 사용하기 위해 만들었다.

요소가 여러 개 이므로 각각 이라는 뜻의 each를 결합한 것 같다.

우리말로 풀면 '각각에 대하여 반복하라' 는 의미일 것이다.

 

기본 형태는 다음과 같다.

 

foreach (배열타입 변수명 in 배열명)

{

    실행할 내용

}

 

배열과 foreach반복문에 대한 설명은 이전 글(유니티09_C#_배열) 에 더 자세히 나와있다.

여기서는 추가 예를 정리한다.

 

5번줄: string(문자열)타입의 배열(array)을 선언하고 변수명은 comicBooks (만화책들)이라고 지었다.

만화책이 여러 개 이므로 변수명도 복수를 나타내기 위해 끝에 s를 붙였다.

이 배열 변수에 배열 요소(슈퍼맨, 원더우먼, 배트맨)를 저장한다.

 

9번줄: foreach반복문의 조건에 string타입의 임시 변수 i (요소 하나씩 저장하므로 배열이 아니다)을 만들고 comicBooks 변수 안에(in) 있는 요소 중에서 첫번째 요소를 가져와서 저장한다.

 

11번줄: comicBook변수에 저장된 값을 출력한다.

 

다시 9번줄로 가서 comicBook에 다음 요소를 저장한다.

이런 식으로 반복한다.

 

유니티에서 실행하면 다음과 같은 결과가 나타난다.

아래와 같이 string(문자열)에서 char 타입을 개별적으로 반복해서 가져올 수도 있다.

 

점프문(Jump Statement)

점프문은 코드 실행 중에 다른 위치로 이동(점프)하도록 할 때 사용한다.

break, continue가 있다.

 

반복문에서 사용하는 예는 이전 글 '유니티08_C#04 제어문'을 참고한다.

요점은 break는 반복문에서 완전히 빠져나갈 때 사용하고,

continue는 반복문에서 나머지 부분을 건너뛰고 다음 반복을 계속할 때 사용한다.

 

아래 예제를 유니티로 실행하면 어떤 결과가 나올 지 예상해 보고 실제로 출력해서 확인해 본다.

 

break 예제

 

 

위 코드에서 if문의 실행 코드가 한 줄인 경우 중괄호를 생략할 수 있다.

그러므로 첫번째 예의 경우도 if (i ==4) break; 로 표현할 수 있다.

 

 

 

continue 예제

위 코드에서 if 조건은 다음과 같다.

i 나누기 90 의 나머지가 0 이 아니면

continue 하라. 즉, print(i)를 실행하지 말고 다음 반복을 계속하라.

 

이것을 달리 말하면  i를 90으로 나눈 나머지가 0이면 i값을 출력(print)하라는 뜻이다.

 

참고로 %modulus(모듈러스) 또는 mod(모드) 연산자라고 한다.

이 연산자는 어떤 숫자를 어떤 숫자로 나눈 후 나머지 값을 반환(return)한다.

예를 들어 4%3 은 4는 3으로 1번 나누어지고 나머지는 1이므로 1값을 반환한다.

 

공학용 계산기로 확인하면 다음과 같다.

아래와 같이 간단하게 코드로 표현해서 확인할 수 있다.

하지만 아래와 같이 mod를 float타입에 사용하면 예상하지 못한 결과값이 나올 수 있다.

 

float값이 공학용 계산기와 다르게 나오는 이유는 근본적으로는 고정소숫점과 부동소숫점을 사용하는 차이 때문이다.

추가로 컴퓨터의 경우 이진수를 사용하기 때문이다.

float같은 부동소수점 숫자를 이진수로 변환하는 과정에서 무한 반복 같은 상황이 발생할 수 있다.

이런 경우 컴퓨터는 메모리 공간이 무한하지 않기 때문에 데이터 잘라내기 또는 반올림 등을 하도록 하는 표준 설정(IEEE 754)에 의해 작업을 한다.

 

자세히는 알 필요 없을것 같고 결론적으로 부동소수점 숫자의 계산은 부정확한 결과값이 발생할 수 있다는 것을 기억하자. 

 

float, double, decimal 같은 floating-point (부동소숫점) 타입의 계산이나 casting(타입 변환)은 주의해야 하며 확인이 필요하다.

 

끝.

Wraven...