C# 프로그래밍 (파일 다루기 & 대리자, 이벤트 & 람다식)

리문·2022년 8월 11일
0

파일 다루기


파일 정보와 디렉터리 정보

  • .NET은 파일과 디렉터리 정보를 쉽게 다룰 수 있도록 System.IO 네임스페이스를 제공함.
  • File, FileInfo, Directory, DirectoryInfo 클래스가 있음.
  • Info 클래스는 정적메소드 대신 인스턴스 메소드를 제공하는 차이점이 있음.
  • 각각의 클래스는 생성,복사,삭제,이동 등의 기능을 하는 메소드와 프로퍼티를 제공함.

파일을 읽고 쓰기 위해 알아야 할 것들

  • Stream
    • Stream이란 데이터가 흐르는 통로를 뜻함.
    • 데이터를 저장장치에 저장하기 위하여 필요하며, Stream으로 메모리와 저장장치 사이의 연결이 생성됨.
    • Stream을 통해 메모리의 데이터를 바이트 단위로 저장장치에 옮기고, 파일을 읽을 때는 저장장치에서 메모리로 데이터를 바이트 단위로 차례차례 옮겨옴.
    • 처음부터 끝까지 데이터가 순서대로 읽고 쓰이기 때문에 순차 접근 방식이라고 함.
    • 하드디스크등의 임의접근 방식의 저장장치는 임의의 주소에 있는 데이터에 바로 접근이 가능함.

System.IO.Stream 클래스

  • Stream 클래스는 그 자체로 입,출력의 역할을 모두 수행하며, 순차 접근, 임의 접근방식을 모두 지원함.
  • 단, Stream 클래스는 추상 클래스이기 때문에 이 클래스를 상속받는 클래스를 이용해야함.
    • FileStream : 디스크 파일에 데이터를 기록함.
    • NetworkStream : 네트워크 피어에 데이터를 전송함.
    • GZipStream : 데이터를 GNU ZIP 형식으로 압축함.
    • BufferedStream : 데이터를 파일이나 네트워크에 즉시 기록하지 않고, 메모리 버퍼에 담아뒀다가 일정량이 쌓였을 때 기록함.
  • Stream 클래스의 Position 프로퍼티는 현재 Stream의 읽는 위치, 혹은 쓰는 위치를 나타냄.
    • 순차 접근
      • Position 프로퍼티가 객체를 생성할 때 0이 되고, 데이터 기록, 읽기 등을 수행하고 자동으로 1씩 증가함.
    • 임의 접근
      • Seek 메소드를 활용하여 임의의 주소로 바로 접근이 가능함.

Using 선언

  • Stream 클래스는 열기 -> 기록하기 -> 닫기의 순서로 동작하는데 보통 닫기를 잊는 경우가 많음.
  • using 네임 스페이스를 사용하면 블록범위가 끝나면 자동으로 Dispose() 메소드가 호출되어 이러한 실수를 줄일 수 있음.
  • using 선언문 아래에 코드 블록을 만들어 자원의 수명을 세부적으로 조절하는 방법도 사용할 수도 있음.

이진 데이터 처리를 위한 BinaryWriter/Reader

  • FileStream 클래스는 데이터 저장을 위해 반드시 byte 형식을 사용해야하는 불편함이 존재함.
  • BinaryWriter/Reader는 Stream에 이진 데이터를 저장, 읽기를 수행하여 이러한 불편함을 해소함.
  • 단, 불편함을 해소하기 위한 도우미 역할만을 수행하므로 반드시 Stream 클래스에서 파생된 클래스의 인스턴스가 있어야 함.
  • BinaryWriter/Reader의 생성자를 호출하면서 FileStream의 인스턴스를 매개변수로 받아야함.
  • 이후에는 그냥 Write, Read 와 같은 메소드만을 사용해서 저장하고 읽어오면 됨.

텍스트 파일 처리를 위한 StreamWriter/Reader

  • BinaryWriter/Reader 와 같이 텍스트 파일을 쉽게 처리하기 위하여 제공됨.
  • 사용법도 유사하나, 읽어 올 때는 타입에 상관없이 Stream의 끝까지 읽어오면 됨.

객체 직렬화

  • 기본 데이터 형식은 앞에서 본 BinaryWriter/Reader와 StreamWriter/Reader를 이용하여 처리할 수 있으나, 클래스나 구조체같은 복합 데이터 형식은 지원하지 않음.
  • 따라서, 복합 데이터 형식을 Stream에 읽고 쓰게하기 위하여 직렬화가 필요함.
  • 직렬화는 객체의 상태를 메모리나 저장 장치에 저장이 가능하도록 이진화 시키는 것을 일컬음.
    • [Serializable] : 클래스 선언부 앞에 붙여주면 직렬화.
    • BinaryFormatter를 이용하여 간단히 저장이 가능.
      • BinaryFormatter : 직렬화와 역직렬화를 수행.
      • BinaryFormatter 인스턴스의 Serialize(),DeSerialize() 메소드로 각각 직렬화 역직렬화가 가능하다.
    • [NonSerialized] : 직렬화하고 싶지 않은 필드에 수식하면 직렬화,역직렬화되지 않음.

대리자와 이벤트


대리자

  • 함수를 보관할 수 있는 타입.
  • 사용자 정의 대리자를 만들 수도 있지만 System.Action 혹은 System.Func를 사용한다.
  • Unity 에는 UnityAction 타입이 존재한다.
  • Invoke() 메소드로 보관된 모든 함수를 호출할 수 있다.

일반화 대리자

  • 일반화 메소드를 참조하는 대리자. 형식 매개변수를 이용하여 선언되어야 함.
  • 대리자를 매개변수로 사용할 메소드도 형식 매개변수를 받을 수 있어야 함.

대리자 체인

  • 대리자의 인스턴스가 동시에 참조할 수 있도록 메소드에 += 연산자를 사용하여 결합 할 수 있음.
  • 여러개의 콜백을 동시에 호출해야 할 때 유용함.
  • -= 연산자를 이용하여 결합을 제거할 수 있음.
  • Delegate.Combine(), Delegate.Remove() 메소드도 존재.

익명 메소드

  • 메소드는 보통 한정자, 반환값, 매개변수는 없어도 되지만 이름만은 있어야함.
  • BUT, 익명 메소드는 이름이 없는 메소드를 뜻함.
  • 익명 메소드는 자신을 참조할 대리자의 형식과 동일한 형식으로 선언되어야함.
    • 반환값의 타입, 매개변수의 타입, 개수 등이 동일해야함.
  • 한번만 쓰이고 다시 사용할일이 없을만한 메소드를 익명 메소드로 사용한다.

이벤트

  • 옵저버 패턴을 쉽게 사용하기 위한 타입.
  • 선언된 대리자 타입의 함수를 보관할 수 있다.
  • 대리자와 다르게 외부에서 Invoke() 를 할 수 없다.
  • 함수가 중복되어 추가 된다면 디버깅이 매우 어렵기 때문에 꼭 추가 전에는 삭제를 해준다.
  • 이벤트 객체에 아무런 함수도 없는 경우에는 null이기 때문에 Invoke()를 호출 할 때는 꼭 Null 체크를 해준다.
    	> EX. OnTakenDamage?.Invoke();
  • 활용 방법은 'Event'의 의미대로 특정 사건(혹은 시점) 을 나타내며, 그 시점에 일어나야 하는 일들 (코드 상에서는 메소드로 표현)을 일어나게 할 수 있다.
  • 주의 사항
    - 특정 시점이 됐는데 Invoke() 호출을 빼먹은 경우
    • Invoke() 될 때 실행되어야 할 메소드를 추가하지 않은 경우

대리자와 이벤트

  • 이벤트와 대리자의 가장 큰 차이점은 이벤트를 외부에서 직접 사용할 수 없다는 데 있음.
  • 대리자는 클래스 외부에서도 호출이 가능함.
  • 이는 이벤트 기반 프로그래밍을 견고하게 해줌.

람다식

  • 간결한 방법으로 함수를 묘사하는 방식.
  • 람다 계산법에서 어떤 값을 변수에 대입하고 싶으면 함수를 변수에 대입함.

람다식 사용

  • 람다식은 익명 메소드를 만들기 위해 사용 -> 무명 함수.
  • => 연산자 사용. 매개변수를 전달함.
  • 매개변수 목록 => 식으로 사용 / 식에 매개 변수를 전달하고, 식의 결과가 반환값이 됨.
  • 형식 유추 기능을 사용해 람다식에서 매개변수의 형식을 제거할 수 있음.
  • 대리자보다 간결하게 사용 가능.

문 형식의 람다식

  • 식 형식의 람다식은 반환 형식이 없는 무명 함수를 만들 수 없음.
  • 문 형식의 람다식은 가능함.

Func와 Action으로 간편한 무명 함수 만들기

  • 대부분의 무명 함수는 매번 별개의 대리자를 선언해야한다.
  • 이러한 불편함을 해소하기 위해 Func와 Action 대리자를 선언해둠.
  • Func 대리자
    • 결과를 반환하는 메소드 참조
    • .NET에는 17가지 Func 대리자가 준비되어 있음.
    • 매개변수 중 가장 마지막에 있는 것이 반환 형식임.
  • Action 대리자
    • 결과를 반환하지 않는 메소드 참조
    • 이외에는 Func 대리자와 거의 비슷함.
    • 형식 매개변수는 모두 입력 매개변수를 위해 선언되어 있음.
profile
개발자되기 대작전

0개의 댓글