fukoyjh.log
로그인
fukoyjh.log
로그인
C# 프로그래밍 (파일 다루기 & 대리자, 이벤트 & 람다식)
리문
·
2022년 8월 11일
팔로우
0
C
대리자
람다식
이벤트
파일
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 대리자와 거의 비슷함.
형식 매개변수는 모두 입력 매개변수를 위해 선언되어 있음.
리문
개발자되기 대작전
팔로우
이전 포스트
OSI 7 Layer
다음 포스트
Node.js - node.js의 특성
0개의 댓글
댓글 작성