ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C# 10/17 - 스택(Stack)과 제네릭(Generic)
    TIL 2023. 10. 17. 22:41
    반응형

    Stack이란?

    말 그대로 데이터를 쌓으며(push),

    pop(데이터를 가져올 시)

    마지막으로 저장한 정보가 우선적으로 반환된다.


    push(10)
    push(20)
    push(30)

    하고

    pop 했다면 마지막으로 저장한 정보인 30부터 나온다.
    pop은 순서를 정할 수 없다.


    구조

    public class TempStack
    {
     private int[] arr;
     private int index;

     //배열은 사이즈가 존재해야함
     public int Size;
     
     public TempStack(int size)
     {
      Size = size;
      arr = new int[size];
      //데이터를 추가하려면 인덱스를 +1해줘야함(Stack을 구현하기 위해)
      index = -1;
     }

      //추가
      public void Push(int data)
      {
      //추가하는 데이터가 배열 길이(size)를 넘어가는 경우의 예외처리
      if(Size - 1 == index)
      {
        throw new Exception("Stack overflow");
      }
     
       arr[++index] = data;
      }
      //추출
      public int Pop()
      {
       if(IsEmpty())
        {
        throw new Exception("Stack is Empty"); //에러 메시지 출력(디버그랑 유사한 역할)
        }
       //마지막에 추가된 데이터를 pop(반환) 후 마지막 데이터 삭제(--연산자가 뒤)
       return arr[index--];   
      }
      //체크
      public int Peak()
      {
       if(IsEmpty())
        {
        throw new Exception("Stack is Empty"); //에러 메시지 출력(디버그랑 유사한 역할)
        }

       //마지막으로 추가된 데이터를 반환하지만 데이터는 삭제되지 않음
       //또한 인덱스 순서또한 변하지 않음
       return arr[index];   
      }
      //해당 스택이 비어있는지 체크(에러 방지를 위해)
      public bool IsEmpty()
      {   
       return index == -1;
      }
    }

    ㅡㅡ

    사용(다른 스크립트)

    void Start()
    {
      //데이터 추가
      TempStack stack = new TempStack(5);
      stack.Push(10);
      stack.Push(20);
      stack.Push(30);

      //데이터 추출
      int data1 = stack.Pop();
      Debug.Log(data1);
      int data2 = stack.Pop();
      Debug.Log(data2);
      int data3 = stack.Pop();
      Debug.Log(data3);
    }



    +
    문자 형태의 스택이 필요한 경우?
    위의 구조에서 그대로 추가하려
    타입을 지정하는 자료형을 바꾸어 주면서 새로 다 적어야 하는데

    이런 경우를 위해 Generic이 존재한다.

    이를 위해 스택.cs에선

    public class MyStack<T>
    로 선언하고

    타입을 지정하는 자료형 자리에 T를 넣고
    return에는 default(T) 를 반환하도록 한다.



    사용 시에는


    MyStack<int> stack = new MySTack<int>(5);


    MyStack<string> stack = new MyStack<string>(3);

    위와같이 생성 후 동일하게 사용하면 된다.





    +
    그래서 이걸 어디다 쓰냐?

    이전 동작으로 돌아가는 기능 (Undo)
    를 만들기 위해서 사용한다.

    예를들어

    안녕하세요 라는 채팅을 쳤을 때,
    지운다면 요 세 하... 순서로 제거될것이다.


    예를들어2

    아이템과 여러 상호작용을 한다고 하였을 때,
    팝업이 여러개 발생할 것이다.

    아이템 선택 - 제작 - 확인창 << 이런 식으로

    만약 여기서 확인창이 닫혀버린 경우
    창이 전부 사라지는건 뭔가 어색할 수 있다.
    이런 경우에 이전 상태(제작창) 으로 돌아가기 위해
    스택 구조를 사용하게 될 수 있다.






    반응형
Designed by Tistory.