using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.U2D;

public class AtlasManager : MonoBehaviour
{
    public static AtlasManager instance;
    public SpriteAtlas blockAtlas;
    //싱글톤
    private void Awake()
    {
        //AtlasManager 클래스의 인스턴스를 instance에 할당
        instance = this;
    }
}

 

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

public class Block : MonoBehaviour
{
    public enum BlockType
    {
        Blue, Gray, Green, Pink, Yellow
    }

    public BlockType blockType;
    public SpriteRenderer spriteRenderer;
    public void Init(BlockType blockType)
    {
        this.blockType = blockType;
        //이미지 변경 
        ChangeSprite(blockType);
    }

    public void ChangeSprite(BlockType blockType)
    {
        //블록의 이름을 넣어서 아틀라스에서 같은 이름인 sprite를 찾고 할당
        Sprite sp =
            AtlasManager.instance.blockAtlas.GetSprite(blockType.ToString());
        spriteRenderer.sprite = sp;
    }

    public void SetPosition(int x)
    {
        Vector2 pos = transform.position;
        pos.x = x;
        transform.position = pos;
    }
}

 

using System.Collections;
using System.Collections.Generic;
using System.Text;
using Unity.VisualScripting;
using UnityEngine;

public class Test : MonoBehaviour
{
    private Block[] board; //1차원 배열이 Block들을 관리
    public GameObject blockPrefab;
    void Start()
    {
        CreateBoard();
        PrintBoard();
    }

    private void CreateBoard()
    {
        //크기가 9인 BlockType의 1차원 배열 만들기
        board = new Block[9];
        //배열의 요소에 넣기(0~8까지의 랜덤한 값을 BlockType으로 바꿔서)
        for (int i = 0; i < board.Length; i++)
        {
            Block.BlockType blockType = (Block.BlockType)Random.Range(0, 5);

            //블록 프리팹 인스턴스를 생성
            GameObject blockGo = Instantiate(blockPrefab);
            //생성된 프리팹을 블록클래스의 블록에 할당
            Block block = blockGo.GetComponent<Block>();
            block.Init(blockType);
            block.SetPosition(i);
        }
    }

    private void PrintBoard()
    {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < board.Length; i++)
        {
            sb.Append($"{board[i]}");
        }
        Debug.Log(sb);
    }
}

 

https://learn.microsoft.com/ko-kr/dotnet/api/system.text.stringbuilder?view=net-8.0

 

StringBuilder 클래스 (System.Text)

변경할 수 있는 문자열을 나타냅니다. 이 클래스는 상속될 수 없습니다.

learn.microsoft.com

 

 

 

구조체 형식?

사용자 정의 형식

 

데이터와 관련 기능을 캡슐화할 수 있는 값 형식

 

동작을 거의 제공하지 않거나 작은 데이터 중심 형식을 설계하는데 사용 권장

 

struct 키워드를 사용하여 정의

 

https://www.youtube.com/watch?v=zL5rb-Q5WzE&list=PLTFRwWXfOIYBmr3fK17E0VhKPyYrGy75z&index=41

 

 

 

 

인스턴스는 new 키워드사용

모든 구조체 형식은 하나 이상의 생성자를 갖는다.

 

 

 

※클래스와 다른점

1. 값형식

2. 상속 불가능

 

매개변수 없는 생성자를 포함 불가

 

맴버 메서드에 virtual, protected 사용 불가

 

유형의 인스턴스가 작고 일반적으로 수명이 짧거나 다른 개체에 포함되는 경우

클래스 대신 구조체를 사용하는 것을 고려

 

다른 모든 경우는 클래스를 사용하자

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

namespace Stet39
{
 
    internal class Program
    {
        static void Main(string[] args)
        {
            //Position pos = new Position(1,1);
            //Position pos = new Position();
            //Position pos;
            //pos.x = 1;
            //pos.y = 1;
            //Console.WriteLine(pos);
            //Position pos = new Position(1,1);
            //pos.SetOrigin();
            //Console.WriteLine("{0}, {1}", pos.x, pos.y);

            Marine marine = new Marine(new Position(1,1));
            Console.WriteLine("마린의 현재 위치 : {0}, {1}", marine.position.x, marine.position.y); ;

            marine.Move(new Position(2, 3));
            Position pos = marine.GetPostion();
            Console.WriteLine("마린의 현재 위치 : {0}, {1}", pos.x, pos.y);

        }
    }
}

 

 

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

namespace Stet39
{
    struct Position
    {
        public int x;
        public int y;

        public Position(int x, int y)//매개 변수 없는 생성자 사용불가
        {
            this.x = x;
            this.y = y;
        }

        public void SetOrigin()
        {
            this.x = 0;
            this.y = 0;
        }
    }
}

 

 

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

namespace Stet39
{
    internal class Marine
    {
        public Position position;
        public Marine(Position position)
        {
            this.position = position;
        }
        public void Move(Position targetPosition)
        {
            Console.WriteLine("{0}, {1}로 이동합니다", targetPosition.x, targetPosition.y);
            this.position = targetPosition;
        }

        public Position GetPostion()
        {
            return this.position;
        }
    }
}

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

[C#] 업캐스팅, 다운캐스팅  (0) 2024.06.13
[C#] 생성자 연결  (0) 2024.06.12
[C#] virtual, override  (0) 2024.06.12
[C#] 상속  (1) 2024.06.03
[C#] static 한정자  (0) 2024.06.02

업캐스팅?

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

기본 클래스 타입으로 변환

 

다운 캐스팅?

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

파생 클래스 타입으로 변환

 

업캐스팅은 암시적

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

+ Recent posts