오늘 한 일
- 팀 프로젝트 진행하기 ( 전투 중 아이템 사용, 스킬 추가, 던전 보상 추가, 스킬 세이브 업데이트 )
파일 가져오기
- 앱의 현재 작업 디렉터리 가져오기
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 코드를 해두는 것도 좋다.)
! 그 전에
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 클래스
- 폴더 및 하위 폴더를 만들고, 이동하고, 열거하는 인스턴스 메서드를 노출합니다.
- 폴더 관련 메서드를 더 다양하게 보고 싶다면 이 클래스를 사용해라.
기본기를 다지고 난 다음에 아무래도 배우게 되는 것은 내가 게임에서 사용하게 될 코드들을 배우는 단계인 것 같다. 물론 알고리즘 공부나 디자인 패턴, CS 공부와 같이 나의 개발력을 좀 더 끌어올릴 수 있는 학습들도 존재하지만, 일단 게임을 한번 만들어보고 나의 능력에 대한 부족함과 학습의 필요성을 끌어올려주는 것이 지속적인 학습에 도움이 되는 순서라고 생각한다.