🗓️ 오늘 하루 일정
✅ 오전
- 09:00 ~ 09:10 : 팀원들과 소통 및 자기소개
- 09:10 ~ 11:30 : 개인 공부
- 스네이크 게임 제작
- 맵 구현, Snake 리스트로 표현, 키 입력 처리 구현 등
- 11:30 ~ 13:00 : C# 체크리스트 강의 수강
- 변수와 자료형, ConsoleKey, 콘솔 단축키 (Ctrl+Shift+F, Ctrl+R+R, Shift+F12) 등 학습
🍽️ 점심시간
- 13:00 ~ 14:00 : 점심시간
✅ 오후
- 14:00 ~ 18:00 : 개인 공부 및 Snake 게임 마무리
- 튜플, 리스트, ConsoleKey, Thread.Sleep(), snake.Clear() 등 이해
- 게임 로직 완성 및 클래스 다이어그램 정리
- 스택 프레임과 함수 호출 구조 시각화 학습
- LINQ, Any(), 람다식 구조 심화 학습
🍽️ 저녁시간
- 18:00 ~ 19:00 : 저녁시간
✅ 저녁
- 19:00 ~ 21:00 : 복습 및 실습
- Item 클래스 직접 구현 (아이템 추가 / 출력 기능)
- 중복 검사 (Any() + 람다식)
- 오늘 전체 개념 복습 정리
✅ 오늘 학습 키워드
🎮 Snake 게임 제작 관련
- 콘솔에서 키보드 입력 받는 방법
- ConsoleKey, Console.ReadKey(true) 사용법
- Thread.Sleep()으로 속도 조절
- Clear(), SetCursorPosition() 사용 이유
- static ConsoleKey direction = ConsoleKey.RightArrow; 선언 이유
- List<(int x, int y)> 형태로 Snake 위치 저장
- (int x, int y) newHead = head; 라인에서 2줄로 쓴 이유
- y--가 위로, y++가 아래로 가는 이유
- 게임 로직 전체 흐름 (이동, 충돌, 먹이 처리)
🗂️ 컬렉션/자료구조 & LINQ
- 리스트 안에 튜플 저장 (List<(int, string)>)
- Any() 함수로 중복 검사
- Find(), FindAll(), Where() 차이
- 람다식에서 x => 문법 의미
- 튜플에서 Item1, Item2가 의미하는 것
- .name, .age 출력에서 + 안 써서 생긴 실수 고치기
🧠 이론 개념 학습
- 스택프레임 개념 설명 (호출 순서, 메모리 흐름)
- 스택프레임 vs 스택의 차이점
🧪 실습 및 확장
- ItemManager 클래스 구조 분석
- AddItem()에서 중복 방지 로직 구현
- item.Any(x => x.itemNumber == newItem.itemNumber) 상세 설명
- x의 정체와 람다식 구조 해설
- 콘솔 기반 아이템 관리 시스템 직접 구현 (Add, Show)
- ItemInstance 클래스 & ItemManager 기능 분석
📌 기타
- Ctrl + Shift + F, Ctrl + R, R, Shift + F12 단축키 학습
- 클래스 다이어그램(classDiagram) 구조 정리
- class SnakeGame UML 다이어그램 문법 교정
✅ 오늘 학습 한 내용을 나만의 언어로 정리하기
C# - Console SnakeGame(콘솔 스네이크 게임) + 활용 예제
이번 과제로 스네이크 게임을 만들게 되었다 만들면서 느낀거지만.... 코딩테스트 준비를 열심히 해야겠다는 생각이 들었다ㅠㅜ.. GPT의 도움을 많이 받았고 이걸 통해서 활용 예제도 많이 다뤄
dev-jen.tistory.com
C# - Tuple(튜플) vs Struct(구조체)
✅ 튜플이란?서로 다른 타입의 데이터를 한 번에 묶어서 저장할 수 있는 구조배열이나 리스트처럼 하나의 타입만 저장하는 게 아니라,여러 값을 하나의 단위로 다룰 수 있어🔸 기본 예제var perso
dev-jen.tistory.com
C# - ConsoleKey(콘솔키)
✅ ConsoleKey란?ConsoleKey는 C#에서 키보드의 실제 키를 표현하기 위한 **열거형(enum)**이야.예를 들어, 키보드의 화살표 키, Enter, A, B, 숫자 1~9, ESC 등은모두 ConsoleKey의 값으로 표현할 수 있어.✅ 사용
dev-jen.tistory.com
C# - List(tuple) vs Dictionary
한참 리스트의 튜플로 코드로 장난치고 있었는데 그럼 딕셔너리와의 엄청난 치이점이 뭘까.. 싶었다물론 리스트와 딕셔너리도 비슷하게 사용할 수 있다.List items = new List{ (0, "나무칼"), (1, "나무
dev-jen.tistory.com
C# - 스택 프레임이란? (Stack Frame) vs 스택(Stack)
🧠 스택 프레임이란?함수를 호출할 때마다 생기는 임시 메모리 공간이자 작업 단위 블록각 함수마다 **자신만의 공간(프레임)**을 갖고, 거기서 매개변수, 지역 변수, 복귀 주소 등을 저장해✅
dev-jen.tistory.com
C# - Linq(Language Integrated Query)
🧠 LINQ란?LINQ는 "Language Integrated Query"의 약자로,C# 코드 안에서 SQL처럼 데이터를 쉽게 조회하고 가공할 수 있게 해주는 문법이야.✅ LINQ의 목적배열, 리스트, 딕셔너리, 데이터베이스 등 여러 종류
dev-jen.tistory.com
C# - C#으로 간단한 아이템 매니저 구현하기 - List와 LINQ로 컬렉션 관리 연습
public class ItemInstance{ public int id; // 유니크한 아이디 public int itemId; // 같은 종류의 아이템끼리 공유하는 ID // 기타 필요한 속성들...}public class ItemManager{ private List _items; public ItemManager(List items) { _ite
dev-jen.tistory.com
🎮 Snake 게임 구현 관련
오늘 만든 콘솔 기반 스네이크 게임은 생각보다 구현 요소가 많았다.
처음엔 단순히 "뱀이 움직인다"는 걸 만들면 끝일 줄 알았는데,
키 입력 처리, 이동 방향 저장, 충돌 판정, 맵 초기화, 먹이 생성 등 게임 로직의 핵심 요소들이 하나씩 모여서 게임이 만들어진다는 걸 체감했다.
Console.ReadKey(true)로 키를 숨기면서 입력받는 방법,
Console.SetCursorPosition()으로 콘솔 깜빡임을 없애는 방법 등도 실제로 구현해보니 콘솔이 단순한 UI가 아니라는 걸 알게 됐다.
기술 하나하나가 게임 흐름을 만든다는 걸 느꼈다.
🧱 튜플과 리스트
튜플은 정말 유용했다!
클래스를 만들지 않아도 (int, string, string) 이런 식으로 여러 값을 하나로 묶어서 리스트에 넣을 수 있었고,
필드를 .Item1로도 접근할 수 있지만 (itemNumber, itemName)처럼 이름 붙이면 훨씬 보기 좋았다.
튜플 리스트를 활용하면, 간단한 구조체 같은 느낌으로 데이터를 깔끔하게 표현할 수 있다는 걸 처음 알게 됐다.
🔎 LINQ와 람다식
LINQ는 조금 어려웠지만 잘 사용한다면 정말 유용할거 같았다.
Any()는 특정 조건을 만족하는 값이 있는지 쉽게 확인해주고,
x => x.itemNumber == newItem.itemNumber 같은 람다식은 처음엔 낯설었지만,
"리스트 속 요소 하나를 x라고 부르면서 조건을 검사하는 방식"이라고 이해하니까 정리가 됐다.
이전에는 foreach로 돌렸던 걸 한 줄로 쓸 수 있다는 건 생산성과 가독성 모두에서 큰 차이를 만든다.
🧠 스택프레임과 함수 호출 흐름
스택프레임은 사실 처음엔 뭐지? 싶었다.
그냥 '함수는 호출하면 실행되고 끝나는 거 아닌가?' 정도로만 알고 있었는데,
함수가 호출될 때 메모리 위에 쌓이는 구조, 그리고 함수가 끝나면 사라지고,
그 다음 함수로 돌아가는 흐름과 구조를 시각적으로 배우니까 메모리 구조에 대한 이해가 확 생겼다.
프로그래밍은 결국 메모리와 흐름을 다루는 일이라는 걸 또 한 번 느꼈다.
🧪 아이템 관리 실습
콘솔에서 직접 AddItem, ShowItemList 같은 메뉴를 구성해서 만들고,
중복 체크를 위해 Any()를 적용해본 건 매우 실용적이었다.
내가 만든 코드 안에 LINQ를 직접 써봤다는 점에서 배운 걸 바로 실전에서 활용했다는 확신이 생겼다.
🔧 도구와 기타 학습
Visual Studio 단축키도 오늘 새롭게 알게 됐는데,
Ctrl + Shift + F로 전체 찾아 바꾸기, Ctrl + R, R로 이름 바꾸기, Shift + F12로 참조 찾기 등
생산성 도구는 작업 속도와 코드 탐색에 진짜 유용하다는 걸 체감했다.
오늘 하루는 정말 많은 걸 배우고 느낀 날이었다.
튜플, LINQ, Snake 게임 구현, 스택프레임 구조까지 하나하나의 배움이 앞으로의 개발에 확실히 도움이 많이 될 듯 헀다.
🧩 학습하며 겪었던 문제점 & 에러
1. 리스트를 사용해봤지만 아직 익숙하지 않았다
- 문제정의
- 리스트에 튜플을 넣고 반복문으로 순회하거나, 원하는 값을 조건으로 찾는 방법이 헷갈렸다.
- 시도
- List<(int itemNum, string name)> 형식으로 선언하고 foreach로 하나씩 꺼내보며 직접 실험했다.
- 해결 방법
- 튜플 안의 필드에 이름을 붙이면 .itemNum, .name처럼 직관적으로 접근할 수 있다는 걸 알게 됐다.
- 새롭게 알게 된 점
- 튜플은 간단한 구조를 저장할 때 강력한 도구이고, 필드 이름을 붙이는 게 가독성과 활용성을 높여준다.
2. ConsoleKey direction = ConsoleKey.RightArrow; 문법이 낯설었다
- 문제정의
- ConsoleKey라는 타입이 무엇인지, RightArrow 같은 값이 어떻게 저장되는지 감이 안 왔다.
- 해결 방법
- ConsoleKey는 키보드의 특정 키를 나타내는 열거형(Enum) 이며, Console.ReadKey()로 해당 키 값을 읽어 비교하는 데 쓰인다는 걸 배웠다.
- 새롭게 알게 된 점
- 방향이나 키 입력을 다룰 때 ConsoleKey가 유용하다는 걸 처음으로 체감했다.
3. Thread.Sleep(150)과 Console.Clear()의 기능
- 문제정의
- 콘솔 게임 코드에서 이 코드들이 무슨 역할을 하는지 몰랐다.
- 해결 방법
- Thread.Sleep은 게임 루프의 실행 속도를 조절하고, Console.Clear는 이전 화면을 지워서 다음 화면으로 바꿔주는 용도임을 알게 됐다.
- 새롭게 알게 된 점
- 콘솔 게임에서는 출력 순서와 타이밍 조절이 매우 중요하다는 것을 배웠다.
4. 방향 전환 제한 조건식이 이해되지 않았다
if ((key == ConsoleKey.UpArrow && direction != ConsoleKey.DownArrow) ||
(key == ConsoleKey.DownArrow && direction != ConsoleKey.UpArrow) ||
(key == ConsoleKey.LeftArrow && direction != ConsoleKey.RightArrow) ||
(key == ConsoleKey.RightArrow && direction != ConsoleKey.LeftArrow))
- 문제정의
- 위 코드가 정확히 무슨 내용인지 헷갈렸다.
- 해결 방법
- 현재 방향과 정반대 방향으로는 이동할 수 없게 막는 조건이라는 걸 알게 됐다.
- 새롭게 알게 된 점
- 이 조건은 뱀이 자기 몸과 부딪히지 않도록 막아주는 기본적인 안전 장치라는 걸 이해했다.
5. snake[0]을 한 줄로 newHead에 안 넣고 두 줄로 나눈 이유
- 문제정의
- var head = snake[0]; (int x, int y) newHead = head; 이 구조가 비효율적으로 느껴졌다.
- 해결 방법
- 의도를 분리하고, 변수명을 통해 역할을 구분하기 위한 구조라는 걸 이해했다.
- 새롭게 알게 된 점
- 코드가 짧은 것보다 명확한 의도 표현이 더 중요하다는 걸 느꼈다. 그리고 저렇게 사용하는게 더 안전한 상태라는걸 알게됐다!
6. Any()와 람다식 구조가 처음엔 낯설었다
- 문제정의
- item.Any(x => x.itemNumber == newItem.itemNumber)에서 x가 뭔지, =>는 무슨 의미인지 몰랐다.
- 해결 방법
- x는 리스트 안의 요소 하나를 나타내는 이름이고, =>람다식을 사용해서 정의하면 된다.
- 새롭게 알게 된 점
- Any()는 조건을 만족하는 요소가 있는지를 한 줄로 쉽게 확인할 수 있는 유용한 도구다.
📝 메모
class Item
{
// 아이템 정보를 저장하는 리스트
static List<(int itemNumber, string itemName, string itemInfo)> item = new List<(int itemNumber, string itemName, string itemInfo)>();
static bool isStop = false;
static void Main(string[] args)
{
while (!isStop)
{
Display();
}
}
static void Display()
{
Console.WriteLine("1번 아이템 추가");
Console.WriteLine("2번 아이템 목록");
Console.WriteLine("0번 프로그램 종료");
Console.Write("번호 선택 : ");
int Sel = int.Parse(Console.ReadLine());
switch (Sel)
{
case 1:
Console.WriteLine("아이템 추가");
AddItem();
break;
case 2:
Console.WriteLine("아이템 목록");
ShowItemList();
break;
case 0:
Console.WriteLine("프로그램 종료");
break;
default:
Console.WriteLine("잘못된 선택입니다. 다시 시도하세요.");
break;
}
}
static void AddItem()
{
(int itemNumber, string itemName, string itemInfo) newItem;
Console.Write("아이템 번호 입력 : ");
newItem.itemNumber = int.Parse(Console.ReadLine());
// 중복 검사
bool exists = item.Any(x => x.itemNumber == newItem.itemNumber);
if (exists)
{
Console.WriteLine("⚠️ 이미 존재하는 아이템 번호입니다. 추가할 수 없습니다.");
return;
}
Console.Write("아이템 이름 입력 : ");
newItem.itemName = Console.ReadLine();
Console.Write("아이템 정보 입력 : ");
newItem.itemInfo = Console.ReadLine();
item.Add(newItem);
Console.WriteLine("✅ 아이템이 추가되었습니다.");
}
static void ShowItemList()
{
foreach (var newitem in item)
{
Console.WriteLine($"아이템 번호 : {newitem.itemNumber}");
Console.WriteLine($"아이템 이름 : {newitem.itemName}");
Console.WriteLine($"아이템 정보 : {newitem.itemInfo}");
Console.WriteLine("-------------------------");
}
}
}
마지막 9시 되기전 아이템에 대한 코드 조금 끄적여봤다..ㅎㅎ..
오늘은 정말 많이 배우고, 또 스스로 몰랐던 걸 하나씩 마주했던 하루였다.
리스트와 튜플은 익숙하다고 생각했는데, 막상 실습해보니 생소한 부분이 많았고,
Any()나 람다식 같은 문법은 처음엔 이해하기 어려웠다.
하지만 코드 하나하나를 직접 써보고, 출력 결과를 확인하면서
“많이 모르고 있었구나”를 진심으로 느꼈고
“하나씩 차근차근 하자”는 마음으로 계속 물어보면서 배워갔다.
스네이크 게임을 만들면서 콘솔에서도 충분히 재미있고 구조적인 게임을 만들 수 있다는 걸 깨달았고,
그 과정에서 ConsoleKey, Thread.Sleep, Clear, switch, 조건 분기, 중복 검사 등
정말 다양한 개념을 직접 써보며 손에 익힐 수 있었던 것도 큰 수확이었다.
오늘 내가 배운 건 단순한 C# 문법이 아니라
생각하고 해석하는 힘, 그리고 조금씩 완성해나가는 자신감이었다.
힘들었지만 그만큼 보람찼고, 코드를 통해 사고하는 방식이 하루하루 깊어지는 게 느껴진다.
하여튼 내일도 화이팅!!!!

'스파르타 코딩클럽 > TIL작성' 카테고리의 다른 글
| 내일배움캠프 9일차 TIL [텍스트 RPG 개발] (0) | 2025.07.10 |
|---|---|
| 내일배움캠프 8일차 TIL [C# 고급 문법 정리 + 텍스트 RPG 제작 시작] (0) | 2025.07.09 |
| TIL - 내일배움캠프 6일차 TIL [기초 문법 강의 수강](25.07.07) (7) | 2025.07.07 |
| TIL - 내일배움캠프 5일차 TIL [디자인 패턴 + CS공부](25.07.04) (2) | 2025.07.04 |
| TIL - 내일배움캠프 4일차 TIL [디자인 패턴 + CS공부](25.07.03) (0) | 2025.07.03 |
