-
[Unity]유니티 입문하기 5-5(C# 기초개념 - 제어문)프로그래밍 2023. 7. 28. 14:03
이전 글에서는 연산자의 종류와 사용법에 대해서 자세히 알아봤습니다.
이번 글에서는 저번에 배운 다양한 연산자들을 활용하여 코드의 흐름을 제어하는 제어문에 대해서 배워보겠습니다.
제어문
기본적으로 프로그램은 위에서 아래 순서로 코드를 읽어나가며 작동합니다. 하지만 경우에 따라 특정 코드를 반복하거나, 혹은 건너뛰어야 하는 일이 생기기도 하죠. 이렇게 프로그램이 작동하는 흐름을 바꾸는 것이 제어문입니다.
제어문은 크게 조건문과 반복문으로 나뉘게 됩니다.
조건문
조건문은 코드의 한 부분에 조건을 달아, 조건문을 실행하는 시점에 해당 조건을 만족하는 코드만을 실행하도록 하는 코드입니다.
조건문에는 if문과 switch문이 있습니다.
if문
if(조건식){ //조건식이 참이라면 괄호 안의 코드를 실행 }
if문의 기본 형태는 위와 같습니다.
if문이 실행되면 소괄호 안의 조건식이 참과 거짓 중 어떤 값을 가지는지 판별하여, 참이라면 중괄호 안의 코드를 실행하고, 거짓이라면 중괄호 안의 코드는 실행하지 않은 채 넘어가게 됩니다.
조건식이 true 아니면 false의 값을 가져야 하므로, 일반적으로 조건식 부분에는 bool 변수 아니면 논리 연산자와 비교 연산자로 이루어진 식이 들어가게 됩니다.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { void Start() { int a = 3; if(a<5) { Debug.Log(a); } } }
예를 들어, 위와 같이 코드를 작성하고 실행하면 다음과 같은 출력 결과를 볼 수 있습니다.
a의 값이 5보다 작았으므로, 조건식인 a<5의 결과가 참이 되어 if문 안의 Debug.Log(a) 부분이 실행된 것입니다.
반대로 a의 값을 5보다 크게 변경하면, a의 값이 출력되지 않는 것을 볼 수 있습니다.
하지만, 조건식을 만족했을 때 실행해야하는 코드가 있는가 하면, 조건식을 만족하지 않을 때에만 실행해야 하는 코드가 있을 수 있죠. 그럴 때 if문과 짝을 이루어 나타나는 것이 else문입니다.
else문 안의 코드는 앞의 if문의 조건식을 만족하지 않았을 때에만 실행됩니다.
else 뒤에 추가로 if를 덧붙여, 첫 번째 조건식은 만족하지 않지만 두 번째 조건식은 만족하는 경우에만 실행하는 코드를 작성하는 것도 가능합니다.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { void Start() { int a = 3; if(a>10) { Debug.Log("a는 10보다 큽니다."); } else if(a>5) { Debug.Log("a는 5보다 크지만, 10보다는 같거나 작습니다.") } else { Debug.Log("a는 5보다 같거나 작습니다.") } } }
if문과 else문을 이용하면 이렇게 a의 값에 따라 다른 코드를 실행할 수 있습니다.
위와 같이 코드를 작성하고, a의 값을 바꾸어가며 출력 결과를 직접 확인해 봅시다.
switch문
switch문은 어떠한 조건이 여러 개의 값을 가질 수 있을 때, 그 값 별로 다른 코드를 실행하는 용도로 사용합니다.
switch(조건) { case 값1: // 조건이 값1인 경우 실행할 코드 break; case 값2: // 조건이 값2인 경우 실행할 코드 break; default: //조건이 위의 어느 값에도 해당하지 않을 때 실행할 코드 break; }
조건문의 기본 형태는 위와 같으며, case의 개수를 늘리면 지정하고 싶은 값의 수도 늘릴 수 있습니다.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { void Start() { int a = 3; switch(a) { case 1: Debug.Log("a의 값은 1입니다."); break; case 2: Debug.Log("a의 값은 2입니다."); break; case 3: Debug.Log("a의 값은 3입니다."); break; default: Debug.Log("a의 값은 4 이상입니다."); break; } } }
a의 값을 바꿔가며 위의 예제 코드를 실행해 봅시다.
반복문
조건문은 특정 조건을 만족할 때에만 코드를 실행하도록 하는 코드였다면, 반복문은 특정 조건을 만족하는 한 특정 코드를 계속 반복하도록 하는 코드입니다.
반복문에는 대표적으로 for문과 while문이 있습니다.
for문
for문은 반복문 중에서 가장 많이 사용된다고 해도 과언이 아닌 구문입니다.
for문은 변수를 선언한 다음, 반복이 실행될 때마다 해당 변수를 변화시키며 그 변수가 주어진 조건을 벗어나게 되면 반복을 멈추는 구문입니다.
for(초기화; 조건식; 반복자) { //실행할 코드(본문) }
for문의 기본 형태는 위와 같습니다.
for문의 소괄호 안을 보면 초기화, 조건식, 반복자가 세미콜론으로 구분된 것을 볼 수 있는데요,
초기화는 조건식과 반복자에서 사용될 변수를 선언하게 됩니다. 여기서 선언되는 변수는 보통 반복할 횟수를 세는 카운터의 역할로 사용하게 됩니다. 초기화 부분은 for문에 진입할 때 한 번만 실행하게 되며, 이후 반복 중에는 실행되지 않습니다.
조건식은 반복을 유지할 조건에 대해서 적게 됩니다. 조건식은 for문의 본문이 시작되기 전에 실행되는 코드로, 조건식 부분이 true를 반환한다면 본문을 실행하고, false를 반환하게 된다면 반복을 멈추고 for문을 벗어나게 됩니다.
반복자는 for문의 본문이 실행 완료되었을 때마다 실행되는 코드입니다. for문의 본문이 실행을 종료하면, 반복자가 실행되어 초기화 단계에서 선언된 변수의 값을 증가시키거나 감소시키게 됩니다. 그 후 조건식으로 돌아가 조건식이 반환하는 값을 확인하고, 반복을 계속하거나 멈추는 식이죠.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { void Start() { for(int a=0; a<=5; a++) { Debug.Log(a); } } }
따라서 이렇게 예제를 작성하게 되면,
이렇게, 콘솔에 0부터 5까지 반복해서 출력하게 됩니다.
foreach문
반복문을 통해서 배열을 출력하는 법은 복잡하지 않습니다.
int[] numbers = {5, 4, 3, 2, 1} for(int i=0; i<numbers.Length; i++) { Debug.Log(numbers[i]); }
다음과 같이 코드를 작성하면, 0에서 시작해서 numbers 배열의 길이 - 1까지 i의 값이 변화하며 배열의 값을 하나하나 출력해 줄 것입니다. (numbers.Length는 numbers 배열의 길이를 반환한다.)
하지만, 이렇게 하면 배열의 모든 요소에 접근하기 위해 변수를 새로 선언해야 하고, 조건식을 작성할 때 배열의 길이를 명시해야 하는 번거로움이 있습니다.
그 해결책이 foreach문입니다.
foreach(자료형 변수명 in 배열_및_컬렉션의_식별자) { //실행할 코드 }
foreach문의 기본 형태는 이렇습니다.
foreach문의 본문을 실행하기 전에 주어진 배열의 값을 첫 번째 값부터 정의한 변수에 대입한 뒤 본문을 실행하고, 본문의 실행이 종료되면 다음 값을 변수에 대입한 뒤 본문을 실행하는 식으로 반복하다가 배열이 종료되면 반복도 종료되게 됩니다.
int[] numbers = {5, 4, 3, 2, 1} foreach(int item in numbers) { Debug.Log(item); }
foreach문으로 다시 아까의 배열을 전부 출력하는 코드를 작성해 보면 이렇습니다.
for문과 달리 카운터 용도의 변수를 선언할 필요도 없고 배열의 길이를 고려할 필요도 없지만, for문과 비교했을 때 자유도가 떨어진다는 단점이 있습니다.
while문
while문 또한 for문과 같은 반복문이지만, for문과는 달리 소괄호 안에 조건식 하나만 들어가는 특징이 있습니다.
while(조건식) { //실행할 코드 }
while문은 for문에 비해서는 비교적 간단한 형태를 하고 있습니다.
while문은 본문을 실행하기 전에 조건식을 확인하고, 그것이 참이라면 본문을 반복하고, 거짓이라면 이탈하는 구조로 되어있습니다.
이렇게만 놓고 보면 왜 while과 for문이 구분되어 있는지 이해가 안 갈 수 있지만, while문의 장점은 반복 횟수가 지정되어있지 않다는 것입니다.
따라서, 반복 횟수가 명확하지는 않지만, 특정 조건을 만족했을 때 반복을 멈춰야 한다면 for문보다는 while문이 적절하다고 할 수 있습니다.
break와 continue
반복문을 이용하다 보면, 조건식에 따른 종료 외에도 다른 조건 하에 반복문을 종료해야 하는 경우가 있을 수 있습니다.
이렇게 반복문의 흐름을 제어하는 키워드가 break와 continue입니다.
break는 반복문에서 그 즉시 이탈하는 키워드입니다.
switch문에서도 break가 등장했었는데, switch문에서 break를 만나면 그 밑의 코드를 실행하지 않고 switch문에서 빠져나갔듯이, 반복문에서도 그 이후의 코드와 반복을 실행하지 않고 반복문에서 빠져나가게 됩니다.
for(int i=0; i<5; i++) { if(i == 3) { break; } Debug.Log(i); }
예를 들어 위와 같은 코드를 작성했다고 생각해 봅시다.
if문이 없었다면, 위 코드는 0에서 4까지의 정수를 출력했을 것입니다.
하지만 위의 조건문과 그 속의 break로 인해, i가 3이 되는 반복 중에 i를 출력하기 전에 반복이 종료된 것을 확인할 수 있습니다.
continue는 break와는 달리 반복문에서만 사용되며, 반복문을 완전히 빠져나가는 것이 아니라 해당 반복에서 본문을 더 이상 실행하지 않고 다음 반복으로 넘어갑니다.
for(int i=0; i<5; i++) { if(i == 3) { continue; } Debug.Log(i); }
위의 break문 예제에서 break만 continue로 바꾼 코드입니다.
실행해 보면 3번째 반복에서 if문의 조건식이 참을 반환해서 3번째 반복에서 코드가 작동한 것은 똑같지만,
break와 달리 continue는 3번째 반복만 건너뛰고 다시 4번째부터 반복을 시작한 것을 확인할 수 있습니다.
'프로그래밍' 카테고리의 다른 글
[Unity]유니티 입문하기 6-2(키 입력, 이동 구현) (0) 2023.08.02 [Unity]유니티 입문하기 6-1(오브젝트 활성화/비활성화, 위치 조정) (0) 2023.08.01 [Unity]유니티 입문하기 5-4(C# 기초개념 - 연산자 심화) (1) 2023.07.27 [Unity]유니티 입문하기 5-3(C# 기초개념 - 형변환, 배열) (0) 2023.07.27 [Unity]유니티 입문하기 5-2 (C# 기초개념 - 변수, 자료형) (0) 2023.07.24