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()
    {
        
    }
}