[TIL] 14일차 - 팀 과제를 통한 공부

김유원·2024년 1월 11일
0

📝 24.01.11

오늘은 진짜 스스로 한게 없다고 느끼는 너무 무기력한 하루다. 시간을 허투루 쓴 것은 아닌데, 무언가 완성된 결과물이 없어서 그렇게 느끼는 것 같다.
팀 과제에 맡은 부분은 이미 다 끝내두어서 코드 작동 여부와 자잘한 수정사항 등을 점검하였고, 팀원이 짠 코드를 공부하는 것이 거의 전부였다.

작은 수정 사항 들을 여기에 적는 것은 아닌 것 같고, 오늘 팀원이 짠 ui 코드 중 인상적이었던 부분에 대해 적어볼까 한다.

1) 포인터 이동을 통한 선택

리스트에 선택지를 추가하고, 이를 포인터로 이동하여 선택하고자하는 위치에 도달하면 엔터를 누르는 방식의 함수이다.

public int SelectList<T>(List<T> list)
{
    int first, last, now;

    first = Console.CursorTop;
    foreach (T item in list)
    {
        if (item is Quest)
        {
            Quest q = new Quest();
            q = item as Quest;
            WriteColoredNumbers($"   {q.name}\n");
        }
        else if (item is EquipItem equipItem)
        {
            WriteColoredNumbers($"   {equipItem.ToString()}\n");
        }
        else WriteColoredNumbers($"   {item}\n");
    }
    last = Console.CursorTop - 1;

    now = first;

    WriteAt("=>", now);

    while(true)
    {
        var key = Console.ReadKey(true).Key;

        switch(key)
        {
            case ConsoleKey.DownArrow:
                if(Console.CursorTop < last)
                {
                    WriteAt("  ", now++);
                    WriteAt("=>", now);
                }
                continue;
            case ConsoleKey.UpArrow:
                if (Console.CursorTop > first)
                {
                    WriteAt("  ", now--);
                    WriteAt("=>", now);
                }
                continue;
            case ConsoleKey.Enter:
                if (list.Count == 0) return -1;
                return now - first;
            case ConsoleKey.Escape:
                return -1;
            default:
                continue;
        }
    }
}

여기서 가장 주요하게 사용되는 것은 Console.CursorTop 속성인데, 공식 문서에 따르면 이는 버퍼 영역 내에서 커서의 행 위치를 가져오거나 설정하는 메서드입니다.

public static int CursorTop { get; set; }

따라서 현재 행의 위치를 return 해주는 메서드로, 위의 코드로 활용할 시 해당 위치의 행 값을 받아와 선택지를 나눌 수 있습니다.

↓ 어제 작성한 CreateCharacterSelectList()를 사용한 버전으로 바꿈

int cmd = ui.SelectList(new List<string>(new string[] { "1. 전사", "2. 궁수", "3. 마법사" }));
if(cmd == 0)
{
    character = new Warrior();
} else if(cmd == 1)
{
    character = new Archer();
} else if(cmd == 2)
{
    character = new Mage();
} else
{
    continue;
}

break;

기존에는 Console.ReadLine이나 ConsoleKey를 입력받아 사용했었는데, 이렇게 커서 위치를 이동시키는 방식으로 수정하니 입력이 직관적이고 오입력 문제도 줄어드는 것을 확인할 수 있었다.

참고로 위의 SelectList() 메서드는 esc키를 누르면 -1을 리턴해 뒤로 갈 수 있도록 구현되어있는데 캐릭터 생성창은 게임의 시작 부분이다보니 돌아갈 곳이 없어 해당 부분은 생략하게 되었다.

2) 형식 캐스팅 as

public void AddInventory(Item item)
{
    equips.Add(item as EquipItem);

}

위 코드를 보면 매개변수 Item itemitem as EquipItem으로 형 변환하여 List<EquipItem> equipsAdd한 것을 확인할 수 있다.

여기서 as란 참조 형식을 캐스트해주는 것으로, 만약 형 변환에 실패할 시 null을 대입해준다는 특징이 있다. 형 변환이 되는 형식이라고 하면 보통 상속 관계에 잇는 타입들이므로, 이를 잘 활용해야 겠다.




이외에 오늘부터는 내가 다로 문제를 선정해서 푸는 것이 아닌 내일배움캠프에서 제공하는 코드카타 문제 리스트를 따라가게 되었다.

초반의 프로그래머스 레벨 0에 해당하는 문제들은 쉬워서 오늘 모두 풀이했고, 레벨 1의 2문제도 풀이해서 총 12문제를 오늘 풀었다. 이것들은 모두 백준 허브를 활용해 깃허브에 업로드하고 있다.

🔗 깃허브 : https://github.com/purangi/CodingTest

문제 풀이도 꾸준히하고, 내가 푼 문제라도 좀 더 인상적인 다른 사람의 풀이가 있다면 벨로그 포스팅도 꾸준히 해볼 예정이다.

그래서 오늘도 포스팅한 문제가 하나 있다.

📕 [프로그래머스] 배열의 평균값

profile
개발 공부 블로그

0개의 댓글

관련 채용 정보