부트캠프/본캠프

[내일배움캠프_2025JUL09] 알고리즘, TextRPG SceneManager 구현

Young_A 2025. 7. 9. 20:31

목차

    알고리즘, TextRPG SceneManager 구현

     

    오전에... 분명.. 계획에는... TextRPG를 하기로 했을 텐데..

    도저히 손이 가지 않아서, 알고리즘을 땡겨왔다.

    뇌 풀기에는 알고리즘이지!

    알고리즘 남은 강의를 다 듣고, 과제 중에 Easy인 것을 골라서 진행했다.

    다른 것들은 난이도가 Hard, Medium이더라.

    냅다 1번 문제에 Hard 라뇨... 

    2025.07.09 - [분류 전체보기] - [LeetCode] 733. Flood Fill (C#)

     

    [LeetCode] 733. Flood Fill (C#)

    LeetCode - Problems - Algorithms - 733. Flood FillProblem DescriptionYou are given an image represented by an m x n grid of integers image, where image[i][j] represents the pixel value of the image. You are also given three integers sr, sc, and color. Your

    j000.tistory.com


    캐시

    SceneManager를 싱글톤으로 구현해보고나니 다음과 같은 코드를 지속적으로 호출하게 되었다.

     SceneManager.Instance.SetScene(new StatusScene(_player));

    이 경우 계속해서 새로운 씬 오브젝트를 생성하기 때문에 성능 같은 부분에서 문제가 되진 않을까 걱정되었다.

    찾아보니 콘솔은 성능 저하가 될 만큼 영향이 크진 않음 + GC가 수거하러 다닐 것임 이라고 했다.

     

    하지만 배우는 입장이니 콘솔게임이라고, GC가 해줄 거라고 넘어가기보다 제대로 짚어보고 싶었다.

    클래스들을 static으로 선언하면 될 것 같았지만 되도록 static을 남발하고 싶지도 않았다.

     

    튜터님께 가서 조언을 구하니 캐싱 처리를 해주면 좋을 것 같다는 답변을 들었다.

     

    캐시는 자주 쓰는 데이터를 임시로 저장해서 빠르게 접근할 수 있게 하는 공간을 말한다.

    속도 향상을 위해 메모리, 디스크, 서버 등 다양한 위치에 저장한다.

     

    내 경우에는 자주 쓰는 씬들을 SceneManager에 저장해두는 것. 이게 캐싱인 것이다. 

    //SceneManger.cs
    public Dictionary<SceneType, SceneBase> _scenes = new Dictionary<SceneType, SceneBase>();
    
    public void SetScene(SceneType type)
    {
        if (_scenes.ContainsKey(type))
        {
            currentScene = _scenes[type];
            currentScene.LoadScene();
        }
        else
        {
            Console.WriteLine("씬 로드 실패");
            Console.WriteLine("아무키나 입력하면 시작으로 돌아갑니다.");
            Console.ReadKey();
            currentScene.LoadScene();
        }
    }

     

    위와 같이 키 값을 SceneType enum으로 관리하는 Dictionary를 생성해주었고, SetScene 메서드는 SceneType을 받는다.

    Dictionary에 존재하는 경우에는 타입에 맞는 씬을 로드하지만, 없다면 시작으로 돌아가게끔 에러 처리도 해주었다.

    이 에러 처리 이후로는 어디에서 씬이 실종되었는지 알기가 더 쉬워졌다.

     

    이렇게 바꾸고 나서 씬을 추가했는데 과정이 뭔가.. 편해졌다. 뭐지? 뭐라고 표현해야하지? ㅋㅋㅋ

    나중에 생각나서 수정함 => SceneManager 싱글톤을 포함해서 구조적으로 개선하면서 느낀점!

    • 머릿속에서 각 기능이 어디에 위치하는지 무엇을 고쳐야할지가 더 명확해진 것 같다.
    • 또한 어떤 곳에 무슨 작업을 해야할지, 그 영향이 어디까지 영향을 미치는지 같아서 마음에 든다.
    • 전에는 작업 시간이 전혀 감도 안왔는데, 얼마나 시간을 투자하게 될지 대략적으로 보이는 느낌이다.
      물론 아직 초보라서 원치 않는 에러가 발생하거나 공부해야할 부분이 무조건 생기겠지만!

    느낀점

    오늘은 TIL을 많이 작성하지 못했다.

    일단 오전에 알고리즘 강의를 전부 완강할 생각이 아니었는데 완강을 해버려서... (강의 진도 몇 등 같은 게 떠서.. 호승심이..)

    거기에, 코드를 SceneManager 싱글톤 구현을 해본다고 리팩토링을 했기 때문!

    그래도 휴식, 판매하기, 장착 개선 기능은 구현할 수 있었다.

     

    오늘 남는 시간에 Mermaid 차트들을 바뀐 사항들을 수정하려고 했었는데 안했다.

    시간이 없기도 했지만 개인 과제를 다 끝내고 나서 처음과 바뀐 부분을 리뷰해보면 좋을 것 같기 때문이다.

     

    튜터님께! 질문을! 하러 가봤다!

    질문을 조금 더 구체적으로 준비하고 갔어야 했는데 안하고 가는 바람에 어버버 물어보게 되었다. 튜터님이 뭐라고 안하셨는데 괜히 찔렸음...

    또 내일 하나 질문 할 것 찾아야 하는데 이 것도 일인 것 같다. 적당한 질문... 너무 어렵게 생각하는 것 같기도 하고.


    내일 학습 할 것은 무엇인지

    내일은 던전과 레벨업 기능을 추가한 뒤 저장하기 기능까지 완료할 생각이다.

    저장하기 기능을 구현하면서 큰 문제가 없다면, 게임 시작할 때 이름을 입력 받기만 하지 않고 이미 저장된 캐릭터(들)을 불러오는 옵션도 추가하면 좋을 것 같다.

     

    LINQ를 자주 쓰는 데! 조금 더 연습해보고 싶다.

    SQL이랑은 다른 문법이다보니까 헷갈리는 부분이 있는 것 같다.