Unity/C# 문법
[유니티 C#] 문법(관계연산자/논리연산자)
Skull Crusher
2021. 4. 21. 19:17
728x90
1. 관계 연산자
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*
* [관계 연산자]
* -> 두 개의 피연산자를 비교하여 크기가
* 크거나 작은지 또는 같은지(같지 않은지)를 비교 판단하는 연산자
*
* [종류]
* <, > : 크다, 작다
* >=, <= : 크거나 같다, 작거나 같다
* == : 같다
* != : 같지 않다
*
* [사용법]
*
* bool 변수명 = 변수또는값 (관계연산자) 변수또는값
*
* [특이사항]
* -> 관계 연산식이 실행한 후에는 반드시 bool 타입 (참/거짓) 값이 반환됨
* -> 관계 연산자는 주로 조건식을 만들 때 사용됨
*/
public class CSharpRelationalOperator : MonoBehaviour
{
public int leftVal;
public int rightVal;
// Start is called before the first frame update
void Start()
{
Debug.Log("leftVal : " + leftVal + ", rightVal : " + rightVal);
// >, < 예시
// bool 맞다/틀리다 = leftVal가 rightVal보다 크냐;
bool result = leftVal > rightVal;
Debug.Log("leftVal가 rightVal보다 크냐 ? " + result);
// >=, <= 예시
// bool 맞다/틀리다 = leftVal가 rightVal보다 작거나 같으냐;
result = leftVal <= rightVal;
Debug.Log("leftVal가 rightVal보다 작거나 같으냐 ? " + result);
// == 예시
// bool 맞다/틀리다 = leftVal가 rightVal랑 같으냐;
result = leftVal == rightVal;
Debug.Log("leftVal가 rightVal랑 같으냐 ? " + result);
// != 예시
// bool 맞다/틀리다 = leftVal가 rightVal랑 같지 않은가;
result = leftVal != rightVal;
Debug.Log("leftVal가 rightVal랑 같지 않은가 ? " + result);
}
// Update is called once per frame
void Update()
{
}
}
2. 랜덤값 추출
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*
* [랜덤값 추출]
*
* 1. int 랜덤값 추출
* -> int 랜덤값 = Random.Range(시작범위정수값, 끝범위정수값 + 1);
*
* 2. float 랜덤값 추출
* -> float 랜덤값 = Random.Range(시작범위실수값, 끝범위실수값);
*
*/
public class RandomTest : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
// 0 ~ 9까지의 랜덤한 정수값 추출
int randIntVal = Random.Range(0, 10);
Debug.Log("0 ~ 9까지의 랜덤한 정수값 추출 : " + randIntVal);
// 0 ~ 9까지의 랜덤한 정수값 추출
float randFloatVal = Random.Range(1.0f, 2.0f);
Debug.Log("1.0 ~ 2.0까지의 랜덤한 실수값 추출 : " + randFloatVal);
// 사용 예시
// 몬스터가 공격을 함 -> 랜덤 데미지 값 추출
// 몬스터가 50~100 사이에 랜덤 데미지로 공격을 수행함
int damage = Random.Range(50, 100);
Debug.Log("몬스터가 플레이어를 " + damage + " 데미지로 공격했습니다.");
// AI 플레이어가 이동할 방향을 지정했습니다.
int direction = Random.Range(0, 4); // 1:동, 2:서, 3:남, 4:북
Debug.Log("AI 플레이어를 " + direction + " 방향으로 이동합니다.");
}
// Update is called once per frame
void Update()
{
}
}
3. 삼항 연산자
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*
* [삼항 연산자]
* -> 조건식(관계연산식 또는 논리연산식)의 참거짓에 따라 특정 값을 반환하는 연산자
*
* [문법]
*
* 자료형 변수명(반환값) = (조건식) ? 참결과값 : 거짓결과값;
*
*/
public class RelationalQuiz : MonoBehaviour
{
// 클래스 영역안에는 실행 코드가 존재할 수 없음!!
// HP 체력 속성(Inspector View) 입력
public int hp;
// Start is called before the first frame update
void Start()
{
Debug.Log("몬스터가 플레이어를 공격합니다.");
// 몬스터의 데미지값 추출
int damage = Random.Range(10, 201);
Debug.Log("몬스터의 공격 데미지는 " + damage + "입니다.");
// 플레이어의 체력 감산
// hp = hp - damage;
hp -= damage;
// 데미지가 적용된 체력이 0보다 작으면
// 참결론 : 0 반환
// 거짓결론 : hp 반환
hp = (hp < 0) ? 0 : hp;
Debug.Log("데미지를 받은 플레이어의 체력이 " + hp + "입니다.");
/*
// 사망 조건의 판단(맞다/틀리다) 를 연산하는 관계 연산식
bool isDie = hp <= 0;
Debug.Log("플레이어는 사망한게 " + isDie + "입니다.");
// !(NOT) 연산자 : 특정 bool변수값이나 조건식(관계연산식)의 결과의
// 반대값을 추출할때 사용하는 연산자
bool isLife = !isDie;
Debug.Log("플레이어는 살아있는게 " + isLife + "입니다.");
*/
// [Quiz] hp의 값을 기준으로 아래 중에 하나의 문장을 출력해주세요.
// 힌트 : string 변수를 활용하세요.
// 문자열 연산 : string 문자열합변수 = "문자열1" + "문자열2"; ---> "문자열1문자열2"
// hp가 0보다 작을때 출력 문장 => 플레이어가 사망했습니다.
// hp가 0보다 클때 출력 문장 => 플레이어가 사망하지 않았습니다.
string dieMsg = (hp <= 0) ? "사망했" : "사망하지 않았";
Debug.Log("플레이어가 " + dieMsg + "습니다.");
}
// Update is called once per frame
void Update()
{
}
}
4. 논리 연산자
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*
* [논리 연산자]
* -> 이항 또는 단항 연산자로 피연산식들의 논리적인
* 판단의 유무가 합당한 지를 도출할 때 사용하는 연산자
*
* [종류]
* bool 연산결과변수(T/F) = (bool판단연산식) && (bool판단연산식) : AND 연산자
* -> 이항 연산자로 bool판단연산식의 결과가 모두 참일 때만 참의 결과를 반환하는 연산자
*
* F = F && F
* F = F && T
* F = T && F
* T = T && T (bool판단식 모두 참일 때만 참)
*
*
* bool 연산결과변수(T/F) = (bool판단연산식) || (bool판단연산식) : OR 연산자
* -> 이항 연산자로 bool판단연산식의 결과가 모두 거짓일 때만 거짓의 결과를 반환하는 연산자
*
* F = F || F (bool판단식 모두 거짓일 때만 거짓)
* T = F || T
* T = T || F
* T = T || T
*
*/
public class CSharpAndOrOperator : MonoBehaviour
{
public bool leftResult; // bool판단연산식결과 (피연산식결과)
public bool rightResult; // bool판단연산식결과 (피연산식결과)
// Start is called before the first frame update
void Start()
{
bool andOperation = leftResult && rightResult;
Debug.Log("leftResult와 rightResult의 AND 연산식의 결과 " + andOperation);
bool orOperation = leftResult || rightResult;
Debug.Log("leftResult와 rightResult의 OR 연산식의 결과 " + orOperation);
}
// Update is called once per frame
void Update()
{
}
}
5. 논리연산자 공식
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// [논리연산자 공식]
// AND 연산자(이항) : T = T && T 나머지는 F (AND는 참참참)
// OR 연산자(이항) : F = F || F 나머지는 T (OR은 거짓거짓거짓)
// NOT 연산자(단항) : T = !F (NOT은 반대)
public class CSharpLogicalOperator : MonoBehaviour
{
// 던전 공략에 필요한 장비별 레벨값
public int swordLevel; // 검 무기 레벨
public int shieldLevel; // 방패 방어구 레벨
public int armorLevel; // 갑옷 방어구 레벨
// Start is called before the first frame update
void Start()
{
// 던전을 공략하기 위한 파티 결성 조건에 따라 최종 판단값을 도출하시오.
// [] : 결과값, () : 조건식
// 1번째 던전 공략 조건
// (모든 장비의 레벨이 60레벨을 넘은) 사람만이 [파티의 리더]가 될 수 있음
// 모든 장비의 레벨이 60레벨은 넘은
// => 검 무기 레벨이 60을 넘음 (관계연산식) : swordLevel >= 60
// => 방패 방어구 레벨이 60을 넘음 (관계연산식) : shieldLevel >= 60
// => 갑옷 방어구 레벨이 60을 넘음 (관계연산식) : armorLevel >= 60
// 최종 결과 : 3가지 연산식의 결과가 모두 합당할때(참일때) => 리더다(참이다)
bool isPartyReader = (swordLevel >= 60) && (shieldLevel >= 60) && (armorLevel >= 60);
string resultMsg = (isPartyReader == true) ? "리더가 될 수 있습니다." : "리더가 될 수 없습니다.";
Debug.Log("플레이어는 던전 공략 파티의 " + resultMsg);
// 2번째 던전 공략 조건
// (장비 중에 하나의 장비 레벨이 60레벨을 넘은) 사람은 [파티 멤버]가 될 수 있음
// => 검 무기 레벨이 60을 넘음 (관계연산식) : swordLevel >= 60
// => 방패 방어구 레벨이 60을 넘음 (관계연산식) : shieldLevel >= 60
// => 갑옷 방어구 레벨이 60을 넘음 (관계연산식) : armorLevel >= 60
// 최종 결과 : 3가지 연산식의 결과 중 하나 이상이 합당할때(참일때) => 멤버다(참이다)
bool isPartyMmber = (swordLevel >= 60) || (shieldLevel >= 60) || (armorLevel >= 60);
resultMsg = (isPartyMmber == true) ? "멤버가 될 수 있습니다." : "멤버가 될 수 없습니다.";
Debug.Log("플레이어는 던전 공략 파티의 " + resultMsg);
// 3번째 던전 공략 조건
// (방어구 레벨이 60을 넘거나 무기의 레벨이 60을 넘은) 사람은 [파티 부리더]가 될 수 있음
bool isPartySecondReader = ((shieldLevel >= 60) && (armorLevel >= 60)) || (swordLevel >= 60);
resultMsg = (isPartySecondReader == true) ? "부리더가 될 수 있습니다." : "부리더가 될 수 없습니다.";
Debug.Log("플레이어는 던전 공략 파티의 " + resultMsg);
}
// Update is called once per frame
void Update()
{
}
}
6. 예시(통신사/쿠폰발송)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CSharpLogicalOperatorEx : MonoBehaviour
{
// 통신사가 SKT이고 등급이 골드면 피자 쿠폰이 발송됨
public string telecomCompany; // SKT, U+
public string levelType; // BRONZ, SILVER, GOLD, VIP
// Start is called before the first frame update
void Start()
{
bool result;
string resultMsg;
// 주석 한번에 설정하기 : Ctrl + K + C
// 설정한 주석 한번에 제거하기 : Ctrl + K + U
//int math = 70;
//int eng = 80;
//// (수학 점수가 70점 이상) (영어점수가 80이상)이면 "합격" 아니면 "불합격" 출력
//result = (math >= 70) && (eng >= 80); // 피자 쿠폰 발급 대상 판단 조건식
//resultMsg = (result == true) ? "합격" : "불합격";
//Debug.Log("수학점수 (" + math + "), 영어점수 (" + eng + ") => 판정 : " + resultMsg);
//-----------------------------------------------------------
result = (telecomCompany == "SKT") && (levelType == "GOLD"); // 피자 쿠폰 발급 대상 판단 조건식
resultMsg = (result == true) ? "맞습니다." : "아닙니다.";
Debug.Log("현재 고객님은 피자 쿠폰 발급 대상이 " + resultMsg); // 맞습니다. , 아닙니다.
// 통신사가 SKT가 아닌데 등급이 GOLD등급 이상이면 아이스크림 쿠폰이 발송됨
result = (telecomCompany != "SKT") && ((levelType == "GOLD") || (levelType == "VIP"));
resultMsg = (result == true) ? "맞습니다." : "아닙니다.";
Debug.Log("현재 고객님은 아이스크림 쿠폰 발급 대상이 " + resultMsg); // 맞습니다. , 아닙니다.
}
// Update is called once per frame
void Update()
{
}
}
7. 조건문
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*
* [조건문]
* -> 조건식(관계/논리 연산식)의 결과가 참(T) 일때
* 특정코드블럭(하나이상의 명령 블럭)을 실행 시키고 싶을 때 사용하는 문법 구문
*
* [문법]
*
* 1. if문
* -> 단일 조건문 : 하나의 조건이 참일 경우 특정 조건문의 코드를 실행함
*
* if (조건식결과(T/F)) {
* 특정코드블럭(n개);
* }
*
* 2. if문 (n개)
* -> 다중 조건문 : 하나 이상의 조건이 참일 경우 참 인 조건문의 코드들을 실행함
* (참조건이 여러개일 경우 여러개 의 조건문의 결과 코드가 실행될 수 있음)
*
* if (조건1) {
* 조건1이 참 일때 실행할 코드
* }
* if (조건2) {
* 조건2이 참 일때 실행할 코드
* }
* if (조건n) {
* 조건n이 참 일때 실행할 코드
* }
*
* 3. if .. else if (n개)
* -> 다중 조건문 : 하나 이상의 조건 중에 하나의 조건만이 참일 경우 해당 조건문의 코드를 실행함
*
* if (조건1) {
* 조건1이 참 일때 실행할 코드
* }
* else if (조건2) {
* 조건2이 참 일때 실행할 코드
* }
* else if (조건n) {
* 조건n이 참 일때 실행할 코드
* }
*
* 4. if/else if .. else
* -> else문은 모든 조건(2개 이상)이 거짓 일 경우 조건식 없이 코드를 실행하고 싶을 때 사용
*/
public class CSharpIFStatement : MonoBehaviour
{
public int hp;
// Start is called before the first frame update
void Start()
{
Debug.Log("몬스터가 플레이어를 공격합니다.");
// 몬스터의 데미지값 추출
int damage = Random.Range(10, 201);
Debug.Log("몬스터의 공격 데미지는 " + damage + "입니다.");
// 몬스터 데미지 범위에 따라 데미지 타입 종류를 출력해주십시오.
// 1. 크리티컬 데미지 : 150 이상
// 2. 임펙트 데미지 : 100 이상 (100 ~ 149)
// 3. 일반 데미지 : 50 이상 (50 ~ 99)
// 4. 데미지 미쓰 : 50 미만 (0 ~ 49)
string damageMsg = "";
if (damage >= 150)
{
damageMsg = "크리티컬 데미지";
}
else if (damage >= 100)
{
damageMsg = "임펙트 데미지";
}
else if (damage >= 50)
{
damageMsg = "일반 데미지";
}
//else if (damage < 50)
else // 모든 데미지가 아닐 경우 무조건 데미지 미쓰이므로 조건식을 표기할 필요가 없음
{
damageMsg = "데미지 미쓰";
}
Debug.Log("몬스터가 플레이어를 " + damageMsg + "로 피격했습니다.");
// 데미지가 너무 약해서 체력 감산을 수행하지 않습니다.
if (damage >= 50)
{
hp -= damage;
}
hp = (hp < 0) ? 0 : hp;
Debug.Log("데미지를 받은 플레이어의 체력이 " + hp + "입니다.");
//----------------------------------------------------------------------------
//string dieMsg = (hp <= 0) ? "사망했" : "사망하지 않았";
//Debug.Log("플레이어가 " + dieMsg + "습니다.");
//string itemDropMsg = (hp <= 0) ? "드랍했습니다." : "드랍하지 않았습니다.";
//Debug.Log("플레이어가 아이템을 " + itemDropMsg);
// [문제점]
// 1. 사망 메시지 출력과 드랍 메시지 출력은 같은 조건을 기준으로 실행됨
// 2. 사망하지 않았을때는 메시지 출력을 하지 않고 싶음
// (특정 조건식의 결과에 따라 실행을 하지 않고 싶을때)
// 체력이 0보다 작으면
if (hp <= 0)
{
Debug.Log("플레이어가 사망했습니다."); // 사망 메시지 출력
Debug.Log("플레이어가 아이템을 드랍했습니다."); // 아이템 드랍 메시지 출력
// ....
}
// 만약 플레이어가 사망하지 않았다면
// 스테이지 클리어 메시지를 출력함
//if (hp > 0) // 플레이가 사망한게 아니면 조건식이 필요가 없음
else
{
Debug.Log("플레이어가 스테이지를 클리어했습니다."); // 아이템 드랍 메시지 출력
}
//----------------------------------------------------------------------------
}
// Update is called once per frame
void Update()
{
}
}