ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C# / 싱글톤패턴 / 1일1코드
    C#/1일 1코드 2020. 5. 15. 23:02

     코드는 아닌거 같지만 매번 적으면서 술술 되는게 아니라 꼭 한번씩 보면서 적어야해서 익숙해지면 좋겠다 싶어서 그간 쓰던 DataManager 형식으로 한번 써봄. 

     코드는 아닌데 해도 될까 싶지만 노트에 썼던거 참고하고, 조금의 블로그 포스팅 참고하면서 주석 달면서 쭉 기재했는데 맞는지 아닌지는 모르겠다.

     내가 쓰는거에 대해 확신이 서지 않는건 문제인듯. 

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    using System.Collections;
    using System.Collections.Generic;
    using System.Runtime.CompilerServices;
    using UnityEngine;
    using Newtonsoft.Json;
    using System.Linq;
     
    //우선 싱글톤의 정의 
    //해당 클래스의 인스턴스가 하나만 생성이 되게하여 같은 인스턴트를 계속 참조하면서 객체 생성횟수를 줄이고
    //어디서든지 그 인스턴스에 접근이 가능하도록 만드는 패턴
    //간단하게 외부에서는 못건들게 함이라고 써도 될듯 
     
    // 유니티에서 사용할때는 상속 지우고 작성하기 
    public class DataManager 
    {
        private static DataManager Instance;
        private Dictionary<int, CharacterData> dicCharacterDatas;
     
        private DataManager()
        {
            //관리할 데이터 및 Instance 선언↑ 후 초기화
            this.dicCharacterDatas = new Dictionary<int, CharacterData>();
            // Dictionary 사용이유 > 컬렉션중 검색(탐색능력)이 제일 빠름 
            // Key를 넣으면 Value 값들이 도출됨. 
        }
     
        public static DataManager GetInstance()
        {
            if(DataManager.Instance == null)
            {
                DataManager.Instance = new DataManager();   
     return DataManager.Instance; 
            }
            return DataManager.Instance;
            // 간단히 보면 인스턴스가 null이면 새로 만들고 아니면 기존거 반환해준단거 
        }
        public void LoadDatas()
        {
            string json = File.ReadAllText("./data/character.json");
            TextAsset charaTextAsset = Resources.Load("Data/character_data"as TextAsset;
            // 경로를 다 적지 않더라도 해당 프로젝트의 bin/Debug 경로에 있는 파일을 읽어옴 
            // C# >> 폴더가 추가됬다면 "./폴더명/파일명.확장자" 까지 적을 것
            // Unity >> 경로 없이 적으면 Resources에 있는걸 읽기에 적는 방식은 동일하나 확장자까지 적지 않아도 됨 
            // json 파일을 사용할때는 using Newtonsoft.Json; 을 사용 할수있도록 
            // Import하던가 C#은 솔루션용 NuGEt패키지 관리에서 json 다운 받기 
     
            string path = charaTextAsset.text;
            //string 으로 맞춰줌, 그냥 C#의 경우 json 넣으면 됨 
     
            this.dicCharacterDatas = JsonConvert.DeserializeObject<CharacterData[]>(path).ToDictionary(x => x.id, x => x);
            //JsonConvet를 통해 역직렬화, 바로 Dictionary로 담아내는 코드 
            //역직렬화 : 직렬화된 파일 등을 역으로 직렬화하여 다시 객채 형태로 만드는 것.
        }
     
        public CharacterData GetCharacterDatasById(int id)
        {
            return this.dicCharacterDatas[id];
            //id를 통해 해당 id에 해당하는 데이터를 얻음 
        }
    }
     
    cs

     

     

     

Designed by Tistory.