목차
화살표 선택 메뉴 틀 구현, 개발 가이드라인 문서 작성, 패턴 매칭 (Pattern Matching)
새벽 3시에 깨서 잠 못자고 수영 다녀와서 그런지
아침 수영 진짜 너무 힘들었음..🤦♀️
C# 배치고사를 봤다.
10문제인데 9문제는 그냥 풀 수 있었고, 마지막 한 문제가 조금 까다로웠다.
기본제공함수가 있는데기본 제공 함수를 쓰지 말고 구현하라고 하셨슴.... 물론 의도는 알겠습니다만...
알고리즘 문제를 찾아서 풀어야하는 이유가 생겼다.
화살표 선택 메뉴
기존에 팀원분이 작성하신 페이지 네비게이션은 아이템 클래스 전용으로 작성되어 있어서, 모든 타입의 리스트들을 대상으로 할 순 없을까 하여 제작하게 되었다.
리팩토링의 개념으로 시작했으나, 하다보니까 그냥 다시 만들게 되었다... 그치만 힌트는 잘 줏어먹었다. 냠.
아래와 같이 완성했다.
팀원들이 이해할 수 있도록, 내가 테스트하면서 썼던 코드를 주석처리하여 사용예제로 남겨두었다.
리스트에서 화살표로 선택 후 Enter로 확정하는 방식이고, Esc를 눌러 메뉴 선택 창을 나갈 수 있다.
이 경우에는 -1을 반환한다.
하다보니까 페이지를 나눠서 보여주는 옵션을 깜빡하고 위아래로만 선택하게끔 변경되었다.
이 부분은 오후 스크럼 때 팀원들의 의견을 받아서 적용할 생각이다.
// 빠져나가면서 콘솔 클리어함 주의
public static int PageNavigation<T>(List<T> list) //아이템 선택 안하고 탈출할 경우 -1 반환
{
Console.OutputEncoding = Encoding.UTF8;
//header는 밖에서 출력하고 들어올 것
//현재 위치 저장
int currentLeft = Console.CursorLeft;
int currentTop = Console.CursorTop;
int selectedIndex = 0;
ConsoleKey key;
do
{
for(int i = 0; i < list.Count(); i++)
{
if(selectedIndex == i) //현재 항목이 선택된 경우
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine($"‣ {list[i]}");
Console.ResetColor();
}
else
{
Console.WriteLine($" {list[i]}");
}
}
Console.WriteLine();
Console.WriteLine("원하는 항목을 선택한 후 Enter를 누르거나 Esc를 눌러 이전 화면으로 이동합니다.");
key = Console.ReadKey(true).Key;
if (key == ConsoleKey.UpArrow)
{
//selectedIndex = (selectedIndex - 1) % list.Count(); //음수 나와버림...
selectedIndex = (list.Count() + selectedIndex - 1) % list.Count(); //+ - 방향 TIL
}
else if (key == ConsoleKey.DownArrow)
{
selectedIndex = (selectedIndex + 1) % list.Count();
}
Console.SetCursorPosition(0, currentTop); //커서 옮기기
} while (key != ConsoleKey.Enter && key != ConsoleKey.Escape);
Console.SetCursorPosition(0, 0); //커서 옮기기
Console.Clear();
if (key == ConsoleKey.Enter)
{
return selectedIndex;
}
else
{
return -1;
}
////사용예제
//{
// int id = TextDisplayer.PageNavigation(GameDataManager.Instance.AllSkills);
// if (id >= 0)
// {
// Console.WriteLine(id);
// Skill selectedSkill = new AttackSkill(100, "", "", 0, 0, SkillType.Attack, 0);
// selectedSkill.Clone(GameDataManager.Instance.AllSkills[id].Id);
// Console.WriteLine(selectedSkill);
// }
// else
// {
// Console.WriteLine(id);
// }
// InputHelper.WaitResponse();
//}
}
사소하게 헷갈렸던 것은 y 값!
Console은 for로 출력했을 경우, 위에서부터 출력하기 때문에 가장 위에 출력된 인덱스 값이 더 작다!

제네릭 <T>
Skill 리스트, Item 리스트, 등 모든 타입의 리스트를 범용적으로 출력할 수 있도록 싶었기 때문에 제네릭을 사용하게 되었다.
제너릭<T>는 자료형을 일일히 지정하지 않고, 재사용 가능한 코드를 만들 수 있게 해준다.
원하는 출력 방법이 있다면 해당 클래스 내부에서 public override string ToString()을 구현하여 string으로 취급 받아도 자연스러운 출력이 가능하도록 하면 좋다.
그렇지 않으면 클래스 명만 출력된다.
Console.ReadKey
true를 전달하면 입력한 키가 콘솔에 표시되지 않는다.
false는 입력한 키가 콘솔에 표시 된다.
Console.ReadKey는 키의 정보를 저장하는 것이고, Key의 값을 구별하려면 Console.ReadKey(true).Key와 같이 사용해야 키 입력 값을 비교할 수 있다.
개발 가이드라인 문서
마크다운이라 복붙이 안되어서 그냥 캡쳐로 가져왔다.
스크럼하면서 해결한 문제들 중, 반복해서 확인하거나, 습득에 시간이 걸리는 경우들은 다음과 같이 개발 가이드라인 문서로 정리했다.
작성하면서 나도 도움을 받는 것 같다.
물론 이런식의 가이드라인이 필요없을 정도로 코드의 가독성을 높이는 것도 중요하지만,
불가능한 경우 이와 같이 가이드 라인을 남기는 것도 좋은 방법일 것 같다.




패턴 매칭 (Pattern Matching)
C#의 패턴 매칭은 is, switch, case 등에서 객체의 타입 검사와 동시에 타입 캐스팅을 자동으로 해주는 기능이다.
오늘 이걸 왜 찾아봤느냐...? Item 추상 클래스를 상속하는 Portion, Weapon 등의 아이템의 Deep Copy를 구현하다가..
public virtual void Clone<T>(T item) where T : Item
{
this.Id = item.Id;
this.Name = item.Name;
this.Description = item.Description;
this.Price = item.Price;
this.IsEquipped = item.IsEquipped;
this.Type = item.Type;
}
이와 같이 제너릭 <T>를 사용해 Clone()이라는 가상 메서드를 상속했을 때,
자식 클래스의 타입을 고유 필드들 또한 Deep Copy를 해주고 싶었기 떄문이다.
public override void Clone<T>(T item)
{
base.Clone(item);
if (item is Portion portion)
{
this.RestoreType = portion.RestoreType;
this.RestoreAmount = portion.RestoreAmount;
}
}
이렇게! 패턴을 확인하고 데이터 타입을 다른 타입으로 변환, 즉 캐스팅까지 해주는 것이다.
느낀점
저장 및 로드를 위해서 딥카피를 해야할 게 산더미다.. 오늘 TIL 여기서 줄이고 노가다 하러 가야겠다.
+참, 지난 개인 과제 피드백을 받았는데, 튜터님이 극찬을 해주셔서... 몸둘 바를 모르겠다.
이제 유니티 들어가면... 저는 끝입니다요ㅠㅠ
내일 학습 할 것은 무엇인지
내일은 새로운 기능들을 추가하는 것보다는 게임을 게임 답게 정리하는 것이 목표다.
필수 과제, 도전 과제 리스트를 체크하여 부족한 점이 무엇인지 알아보고 팀원들과 공유, 수정해나갈 생각이다.
'부트캠프 > 본캠프' 카테고리의 다른 글
| [내일배움캠프_2025JUL19] OfType, 팀 TextRPG (0) | 2025.07.19 |
|---|---|
| [내일배움캠프_2025JUL18] 콘솔 입력 버퍼 (0) | 2025.07.18 |
| [내일배움캠프_2025JUL16] Console 활용, [JsonConstructor] (0) | 2025.07.16 |
| [내일배움캠프_2025JUL15] 스크럼 마스터, 스킬 구현, 그 놈의 JSON (0) | 2025.07.15 |
| [내일배움캠프_2025JUL14]팀 과제 시작! (0) | 2025.07.14 |