내일배움캠프 3주차 5일차 TIL - JSON

백흰범·2024년 5월 3일
0

오늘 한 일

  • 팀 프로젝트 진행하기 ( 전투 중 아이템 사용, 스킬 추가, 던전 보상 추가, 스킬 세이브 업데이트 )

게임 데이터 저장하기

기본적인 폴더 관리법

파일 가져오기

  • 앱의 현재 작업 디렉터리 가져오기
Directory.GetCurrentDirectory() //type은 string이다.

경로 결합

  • 여러 문자열을 한 경로로 결합
directoryPath = Path.Combine(directoryPath, "Rtan");

지정된 경로에 폴더가 있는지 확인

  • 지정된 경로가 디스크에 있는 기존 디렉터리를 참조하는지를 확인
Directory.Exists(directoryPath)	// 존재하면 true, 없거나 오류 발생 시 false를 반환한다.

// 활용 예시
     if (Directory.Exists(directoryPath))
     {
         Console.WriteLine("해당 폴더가 존재합니다!");
     }
     else
     {
         Console.WriteLine("해당 폴더가 없습니다!");
     }
  • 파일로는 File.Exists가 있다.

  • 사실 범용성으로 따지면 Path.Exists가 더 좋다. (폴더와 파일까지 확인한다.)

폴더 만들기

  • 지정된 경로에 모든 디렉터리를 만듭니다.
Directory.CreateDirectory(directoryPath);

폴더 삭제하기

  • 지정한 디렉터리와 선택적으로 하위 디렉터리를 삭제합니다.
Directory.Delete(directoryPath);	// 지정된 경로에서 빈 폴더 삭제
Directory.Delete(directoryPath, true); // 지정된 경로에서 해당 폴더와 해당 폴더의 하위 폴더 및 파일 삭제

주의할 점

  • 폴더 내에 비어있지 않다면 꼭 true 매개변수도 추가적으로 넣어줘야한다.
  • 백신이나 권한이 없을 경우 막힐 수도 있으니 이를 해결해줘야 삭제가 정상적으로 진행된다. (혹시 모르니 try catch 코드를 해두는 것도 좋다.)

JSON 형태로 저장 및 불러오기

! 그 전에

using Newtonsoft.Json;  

위 네임 스페이스는 패키지 관리자 콘솔에서 설치해줘야한다.
Install-Package Newtonsoft.Json

  • 기본 프로젝트 설정을 해뒀는지 잘 보고 설치해주면 된다.

오브젝트를 JSON으로 직렬화

  • 형식 지정을 사용하여 지정된 객체를 JSON 문자열로 직렬화
string json = JsonConvert.SerializeObject(targetObject, Newtonsoft.Json.Formatting.Indented);
// JsonConvert.SerializeObject(대상오브젝트, 서식지정);

// 서식 지정
// - Newtonsoft.Json.Formatting.Indented (들여 쓰기)
  • 사용 예시

string filePath = Path.Combine(directoryPath, $"{filename}.json"); // 경로와 파일 이름 합치기
string json = JsonConvert.SerializeObject(targetObject, Newtonsoft.Json.Formatting.Indented);
File.WriteAllText(filePath, json);

텍스트 쓰고 저장하기

  • 새 파일을 만들고 파일에 내용을 쓴 다음 파일을 닫습니다.
    대상 파일이 이미 있는 경우 덮어씁니다.
File.WriteAllText(filePath, json);
// File.WriteAllText(string 경로, string 파일이름.파일타입)
// 오버로드
File.WriteAllText(string 경로, string 파일이름.파일타입, Encoding)

  • JSON 형태로 저장된 클래스

// 사용된 클래스
 class Character
 {
     public string Name;
     public int Hp;
     public int Atk;
     public int Def;
     public int Gold;

     public Character(string _name, int _hp, int _atk, int _def, int _gold)
     {
         Name = _name;
         Hp = _hp;
         Atk = _atk;
         Def = _def;
         Gold = _gold;
     }
 }
// 인스턴스 생성 
Character character = new Character("르탄", 100, 10, 5, 1000);

// 파일 경로 만들고, json 형변환 이후, 파일 쓰기
  string characterPath = Path.Combine(directoryPath, "Character.json");
  string json = JsonConvert.SerializeObject(character, Formatting.Indented);
  File.WriteAllText(characterPath, json);
  • 저장이 성공적으로 되어있다.

JSON을 오브젝트로 역직렬화

  • JSON에서 지정된 .NET 유형으로 역직렬화
objectVariableName = JsonConvert.DeserializeObject<T>(json);
  • 사용 예시

string filePath = Path.Combine(directoryPath, $"{filename}.json");
string json = File.ReadAllText(filePath);
objectVariableName = JsonConvert.DeserializeObject<T>(json);

텍스트 읽고 할당하기

  • 텍스트 파일을 열고, 파일의 모든 텍스트를 문자열로 읽어 들인 다음에 파일을 닫습니다.
string json = File.ReadAllText(filePath);
// File.ReadAllText(string 경로, string 파일이름.파일타입)
// 오버로드
File.ReadAllText(string 경로, string 파일이름.파일타입, Encoding)

  • JSON 형태의 파일을 읽고 할당해보기

// Character 클래스 내에 있는 소개 메서드
public void ShowStatus()
{
    Console.WriteLine($"제 이름은 {Name}입니다.");
    Console.WriteLine($"{Hp}의 체력과 {Atk}의 공격력, {Def}의 방어력을 가지고 있습니다.");
    Console.WriteLine($"현재 소지액은 {Gold}입니다.");
}

// Main.cs 일부분
   Character character;

   Console.WriteLine();
   string characterPath = Path.Combine(directoryPath, "Character.json");
   if (Path.Exists(characterPath))  // 해당 파일, 폴더가 존재하는지 확인
   {
       Console.WriteLine("캐릭터 파일이 존재하는 것이 확인되어 불러오겠습니다!");
       string json = File.ReadAllText(characterPath); // 읽고 할당
       character = JsonConvert.DeserializeObject<Character>(json); //json을 역직렬화하여 character에 할당
   }
   else
   {
       Console.WriteLine("캐릭터 파일이 존재하지 않으므로 새 캐릭터 파일을 만들겠습니다.");
       Console.WriteLine();
       character = new Character("르탄", 100, 10, 5, 1000);
       string json = JsonConvert.SerializeObject(character, Formatting.Indented);
       File.WriteAllText(characterPath, json);
       Console.WriteLine("새 캐릭터 파일이 생성되었습니다!");
   }

   Console.WriteLine();
   character.ShowStatus();	// 캐릭터 스텟 소개하기
  • 잘 나온 모습이다.


그 외에 알게된 점들

Json 사용 시 주의할 점

  • 클래스의 필드(변수)들은 저장되는 반면에 메소드는 저장이 안된다.
  • 다시 삭제하고 저장을 시도해봣는데 위와 같이 클래스의 필드들만 저장되어있다.
    (일부 복잡한 자료 구조는 직렬화할 때 문제가 발생할 수도 있다.)

DirectoryInfo 클래스

  • 폴더 및 하위 폴더를 만들고, 이동하고, 열거하는 인스턴스 메서드를 노출합니다.
  • 폴더 관련 메서드를 더 다양하게 보고 싶다면 이 클래스를 사용해라.



TIL을 작성하면서 느낀점

기본기를 다지고 난 다음에 아무래도 배우게 되는 것은 내가 게임에서 사용하게 될 코드들을 배우는 단계인 것 같다. 물론 알고리즘 공부나 디자인 패턴, CS 공부와 같이 나의 개발력을 좀 더 끌어올릴 수 있는 학습들도 존재하지만, 일단 게임을 한번 만들어보고 나의 능력에 대한 부족함과 학습의 필요성을 끌어올려주는 것이 지속적인 학습에 도움이 되는 순서라고 생각한다.

profile
게임 개발 꿈나무

0개의 댓글