업캐스팅?

인스턴스의 타입을 파생(자식) 클래스 타입에서

기본 클래스 타입으로 변환

 

다운 캐스팅?

인스턴스의 타입을 기본 클래스 타입에서

파생 클래스 타입으로 변환

 

업캐스팅은 암시적

https://www.youtube.com/watch?v=yVDljROH1Jg&list=PLTFRwWXfOIYBmr3fK17E0VhKPyYrGy75z&index=40
https://www.youtube.com/watch?v=yVDljROH1Jg&list=PLTFRwWXfOIYBmr3fK17E0VhKPyYrGy75z&index=40

 

다운캐스팅은 명시적

 

 

 

 

 

접근 가능한 맴버는 참조변수의 타입에 의해 결정됨

 

 

 

변환할 수 없는 경우 as 연산자가 null을 반환

캐스트 식과 달리 as 연산자는 예외를 throw하지 않는다.

 

as 연산자 변환 성공한 경우

 

as 연산자 변환 실패한 경우

 

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Step38
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //Marine marine = new Marine();
            //marine.Attack();
            //marine.StimPack();

            //업캐스팅(암시적)
            //TerranUnit unit = new Marine();
            //unit.Attack();
            //unit.StimPack(); //호출 불가

            //업캐스팅 (명시적)
            //TerranUnit unit = (TerranUnit)new TerranUnit();
            //unit.Attack();
            //unit.StimPack(); //호출불가

            //TerranUnit unit =  new Marine(); //암시적 업캐스팅
            //Marine marine = (Marine)unit; //다운 캐스팅은 명시적이어야함
            //marine변수의 값은 Marine의 인스턴스
            //marine.Attack();
            //marine.StimPack(); //호출 가능

            /*주의 사항*/
            //부모 클래스 인스턴스 생성 후
            //자식 클래스 타입으로 (다운캐스팅) 할수 없다.
            //Marine marine = (Marine)new TerranUnit();
            //marine.Attack();
            //marine.StimPack(); //호출가능

            //is 연산자를 사용해서
            //형식 변환이 가능한지 테스트 가능

            //TerranUnit unit = new TerranUnit();
            //bool canDownCast = unit is Marine;
            //Console.WriteLine(canDownCast); //False

            //Marine marine = new Marine();
            //bool canUpCast = marine is TerranUnit;
            //Console.WriteLine(canUpCast); // True
            //TerranUnit unit = marine; //암시적 업캐스팅

            
            //TerranUnit unit = new Marine(); //암시적 업캐스팅
            //bool canUpCast = unit is TerranUnit;
            //Console.WriteLine(canUpCast); //True
            //Marine marine = (Marine)unit; //명시적 다운캐스팅

            //as 연산자를 사용해 명시적으로 캐스팅 하기
            //Marine marine = new Marine();
            //TerranUnit unit = marine as TerranUnit;
            //Console.WriteLine(unit); //Step38.Marine => 성공

            TerranUnit unit = new TerranUnit();
            Marine marine = unit as Marine;
            Console.WriteLine("marine : {0}", marine); //marine : => 변환이 실패하면 결과값은 null
            //즉, 예외를 발생시키지 않는다.

        }
    }
}

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Step38
{
    internal class TerranUnit
    {
        public void Attack()
        {
            Console.WriteLine("공격합니다.");
        }
        //public TerranUnit() { }
    }
}

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Step38
{
    internal class Marine : TerranUnit
    {
        public void StimPack()
        {
            Console.WriteLine("스팀팩을 활성화합니다.");
        }
    }
}

'Study > C#' 카테고리의 다른 글

[C#] 구조체  (0) 2024.06.14
[C#] 생성자 연결  (0) 2024.06.12
[C#] virtual, override  (0) 2024.06.12
[C#] 상속  (1) 2024.06.03
[C#] static 한정자  (0) 2024.06.02

문?

프로그램이 수행하는 작업

(코드 한 줄이나 블록)

 

식?

연산자와 피연산로 이루어진 구문

 

부울 식?

부울 식(true, false)인 결과를 생성하도록 평가되는 표현식

 

선택 문?

하나 이상의 지정된 조건에 따라

코드의 다른 섹션으로 분기할 수 있다.

 

선택문의 종류 if, switch

 

if문?

부울 식의 값에 따란 실행할 문을 선택

 

 

부울 식이 거짓일 때

https://www.youtube.com/watch?v=zTfclU77eS4&list=PLTFRwWXfOIYBmr3fK17E0VhKPyYrGy75z&index=21

 

부울 식이 참일 때

https://www.youtube.com/watch?v=zTfclU77eS4&list=PLTFRwWXfOIYBmr3fK17E0VhKPyYrGy75z&index=21

 

else if문?

 

if문 뒤에 여러 개의

else if 문을 사용할 수 있다.(if조건이 false일때만 실행)

 

따라서 이 식에는 참인 else if문 만 실행된다.

 

https://www.youtube.com/watch?v=zTfclU77eS4&list=PLTFRwWXfOIYBmr3fK17E0VhKPyYrGy75z&index=21

 

else문?

if 문 또는 else if 문 뒤에만 올 수 있다.

 

if - else 문에서 한번만 실행

 

조건을 포함할 수 없으며 이전의 모든 조건이 false로 평가될 때 실행

 

https://www.youtube.com/watch?v=zTfclU77eS4&list=PLTFRwWXfOIYBmr3fK17E0VhKPyYrGy75z&index=21

 

 

'Study > C#' 카테고리의 다른 글

[C#] 반복문 for문  (0) 2024.05.27
[C#] 선택문 switch  (0) 2024.05.27
[C#] 논리 연산  (0) 2024.05.26
[C#] 비교 연산  (0) 2024.05.26
[C#] 산술 연산자  (0) 2024.05.26

bool : 논리형식

true 혹은 false값

 


char: 문자형식
'a'와 같이 작은 따옴표 안에 문자 하나의 값을 나타내는 형식

 


object : 오브젝트형식
아무거나 넣을수 수 있는 형식

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Step7
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //bool형식 변수 선언 및 할당
            bool isLucky = true;

            //변수에 값 할당
            isLucky = false;

            //출력
            Console.WriteLine(isLucky);
            //변수에 값을 넣으면 이전에 있던 값은 사라진다.

            //char형식 변수 선언
            char word;
            //값 할당
            word = 'a';

            //출력
            Console.WriteLine(word); // a

            //object형식 변수 선언
            object obj;
            //모든 값을 할당 가능
            obj = 100;      //정수 int
            obj = 12.3f;    //소수점 float
            obj = "홍길동";  //문자열 string
            obj = true;     //논리형식 bool
            obj = '김';     //문자형식 bool


            //출력
            Console.WriteLine(obj);
        }
    }
}

 

 

하나의 변수에 값을 여러개 넣으면 같은 위치에 덮여쓰여져서 마지막의 값이 출력된다.

 

'Study > C#' 카테고리의 다른 글

[C#] 오류와 디버깅  (0) 2024.05.24
[C#] 컴파일과 빌드  (0) 2024.05.24
[C#] 주석  (0) 2024.05.24
[C#] 변수와 값, 데이터 타입 (int, float, string)  (0) 2024.05.23
[C#] Start  (0) 2024.05.23

우선 한 버튼을 누를때마다 동작을 변화시킬 것이므로

캔버스에 빈 버튼안에 on, off로 나누었다.

텍스트는 보이지 않게 이미지를 껐다.

 

자리를 잘 잡아주어 이렇게 분류한다.

기본을 켜져있을 때로 주었고

눌렀을 때 !을 사용해서 서로의 이미지를 교차로 보일 수 있게 하였다.

using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using UnityEngine;
using UnityEngine.UI;

public class Switch : MonoBehaviour
{
    [SerializeField] private Button btnSwitch;
    [SerializeField] private GameObject btnOn;
    [SerializeField] private GameObject btnOff;
    private bool isOn = true;

    private void Start()
    {
        btnOn.SetActive(isOn);
        btnOff.SetActive(!isOn);
        
    }

    private void Update()
    {
        this.btnSwitch.onClick.AddListener(() => {
            OnOff();
        });
    }

    void OnOff()
    {
        isOn = !isOn;
        btnOn.SetActive(isOn);
        btnOff.SetActive(!isOn);
    }

}

https://docs.unity3d.com/ScriptReference/GameObject.SetActive.html

 

Unity - Scripting API: GameObject.SetActive

A GameObject may be inactive because a parent is not active. In that case, calling SetActive will not activate it, but only set the local state of the GameObject, which you can check using GameObject.activeSelf. Unity can then use this state when all paren

docs.unity3d.com

 

 

 

'낙서장 > UIUX' 카테고리의 다른 글

Skill Button  (0) 2024.03.18
Slider  (0) 2024.03.18
Button and Inputfield  (0) 2024.03.18

기존에 있는 에셋을 다운받아

가이드라인으로 잡고 명암을 줄이고

그 에셋을 찾아 UI를 본뜨는 작업을 하였는데

그것을 하기 전에 제일 기초이자 중요한 GameObject.onClick.AddListener()를 다루려 한다.

 

Button1을 클릭하면 콘솔에 찍힌다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Main : MonoBehaviour
{
    [SerializeField] private Button btn;

    void Start()
    {
        btn.onClick.AddListener(() =>
        {
            Debug.Log("button clicked!");
        });
    }
};

 

Button1을 클릭하면 2, 3번이 사라진다.

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Main : MonoBehaviour
{
    [SerializeField] private Button btn1;

    [SerializeField] private Button btn2;
    [SerializeField] private Button btn3;

    void Start()
    {
        btn1.onClick.AddListener(() => {
            this.btn2.gameObject.SetActive(false);
            this.btn3.gameObject.SetActive(false);
        });
    }
}

 

Button1을 클릭하면 2, 3이 사라지는데

Button2, Butto3을 배열(btns)로 만들어서 할당하였다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Main : MonoBehaviour
{
    [SerializeField] private Button btn1;

    [SerializeField] private Button[] btns;

    void Start()
    {
        btn1.onClick.AddListener(() => {

            for (int i = 0; i < this.btns.Length; i++)
            {
                Button btn = btns[i];
                btn.gameObject.SetActive(false);
            }
        });
    }
}

 

Button1, Button2를 btns(배열)에 할당하였고

Button3을 누를시 배열이 사라지고 Button4를 누를시 배열이 다시 생기게 작성

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Main : MonoBehaviour
{
    [SerializeField] private Button btn3;
    [SerializeField] private Button btn4;
    [SerializeField] private Button[] btns; //btn1, btn2

    void Start()
    {
        btn3.onClick.AddListener(() =>
        {
            Debug.Log("버튼3 눌렸습니다.");
            for (int i = 0; i < this.btns.Length; i++)
            {
                Button btn = btns[i];
                btn.gameObject.SetActive(false);
            }
        });

        btn4.onClick.AddListener(() =>
        {
            Debug.Log("버튼4 눌렸습니다.");
            for (int i = 0; i < this.btns.Length; i++)
            {
                Button btn = btns[i];
                btn.gameObject.SetActive(true);
            }
        });
    }
}

'산대특 > 게임 알고리즘' 카테고리의 다른 글

AppleCatch  (0) 2024.02.06
동기와 비동기  (1) 2024.02.05
직렬화와 역직렬화  (0) 2024.02.05
디자인 패턴과 싱글톤 패턴  (0) 2024.02.05
Process 와 Thread 그리고 Thread 와 Coroutine  (1) 2024.02.04

+ Recent posts