오늘 한 일
- X
어제 새벽 3시까지 TIL 작성에 무리하다가 오늘 온 몸이 쑤시는 바람에 학습에 제대로된 집중을 하지 못했다.
그래도 오늘 뭐 배웠는지는 적고 가야겠다.
- 사용자가 키를 누를 때까지 실행을 중지시키고, 키가 눌렀으면 ConsoleKeyInfo라는 Struct를 반환한다.
> 사용 예시
ConsoleKeyInfo input = Console.ReadKey(); Console.WriteLine(); Console.WriteLine(input);
a를 입력 시
숫자 입력 시
- F4 입력
- 아무래도 출력가능한 문자열 말고는 출력되지는 않는 것 같다.
Console.ReadKey(true)와 Console.ReadKey(false)의 차이
-- a키를 입력 시의 차이
- Console.ReadKey(true)
- Console.ReadKey(false)
-- true는 콘솔창에 뜨지 않게 하고 false는 콘솔창에 뜨게 해주는 것 같다.
참고 자료
Console.ReadKey 메서드
ConsoleKey Enum
ConsoleKeyInfo Struct
해당 메서드를 어디다 사용할까?
- 사용자의 키 이벤트 감지용으로 사용이 가능하다.
ConsoleKeyInfo consoleKey = Console.ReadKey(); switch (consoleKey.Key) // !! ConsoleKeyInfo는 구조체이기 때문에 .Key로 키값 비교를 위해서 필요한 정보를 가지고 와야한다. { case ConsoleKey.LeftArrow: case ConsoleKey.A: if (pastKey == 1) { break; } currentMove = 0; pastKey = 0; break; case ConsoleKey.RightArrow: case ConsoleKey.D: if (pastKey == 0) { break; } currentMove = 1; pastKey = 1; break; case ConsoleKey.UpArrow: case ConsoleKey.W: if (pastKey == 3) { break; } currentMove = 2; pastKey = 2; break; case ConsoleKey.DownArrow: case ConsoleKey.S: if (pastKey == 2) { break; } currentMove = 3; pastKey = 3; break; // 위 코드는 스네이크 게임을 위해 구현된 움직임코드입니다. }
- 움직임이 구현된 모습
- 키대로 잘 움직인다.
하지만 신경써줘야하는 사항이 있다.
만약에 아무런 조건도 없이 단순히 위와 같이 기입하면 내가 키를 입력할 때까지 스크립트의 실행이 진행되지 않는다.
(하지만 이를 해결할 좋은 방법이 하나 있다.)
- 입력 스트림에서 키 누름을 사용할 수 있는지를 나타내는 값을 가져옵니다(?) 진짜 설명이 이렇게 되어있다.
Console.KeyAvailablebool a = Console.KeyAvailable; Console.WriteLine(a);
- 실행 결과
- 실행하자 마자 위와 같이 뜰 것이다.
도대체 뭐하는 놈인가요?
- 사실 이 친구의 진정한 진가는 이 곳에서 발현된다.
while (!(Console.KeyAvailable)) // KeyAvailabe이 true가 된다면 탈출한다 { Console.WriteLine("눌러!!"); Thread.Sleep(100); } Console.WriteLine("누름");
- 실행 결과
- 위와 같이 키를 입력하니 반복문을 깨고 누름이라는 문자열이 출력됐다
- 한번 더 테스트
- 이번에는 Thread.Sleep을(10000)으로 해봤다.
- 누름이 나오는 게 늦었지만 이를 보고 확실히 알 수 있는 것은 지연이 얼마나 되든 간에 누르기만 하면 true를 반환하게 된다는 것을 알 수 있다.
조금만 더 분석해볼까?
while (true) { if (Console.KeyAvailable) { Console.WriteLine("누름"); } else { Console.WriteLine("눌러!!"); } Thread.Sleep(100); // 이번에는 이와 같이 코드를 짜 봤다. }
결과
- ??? 아무리 봐도 의도된 그게 아니다. 하지만 저 코드에서 코드 한 줄만 넣어주면 된다.
수정 사항
while (true) { if (Console.KeyAvailable) { Console.WriteLine("누름"); Console.ReadKey(true); // 수정 사항! } else { Console.WriteLine("눌러!!"); } Thread.Sleep(100); }
결과
- 의도된대로 버튼을 누른 시간대만 누름을 출력한다.
유의해야할 점
- 아래와 같이 키를 꾹 누른 채로 있다보면 입력되었던 키들이 밀리게 된다.
- 추후에 이걸 고칠 수 있는 방법을 찾는 것도 좋겠다.
어제 열정과다인 채로 TIL 작성하다가 느낀 게 있는데 오늘 TIL 작성 때문에 내일을 팔지 말자는 교훈을 얻었다. 너무 무리하다보면 내일 학습에 무조건 지장이 갈 수 밖에 없더라; 그리고 지금 당장 해야하는 게 무엇인지를 잘 구별하고 되도록이면 계획을 짜서 시간 활용을 최대한 높여주는 것이 좋을 것 같다. 계획이 없는 상태로 과제를 끝내면 과제를 끝냈다는 성취감 때문에 그대로 잘하고 있다가 꼬꾸라지는 것 같다.