Study/TIL(Today I Learned)

24.07.30 C#, 배치 파일과 도스 명령어, 게임 서버

에린_1 2024. 7. 30. 19:49
728x90

C#

TryGetValue 메서드에서 Dictionary와 Tuple 함께 사용

  1. TryGetValue 메서드
    • Dictionary 클래스의 메서드로, 키를 사용해 값을 안전하게 가져오려 할 때 사용한다.
    • 형식 : dictionary.TryGetValue(key, out value)
  2. ((a,b) out c) 매개변수
    • (a, b): 키(key)로 사용되는 튜플이다.
    • out c: 찾은 값을 저장할 변수이다.

장점

  • 복합 키를 사용할 수 있어 다차원 데이터를 효율적으로 표현할 수 있다.
  • 튜플을 사용함으로써 코드가 더 명확해질 수 있다.

주의사항

  • 튜플을 키로 사용할 때는 모든 요소가 정확히 일치해야 한다.
  • 성능을 고려해야 할 경우, 복잡한 튜플 키의 사용은 주의가 필요할 수 있다.

String.IsNullOrWhiteSpace(String) 메서드

  • 지정된 문자열이 null이거나 비어 있거나 공백 문자로만 구성되어 있는지를 나타낸다.

매개변수

  • value - string
  • 테스트할 문자열이다.

반환

  • Boolean

SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>)

  • 해당 형식에 대한 기본 같음 비교자를 통해 요소를 비교하여 두 시퀀스가 서로 같은지 확인한다.

형식 매개변수

  • TSource
  • 입력 시퀀스 요소의 형식이다.

매개변수

  • First IEnumerable<T>: second와 비교할 IEnumerable <T> 이다.
  • Second IEnumerable <T>: first와 비교할 IEnumerable <T> 이다.

반환

  • Boolean
  • 두 소스 시퀀스의 길이가 같고 해당 형식의 기본 같음 비교자에 따라 상응하는 요소가 서로 같으면 true, 그렇지 않으면 false 이다.

매개변수가 하나만 들어가는 경우

  • 두 시퀀스를 비교할 때 현재 컬렉션과 매개변수로 전달된 컬렉션을 비교하는 것이다.
  • 특징
    • 기본적으로 요소의 타입에 정의된 equality comparor를 사용한다.
    • IEnumerable<T> 인터페이스를 구현한 모든 컬렉션에 사용 가능하다.
  • 주의사항
    • 참조 타입의 경우, 객체의 참조가 아닌 내용을 비교하려면 별도의 IEqualityComparer를 제공해야 할 수 있다.
    • 대량의 데이터를 비교할 때는 성능에 영향을 줄 수 있다.

HashSet<T>

  • 고유한 요소의 집합을 저장하는 컬렉션이다.
  • 중복을 허용하지 않으며, 각 요소는 고유해야 한다. 내부적으로 해시 테이블을 사용하여 요소를 저장하므로, 요소의 추가, 삭제, 검색 등이 평균적으로 매우 빠르게 수행된다.

특징

  1. 고유성
    • 동일한 요소가 여러 번 추가될 수 없으며, 요소의 고유성을 유지한다.
  2. 빠른 검색
    • 해시 테이블을 사용하므로 평균적으로 O(1)의 시간 복잡도로 요소를 찾을 수 있다.
  3. 정렬되지 않음
    • HashSet의 요소는 특정 순서로 정렬되지 않는다.

집합 연산

  • HashSet은 집합 연산을 효율적으로 수행할 수 있는 다양한 메서드를 제공한다.
  • 교집합, 합집합, 차집합 등의 연산을 할 수 있다.

배치 파일과 도스 명령어

  • 도스의 배치 파일에서 사용되는 명령어는 도스 프롬프트에서 실행 가능한 모든 명령어들이 포함된다. 그러나 배치 파일에서만 전용으로 사용되는 명령어들이 따로 존재하는데, 이러한 명령들의 형식과 사용법을 익혀 두는 게 배치 파일에 접근하기 위한 가장 우선적인 방법이다.

ECHO

  • ECHO는 배치 파일 안에 있는 명령이 실행될 때 명령어의 이름을 보여주거나 감추어 주는 기능을 한다. 즉 명령 반항(ECHO) 상태를 설정하거나 취소하기 위해 사용되는 명령이다. 마치 토글(TOGGLE)키처럼 동작하기 때문에 처리 과정을 화면에 표시 여부를 쉽게 조정하게 된다.
  • 형식 : ECHO ON or ECHO OFF
  • 배치 파일에서 ECHO OFF로 지정되었을 때에는 명령어 이름을 보여주지 않고 실행함으로써 사용자가 혼동될 가능성이 있는 반면 화면이 지저분하지 않게 해준다. ECHO의 기본값은 ECHO ON으로 설정되어 있다. 따라서 도스는 배치 파일의 실행이 끝나면 다시 ECHO ON으로 리셋(RESET)시키게 되는데, 도스 3.3 이후부터는 ECHO OFF 자체도 앞에 @표시를 함께 써 줌으로써 ECHO OFF가 화면에 표시되는 것을 막을 수 있게 되었다.

REM

  • 배치 파일 내의 실행중인 명령과 기능 등을 사용자가 이해하기 쉽도록 주석을 달 수 있게 해준다.
  • 형식 :REM [설명문]
  • 이 주석은 배치 파일이 길어진다던가 복잡해질 경우 프로그램의 이해를 높이기 위해 달아 주는 것이 좋다. 일반적으로 REM 명령은 배치 파일 작성자와 작성 날짜, 사용 목적 등을 기술하는데 사용하게 되며, 동작 과정을 이해하기 쉽게 주석을 이용하여 보조 설명을 달거나 옵션과 도움말 설명을 위해 사용하기도 한다.
  • 또, 이 REM 명령이 사용되는 경우는 배치 파일 내의 명령어 중에서 일시적으로 실행을 중지하려는 명령이 있을 때 사용되기도 한다. 이 명령을 명령어 앞에 적어 두면 도스가 주석문으로 인식하기 때문에 실행이 되지 않는다. 그리고 작성된 배치 파일이 원하는 대로 실행되지 않는다면, 명령어 앞에 REM을 추가하여 해당 명령어를 실행시키지 않은 상태로 만들어 놓고 문제가 발생한 행을 찾아낼 수 있다.

PAUSE

  • 처리중인 배치 파일을 멈추고 사용자에게 조건적인 메시지를 보여준다.
  • 사용자가 어떤 키를 눌렀을 때 계속해서 처리된다. 이 명령은 배치 파일을 일시 중단시키는 기능을 하는데 지나가 버리는 화면을 사용자가 읽기 편하게 잡아 놓기 위해 사용되거나 다른 준비 작업을 위해 약간의 여유를 주기 위해 이용된다.
  • 형식 : PAUSE [message]
  • 배치 파일 실행중에 PAUSE 명령을 만나면, 도스는 “Press any key to continue …” 과 같은 메시지를 화면에 보여준다. 또한 이 PAUSE 명령은 배치 작업 계속 실행 여부를 판단하게 위해 적합하다. 즉 배치 파일의 연속적인 실행 과정 내에 이 PAUSE 명령을 삽입해 둠으로써 CTRL + C를 이용한 실행 중단을 쉽게 할 수 있다.

IF

  • 배치 파일의 조건적인 처리를 수행하도록 하는 명령어이다.
  • IF문에 투입된 내용의 값이 조건을 만족하는 참(True)이면, IF문 다음의 문장을 수행한다. 그러나 조건의 값이 거짓(False)이면 뒤따라오는 문장의 명령을 무시하고 넘어간다.
  • 일반적인 IF문의 종류로는 6가지의 독특한 조건이 허용된다.
    1. IF EXIST filename.ext(or parameter) Command
    2. IF NOT EXIST filename.ext(or parameter) Command
    3. IF String1 == String2 Command
    4. IF NOT String1 == String2 Command
    5. IF ERRORLEVEL value Command
    6. IF NOT ERRORLEVEL value Command
  • 도스 배치 파일에서 사용되는 파라미터(변수)는 %0, %1, %2 … %9와 같은 10개가 있다. 그리고 프롬프트 상태에서 맨 앞에 오게 되는 명령어는 대개 변수 %0에 배당된다.

FOR

  • 일종의 반복 조건문으로 주어진 조건을 만족할 때까지 도스 명령어를 실행한다.
  • 형식 : FOR %%변수명 IN (SET) DO Command
  • 퍼센트 기호 두 개와 함께 쓰인 변수는 앞에서 다뤘던 숫자 변수와 달리 ‘이름을 가진 변수(NAMED VARIABLE)이다. 이 때문에 숫자 변수와 구분하기 위해 이름 변수는 앞에 %를 두 개 붙여 준다.
  • FOR 다음의 변수명으로는 한 문자로된 알파벳만을 사용할 수 있다. 또한 괄호 안의 (SET)은 범위를 알려주는 것으로 *(ASTERISK)나 파일들의 이름을 스페이스(SPACE)나 ,(COMMA)로 구분하여 적어 줘도 된다.

GOTO

  • 조건에서 만족하면 지정된 레이블로 제어를 옮겨 주는 기능을 한다. 레이블명은 :(COLON)을 앞세우고 적는다. 이 GOTO 명령은 배치 프로그램 안에서만 사용되는 명령으로 도스 명령어 처리기에게 지정된 레이블명이 있는행으로 제어권을 이동하게 한다. 일단 제어권이 이동한 다음에는 연속해서 그 다음 행의 명령들을 처리한다.
  • GOTO 명령에서 유효한 레이블명은 공백(SPACE)이나 ;(세미콜론), =(EQUAL)과 같은 기호를 포함하지 않아야 하며, 8자를 넘지 않는 게 좋다. 이는 GOTO 명령이 레이블명에 사용된 문자 중 첫 8자까지 만을 인식하기 때문이다.

CALL

  • 배치 파일 내에서 명령의 중단이나 정지없이 또 다른 배치 파일을 불러 실행시키도록 하는 명령이다.
  • 형식 : CALL [drive:][path] filename [batch-parameters]
  • 다른 명령과는 달리 파이프 기호나 리디렉션 기호를 CALL 명령과 함께 사용할 수 없다. 또한 배치 프로그램 안에서 반복해서 자신을 불러 들일 수 있는 RECURSIVE 호출이 가능하지만 이 경우 탈출 명령을 만들어 두지 않으면 계속해서 반복 루프에 걸리게 된다. 이때 사용자가 강제로 배치 파일의 실행을 중지하기 위해서는 CTRL + C를 눌러 프로그램 실행을 그만두게 해야 한다.
  • CALL 명령은 배치 파일 중간에 사용되어 다른 배치 파일을 불러들여 실행하고 다시 제어권을 CALL문이 사용된 배치 프로그램으로 넘기게 된다. 그러나 배치 파일의 마지막 줄에 다른 배치 파일을 실행하기 위해서는 CALL문을 사용하지 않아도 된다. 왜냐하면 제어권을 원래의 호출 프로그램으로 되돌릴 필요가 없기 때문이다.

SHIFT

  • 배치 파일의 변수들을 왼쪽으로 하나씩 이동시킨다.

CHOICE

  • 배치 파일을 사용자와 대화식으로 구성하기 위한 명령이다. CHOICE는 지정된 키 중에서 사용자가 원하는 키를 누를 때까지 정지 상태의 메시지 프롬프트를 제공한다.
  • 형식 : CHOICE [/C[:]keys] [/N] [/S] [/T[:]char, sec(nn)] [test]

파라미터와 스위치

  • text
    • 사용자가 선택키를 고를 때까지 화면에 나타내고 싶은 메시지를 적어 줄 수 있다. 그러나 프롬프트 앞에 단지 문자열의 일부분으로써 스위치 구분자 (/)를 사용하려 한다면, 인용 부호(Quatation)를 이용해 표시해 줘야 한다.
  • /C[:]keys
    • 프롬프트에 할당된 키를 명시한다. 각 키의 정의는 대괄호([,]) 안에 정의되며 콤마(,)에 의해 구분되고 물음표(?)가 뒤따라오게 된다. 그러나 만약 /c 스위치가 정의되지 않으면 디폴트 값인 YN(Yes, No)이 사용된다. 또한 구분자인 콜론의 사용은 선택적이다.
  • /N
    • CHOICE 명령에서 프롬프트를 표시하지 않는다. 그러나 프롬프트 앞에 나타나는 text에서 지정한 메시지는 나타난다. 또 /N 스위치를 사용했다하더라도 /C 스위치에 지정된 키의 사용은 유효하다. 다만 화면에 표시하지 않는 것뿐이므로 선택키가 안 보인다고 당황할 필요는 없다.
  • /S
    • 선택키의 대문자와 소문자 입력을 구분하는 동작을 한다.
  • /T[:]char,sec(nn)
    • char에 지정된 디폴트 선택키를 sec(초단위)에 지정된 시간만큼 지연시킨 후에 실행되도록 한다. char에 사용되는 문자는 /C 스위치에서 지정한 선택문자들에 포함된 것이어야 하며, 지연 시간의 범위는 0부터 99초까지의 초단위 시간을 사용할 수 있다.

게임 서버

프리징(Freezing)

  • 세션의 상태가 일시적으로 정지되거나 멈춘 상태를 의미한다.
  • 일반적으로 세션과 관련된 처리나 업데이트가 중단됨을 나타낸다.

발생 원인

  • 네트워크 문제
    • 클라이언트와 서버 간 연결 불안정
  • 서버 과부하
    • 처리할 수 있는 용량을 초과한 경우
  • 버그 또는 예외 상황
    • 예상치 못한 오류로 인한 처리 중단
  • 의도적인 일시 정지
    • 유지보수나 특정 작업을 위한 일시적 중단

특징

  • 데이터 업데이트 중단
    • 세션 관련 데이터가 더 이상 업데이트되지 않는다.
  • 클라이언트 응답 지연
    • 서버가 클라이언트 요청에 응답하지 않을 수 있다.
  • 게임 상태 불일치
    • 클라이언트와 서버 간 게임 상태의 차이가 발생할 수 있다.

영향

  • 플레이어 경험 저하
    • 게임이 멈추거나 지연되는 것처럼 보일 수 있다.
  • 데이터 무결성 위험
    • 프리징 중 발생한 변경사항이 손실될 수 있다.
  • 서버 리소스 낭비
    • 프리징된 세션이 불필요하게 리소스를 점유할 수 있다.

대응 방안

  • 자동 감지 시스템
    • 프리징 상태를 자동으로 감지하고 로깅한다.
  • 타임아웃 메커니즘
    • 일정 시간 동안 응답이 없으면 세션을 종료한다.
  • 재연결 프로토콜
    • 클라이언트가 자동으로 재연결을 시도하도록 한다.
  • 상태 복구 메커니즘
    • 프리징에서 복구될 때 세션 상태를 올바르게 복원한다.
728x90

'Study > TIL(Today I Learned)' 카테고리의 다른 글

24.08.01 C#, 데이터베이스 샤딩  (0) 2024.08.01
24.07.31 C#  (0) 2024.07.31
24.07.29 C#, 게임 서버  (0) 2024.07.29
24.07.26 C#  (0) 2024.07.26
24.07.25 C#  (0) 2024.07.25