부트캠프/본캠프

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

Young_A 2025. 7. 8. 20:24

목차

    알고리즘, TextRPG 구현

     

     

    2025.07.08 - [분류 전체보기] - 알고리즘

     

    알고리즘

    알고리즘문제를 해결하기 위한 단계적 절차.입력 > 명확한 단계 > 출력 구조를 가지며 어떤 입력이 주어져도 정확하고 예측 가능한 결과를 도출해야 한다.Big O 표기법Big O는 알고리즘의 성능(시

    j000.tistory.com

    퀵정렬 듣자마자 ?????? 상태가 되...

    TextRPG 하다가 뇌 전환 용으로 들었는데 전환은 커녕 ?????가 되...


    JSON

    아이템 리스트를 나중에 어차피 json으로 관리하게 될 것 같은데, 나중에 지우는 것도 일이 되는 하드코딩을 하기 귀찮아서..

    그냥 처음부터 json을 사용하기로 했다.

    JSON 라이브러리 추가하기

    Tools - Nuget Package Manager - Manage Nuget Packages for Solution

    Installed 탭이 기본으로 열릴텐데, Browse 탭으로 이동해서 json 검색 후 Newtonsoft_json을 원하는 프로젝트에 설치해준다.

    원한다면 같은 방법으로 언인스톨도 가능하다.

    using Newtonsoft.Json;
    using Newtonsoft.Json.Linq;

    JSON 파일 생성

    string path = "D:\\CampWorkspace\\Week2TextRPG\\Week2TextRPG";
    
    // 파일 생성 후 쓰기
    File.WriteAllText(path + @"\\allItems.json", JsonConvert.SerializeObject(allItems));

    JSON 파일 생성할때 프로퍼티 접근

    JSON 파일에 Item 리스트를 넣는데 enhancement와 equipslot이 빠진채로 저장이 되길래 확인해보니 getter와 setter가 없어서 발생한 문제.

    Item class에서 둘을 다음과 같이 변경함.

    public Dictionary<Ability, int> Enhancement => enhancement;
    public EquipSlot EquipSlot => equipSlot;

    static 오브젝트 내부 컬렉션 접근 및 조작

    Store는 리스트는 그대로 가지고 있고 리스트에 포함된 컬렉션 내부의 아이템 또한 변경될 가능성이 아직까지는 없어서 static으로 선언해주었다.

    하지만 어떻게 확장될지 몰라서 이럴 경우 클래스 내부의 컬렉션을 manipulate 할 수 있는지 찾아봤다.

    store에 다른 store를 재할당하는 것은 static이므로 당연히 불가능하다.

    하지만 Store라는 클래스가 readonly가 아니라면, Store 내부에 있는 List<item>에 접근하여 Add() Remove() 등의 manipulation이 가능하다.

    static public Store store = new Store();

    클래스 내부 id 자동 설정

    id는 DB에서 중복 처리를 하기 위해 자주 사용되는 고유 식별자이다.

    똑같은 id 값의 아이템이 생성되는 것을 방지하기 위해 클래스 내부에 static 으로 nextId 값을 생성한다.

    이후 생성자 내부에서 id에 nextId++을 대입해주면, 다음에 새로 생성되는 오브젝트는 1이 아닌 2가 대입된다.

    private static int nextId = 1;
    
    //생성자 내부
    id = nextId++;

    override string ToString()

    맨날 void ToString()으로 잘 못 써서!! 까먹지 말라고 다시 정리한다.

    int.ToString() 처럼 쓸 수 있는 것처럼, 새로 생성하는 클래스들 또한 ToString() 기능을 override해서 쓸 수 있다.

    Item 같이 출력을 자주 하는 경우, ToString()으로 string 값을 반환 해주면 받아서 사용할 수 있다.

    override 잘 몰랐을 때 void ToString() 같이 야매로 쓰던 버릇이... 고친 줄 알았는데 오랜만에 코딩하니까 다시 나오네. 

    //Item class
    public override string ToString()
    {
        string display = "";
    
        display += isEquipped ? $"[E]{name}\t|" : $"{name}\t|";
        foreach (KeyValuePair<Ability, int> ability in enhancement)
        {
            display += ability.Key + " +" + ability.Value + "\t|";
        }
        display += description + "\t|";
        display += price + " G\t|\n";
    
        return display;
    }
    
    //Console. 메서드 사용 시 ToString() 생략 가능.
    Console.WriteLine(item)

    C# 싱글톤

    아무래도 SceneManager를 싱글톤으로 구현하는 게 나을 것 같다는 생각이 들어서 시도 중이다.

    아직 구현은 아니고, 오늘 내로 못할 것 같아서 일단은 오늘 조사한 것들 먼저 정리해봄.

     

    싱글톤 패턴의 핵심은 씬 내에서 단 하나만 존재하도록 하는 것.

    C#의 경우

    static 선언, read only, 중복 방지를 하게 되면 싱글톤 패턴의 완성이다.

     

    그러나 Unity에서는 그걸로는 부족하다. 이유는 아래 링크로. 아래 코드도 여기서 참고했다.

     

    싱글톤(Singleton) 패턴

    싱글톤 패턴이란?싱글톤 패턴: 특정 클래스의 인스턴스가 단 하나만 생성되는 것을 보장하는 디자인 패턴 Player 및 Monster 같은 경우 여러 개의 인스턴스가 존재할 수 있으니 싱글톤의 대상이 아

    gus6615.tistory.com

    internal class SceneManager
    {
        private SceneManager() { }	//생성자 접근 불가로 인스턴스 생성 X
    
        private static SceneManager instance;	//static으로 자기 자신 생성.
    
        public static SceneManager Instance
        {	//유일하게 접근 가능한 항목. getter만 존재하고, 이 또한 중복 생성을 방지
            get
            {
                if (instance == null)
                {
                    instance = new SceneManager();
                }
                return instance;
            }
        }
    }

    느낀점

    슬랙에 올라온 다들 어떻게 하시냐는 질문 및 공유 글 을 봤다...

    나는 일단 메서드로 씬 전환 진행하다가 나중에 구현 된 거 보고 클래스로 뺄까 생각했는데... 

    다들 이미 구조 잡아서 진행하고 계셨다.... 격이 다르구만...

    저런 분들이랑 같이 팀 되면 배울 게 많겠구나라는 생각이 들었다.

     

    필수 기능 구현은 마쳤고, 도전 기능도 내일이면 끝낼 수 있을 것 같다! SceneManager 싱글톤 구현을 추가할건데 되려나..?

    처음 시작할 때는 엄청난 퀄리티의 팀 프로젝트를 완성해야지! 라는 생각이었는데, 생각해보니 팀 프로젝트는 팀원들 모두 개인 과제를 완성한 이후에 시작하게 될 테니 조금 덜어내기로 했다.

     

    오늘부터는 프로그래머스를 풀어볼까한다!

    예전에 LeetCode 알고리즘을 풀기도 했었는데, 한국은 프로그래머스가 대체적으로 사용되는 알고리즘 커뮤니티인 것 같다.

    언뜻 들어보니까 점수 제도 같은 것도 있나 보더라고. 가보자고.

     

    2025.07.08 - [Problem solving/Algorithms] - [프로그래머스]약수의 합

     

    [프로그래머스]약수의 합

    프로그래머스 - 약수의 합 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.krProblem Description정수 n을 입력받아 n의 약수를 모두 더한

    j000.tistory.com

    TIL 다 작성하고 나서 시간 남길래 급하게 풀고 업데이트!

    쉬운 거 풀고 나니까 뇌가 릴렉스 되는 느낌이다...


    내일 학습 할 것은 무엇인지

    SceneManager 구현을 위주로 진행할 예정이다.

    휴식 기능, 판매 기능, 장착 개선 등의 도전 기능을 진행해보고,

    진행하다가 질문할 게 생기든 안 생기든 일단 튜터님을 찾아가서 리뷰라도 봐 달라고 할 생각이다.