본문 바로가기

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

유니티와 C# 개념 정리_008_Bool과 연산자

bool 타입

 

bool(부울) 타입은 true(참)과 false(거짓) 값만 저장할 수 있지만 조건문과 결합하면 코드의 흐름을 조절할 수 있는 강력한 도구가 된다.

 

bool에 사용하는 연산자

bool값의 연산에 사용하는 기호는 다음과 같다.

 

!     (exclamation mark, 엑스클러매이션 마크)

&   (ampersand, 앰퍼샌드)

|     (vertical bar, 버티클 바)

 

각각 기호의 이름이 있지만 간편하게 not(낱, 아님)연산자, and(앤드, 그리고)연산자, or(오어, 또는)연산자라고 부른다.

 

  • ! (NOT 연산자) : 느낌표(!)는 부정 연산자이며, bool값 앞에 붙여서 not(아님)의 뜻으로 사용하여 그 값을 반대로 만든다.

 

!true는 false가 된다.

!false는 true가 된다.

!(!true)는 !(false)이므로 결국 true가 된다.

 

  • && (AND 연산자) : 연산을 당하는 양쪽이 모두 true일때만 true를 반환한다.

false && false 는 false를 반환한다.

false && true 는 false를 반환한다.

true && false 는 false를 반환한다.

true && true 의 경우만 true를 반환한다. (헷갈리면 마지막 경우만 다음과 같이 외운다. 참 그리고 참만 참)

 

  • || (OR 연산자) : 연산을 당하는 양쪽이 모두 false 일때만 false 를 반환한다.
                         참고로 ( || )는 한글 키보드에서 금액을 표시하는 키(W에 가로줄)이다.

false || true 는 true를 반환한다.

true || false 는 true를 반환한다.

true || true 는 true를 반환한다.

false || false 의 경우만 false 를 반환한다. (거짓 또는 거짓만 거짓)

 

 

주의: &연산자와 | 연산자는 1개 있을 때와 2개있을 때 작동하는 방식에 차이가 있다.

예를 들어 A & B는 A,B 둘 다 참인지 거짓인지 판별한 후 값을 반환한다.

그러나 A && B는 둘 다 참일 때만 참이고 나머지 경우는 거짓이므로,

A가 false이면 && 다음에 오는 값은 검사하지도 않고 false를 바로 반환한다.

(앞쪽이 거짓이면 뒤쪽은 참이든, 거짓이든 상관없이 무조건 거짓이 되므로)

 

그러므로 일반적으로 2개짜리 연산자를 사용하면 되지만 특별히 양쪽 모두 판별해야 할 때는 & , | 를 사용하면 된다.

 

주의: 사칙 연산에서 곱셈, 나눗셈을 먼저 계산하듯이 bool연산자에도 연산 순서가 있다.

! (NOT)을 가장 먼저 연산하고 그 다음 & , | , && , || 순서대로 연산이 이루어진다.

그러므로 괄호를 사용하면 연산 순서를 조절할 수 있으므로 괄호를 잘 활용하는 것이 좋다.

 

우선순위에 대한 자세한 내용은 마이크로소프트 설명서 를 참고하거나 구글 검색에서 'C# 우선순위'를 검색한다.

 

비교에 사용하는 연산자.

 

== (같다) : 두 변수의 값이 같은지 확인할 때 사용한다.

 

코딩에서 두 변수 또는 그 값이 같은 지 비교할 때는 수학에서 사용하는 = 기호를 사용하지 않고 == 기호를 사용한다.

결과는 bool 타입의 값으로 나타낸다.

같으면 true, 같지 않으면 false

 

예를 들어 다음과 같은 코드가 있다.

 

int variable_0 = 55 ;

int variable_1 = 55 ;

print (varialbe_0 == variable_1) ;

 

실행하면 print()메서드는 true 라는 결과를 반환한다.

 

유니티에서 사용하는 대부분의 타입들은 값(value)을 비교한다.

즉, 변수명이 달라도 값이 같다면 같다고 판정한다.

이전 글에서 정리했던 타입들 중에서 값을 비교하는 타입들은 아래와 같다.

 

bool , int , float , char , string

 

또한 유니티에서 사용하는 아래 타입들도 값을 비교해서 결과를 반환한다.

Vector3 , Quaternion

 

그러나 값을 비교하지 않고 참조가 같은 지 비교하는 타입도 있다.

이전 글 '타입과 참조'에서 살펴본 참조 타입들이다.

 

참조 타입의 비교

참조 타입들은 어떻게 비교되는지 간단한 예로 확인해 보자.

위와 같이 유니티에 Create empty 메뉴로 개체를 만들면 GameObject라는 이름의 비어있는 개체가 만들어진다. 

 

Equality (같음) 이라는 스크립트를 아래와 같이 작성한다.

5번 줄~8번 줄까지 게임오브젝트 타입의 변수를 4개 만들었다.

변수명의 go는 game object (게임 오브젝트)의 첫글자를 따서 만든 것이다.

 

Start()메서드 안에서 12번 줄에 goTest라는 변수에 유니티에서 만들었던 GameObject 라는 이름을 가진 개체를 넣는다.(goTest변수의 초기화)

goTest 변수는 GameObject 타입이므로 참조 변수이다.

 

14번 줄:  go_1 변수에는 Instantiate메서드를 사용해서, 개체가 들어있는 변수(go_1)를 매개변수로 전달해서 인스턴스를 만들어서 넣는다.

 

15번 줄:  go_2 변수에도 go_1 변수와 마찬가지로 같은 변수를 전달해서 인스턴스를 만들어서 넣는다.

 

16번 줄: go_3 변수에는 goTest의 인스턴스가 들어있는 go_1변수를 저장한다.

 

이제 18, 20번 줄에서 go_1과 go_2가 서로 같은지, 그리고 go_3과 go_1이 서로 같은지 결과를 확인해보자.

 

스크립트를 저장한 후 스크립트를 MainCamera에 컴퍼넌트로 연결한다.

유니티를 실행하면 아래와 같은 결과를 확인할 수 있다.

즉, 위 코드에서 go_1과 go_2는 서로 다른 개체를 참고하고 있고 go_1과 go_3은 서로 같은 개체를 참고하고 있다.

go_1과 go_2는 같은 게임오브젝트로 인스턴스를 생성 했지만 인스턴스가 따로 만들어지므로 서로 다른 인스턴스를 참조하는 것이다.

유니티를 실행했을 때 계층구조에서 Clone(클론, 복제)이름이 붙은 인스턴스가 2개 생긴것을 확인할 수 있다.

 

이번에는 go_1과 go_2의 위치에 새 벡터3의 값을 같은 값으로 넣고 두 변수의 위치는 서로 같은 지 확인해보자.

실행하면 두 인스턴스의 position(위치) 값은 서로 같다(True)라는 결과를 볼 수 있다.

Vector3는 값 타입이므로 서로 값을 비교해서 같은 지, 다른 지 확인하기 때문이다.

 

비교에 사용하는 연산자는 == 외에도 != (같지 않다) , >(보다 크다) , < (보다 작다) , >= (크거나 같다), <= (작거나 같다) 등이 있지만 실제 코드에서 사용법을 알아보기로 하고 여기서는 설명을 생략한다.

 

끝.

Wraven...