본문 바로가기

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

유니티와 C# 개념 정리_009_조건문 if , ++ , --

if (이프) 문에 대해서는 이전에 작성한 글도 있으므로 참고한다.(유니티07_C#_03_제어문)

 

조건문(Conditional Statements)을 사용하면 흐름을 다른 방향으로 바꿀 수 있다.

즉, bool의 true값 또는 false값에 따라 각각 다른 코드를 실행한다.

 

조건문의 가장 일반적인 형태는 if (이프)와 switch (스위치)를 사용하는 것이다.

 

if 조건문

 

if조건문의 형태는 다음과 같다.

 

if (true) {  }

 

괄호 안의 내용이 true(참)이면 중괄호 { } 안의 코드를 실행한다.

false(거짓) 이면 실행하지 않는다.

 

게임에서 종종 나오는 코드를 유니티에서 만들어 본다.

유니티에서 IfStatement (if문)이라는 스크립트를 만들고 아래와 같이 코드를 작성한다.

 

5번줄에서 int타입의 변수 count(카운트)를 선언한다.

int타입의 변수는 디폴트 값으로 0을 가진다.(타입과 초기화 참고)

 

9번줄에서 변수count의 값을 1 증가시킨다.

++ 는 증가 연산자인데 변수값을 1 증가하는 기호이다. (변수값을 1 감소하는 -- 기호도 있다.)

추가 설명은 마지막에 따로 정리한다.

 

10번줄에서 Debug.Log() 메서드로 count값을 확인한다.

Debug.Log메서드는 print메서드와 마찬가지로 콘솔창에 메시지를 나타내는 함수이다.

 

12번줄에서 if조건문을 작성한다.

"만약 count 값이 1과 같다면"

즉, 괄호안의 조건이 참이면 13~15번줄의 중괄호 안의 내용을 실행한다.

14번줄은 "count값에 0을 저장하라"

 

참고로 중괄호 안의 코드가 한 줄로 끝난다면 중괄호를 생략할 수 있다.

 

 

스크립트를 저장한 후 메인카메라 또는 아무 게임오브젝트에 연결한 후 실행하면 아래와 같이 나타날 것이다.

 

코드를 아래와 같이 수정해본다.

 

5번줄에서 score(스코어, 점수)라는 변수와 6번줄에서 gameOver(게임오버)라는 bool타입의 변수를 선언했다.

값을 초기화하지 않았기 때문에 디폴트값으로 각각 0과 false 값을 가진다.

 

10번,11번줄에서 각 변수의 값이 얼마인지 Debug.Log메서드로 확인해본다.

 

13번 줄에서 조건문을 작성한다.

"만약 gameOver가 false와 같다면" 

중괄호 안의 코드를 실행하라.

 

15번 줄에서 += 부호는 "더해서 저장" 하라는 뜻이다.

그러므로 15번 줄은 score변수에 1을 더해서 저장하라는 코드이다.

앞의 ++ 기호와 같다.

 

스크립트를 저장한 후 실행하면 다음과 같은 결과가 나타날것이다.

 

if ~else문

 

if조건문이 true(참)가 아닐 때 실행해야 하는 코드가 있다면 else를 사용한다.

Update( )메서드에 아래 코드를 작성한다.

위 코드는 만약 score 값이 5보다 작거나 같으면, score 값을 1 증가하고

그렇지 않으면(else) return(리턴, 종료)한다.

 

실행하면 다음과 같다. 

score값이 6일 때 부터는 else문을 실행하므로 print메서드가 더 이상 실행되지 않는다.

 

if~else if ~else

조건이 여러 개 필요할 때는 esle if를 사용한다.

예를 들면 다음과 같다.

8번줄: float타입의 변수 x에 폰의 가속도계에서 측정한 x값을 저장한다.

10번줄: 만약 x값이 -0.1보다 작으면(조건1) , MoveLeft( )메서드를 실행한다.

14번줄: 또 만약 x값이 0.1보다 크면(조건2) , MoveRight( )메서드를 실행한다.

18번줄: 그렇지 않으면(조건3) , Stop( )메서드를 실행한다.

 

조건1이 true(참)이면 조건2,3은 건너뛰고, false(거짓)이면 조건2를 확인한다.

조건2가 true(참)이면 조건3은 건너뛰고, false(거짓)이면 조건3을 실행한다.

 

중첩if

더 복잡한 구조를 위해 if문 내부에 다른 if문을 넣을 수 있다.

이런 구조를 중첩(nesting, 네스팅)이라고 한다.

 

중첩 구조는 다양한 형태를 가질 수 있다.

 

 

증감 연산자(++, -- )

 

참고로 위에서 사용했던 증감 연산자를 좀 더 알아본다.

++ 는 변수값을 1 증가하고,

-- 는 변수값을 1 감소한다.

 

그런데 증감연산자는 변수명 다음에 또는 이전에 붙일 수 있다.

 

변수++

++변수

 

둘의 차이는 다음과 같다.

변수 이전에 붙이는 경우(++변수, --변수)를 전위(앞에 위치)라고 부른다.

변수 다음에 붙이는 경우(변수++, 변수--)를 후위(뒤에 위치)라고 부르고,

 

전위는 현재 변수값을 1 증가 또는 1 감소한 다음에 변수값을 반환한다.

후위는 현재 변수값을 먼저 반환한 다음에 변수값을 1 증가하거나 감소하여 저장한다.

 

유니티에서 확인해보자.

Increment(증가)라는 스크립트를 만들고 아래 코드를 작성한다.

5번줄: int 타입의 변수 i를 선언하고 초기값으로 0을 저장했다.

초기화 하지 않아도 int타입의 디폴트값인 0 이 저장되지만 눈에 보이도록 적었다.

 

8번줄: 변수 i 값을 출력한다.

9번줄: 변수 i 값을 1 증가한다.

10번줄: 변수 i 값을 출력한다.

11번줄: 변수 i 값을 1 증가한다.

12번줄: 변수 i 값을 출력한다.

 

실행한 결과는 다음과 같이 나타날 것이다.

9번줄은 print메서드에 변수 i 값을 먼저 반환한 후 1 증가했기 때문에 0 이 먼저 나타난다.

11번줄은 변수 i 값에 1을 증가한 후 print메서드에 반환했기 때문에 2가 나타난다.

12번줄에서 변수 i의 최종값은 2이다.

 

만약 서로 바꿔서 9번줄에서는 전위(++i), 11번줄에서는 후위(i++)로 한 후 실행하면 다음과 같이 될 것이다.

 

결론적으로 ++ 또는 --가 변수의 앞에 붙든, 변수 뒤에 붙든 1 증가 또는 감소한다.

과정은 달라도 결과는 같다.

 

하지만 다른 연산자와 혼합되어 있을 때는 처리하는 우선순위가 있기 때문에 주의해야 한다.

예를 하나 더 만들어 본다.

5번줄: int 타입의 변수 i 와 j 를 선언하고, j는 3으로 초기화 한다.

같은 타입의 변수는 콤마( , )로 구분하여 함께 선언할 수 있다.

위와 같은 경우, i 는 3이 아니라 int타입의 디폴트값인 0 으로 초기화된다.

 

9번,10번줄에서 i, j 값을 출력해본다.

 

12번줄: 변수 k에 i와 j를 더해서 저장하는데 i는 전위 증가이고 j는 후위 감소이다. 

13번줄: 계산 후 저장되어 있는 변수 k값을 출력한다.

 

15번, 16번줄에서 다시 i, j 값을 출력해본다.

 

저장한 후 실행하면 다음과 같은 결과가 나올 것이다.

15,16번 줄의 최종 i, j 값은 1, 2인데 두 값을 더한 k값은 4가 되었다.

 

만약 12번 줄을 아래와 같이 전위,후위를 서로 바꾼다면 k값은 달라진다.

여기서 중요한 것은 최종 i, j 값은 변하지 않는다는 것이다.

전위든, 후위든 어쨌든 ++는 1 증가하고, --는 1 감소한다.

 

k값이 4가 되기도 하고, 2가 되기도 한 이유는 언제 변수값의 반환 시점과 연산자의 우선 순위에 따라 처리된 결과이다.

 

우선 순위는 이전 글에서 언급했듯이 자세한 내용은 마이크로소프트 설명서 를 참고하거나 구글 검색에서 'C# 우선순위'를 검색한다. 링크된 마이크로소프트 설명서에 가면 아래 우선순위표를 찾을 수 있다.

위 그림을 보면 우선순위가 위에서 부터 높은 순서로 정리되어 있다.

 

그러므로 k = ++i + j--; 표현식의 계산 순서는 다음과 같다.

 

1. 후위의 우선 순위가 가장 높으므로 먼저 처리된다.

j--이므로 3을 먼저 1 감소해서 2가 되는 것이 아니라,

변수값(3)을 먼저 반환하게 된다.

그 후에 1을 감소하여 j에 2를 저장한다.

 

2. 그 다음 우선 순위가 전위이므로 i는 1 증가하여 1 이 반환된다.

 

3. 그 다음 덧셈이므로 1과 3을 더한다.

 

4. 할당 또는 대입(=)은 우선 순위가 가장 낮으므로 k에 4를 할당(=)한다.

 

만약 k값을 3으로 맞추려면 j를 전위 감소(--j)로 하거나 i를 후위 증가(i++)로 하면 된다.

즉, 둘 다 전위(1+2) 또는 후위(0+3)로 맞춘다.

 

결론적으로 변수 왼쪽에 붙은 증감 연산자(전위)는 1증가 또는 1감소한 값을 반환한다. (증감 후 반환)

변수 오른쪽에 붙은 증감 연산자(후위)는 먼저 변수값을 반환한 후 증감하여 변수에 저장한다.(반환 후 증감)

 

 

끝.

Wraven...