2022.08.10 경일 메타버스 19주차 3일 수업내용. 파일 다루기, 대리자와 이벤트, 코드 분석 팁
p. 605 ~ 606
파일(File) :
컴퓨터 저장 매체에 기록되는 데이터의 묶음
디렉터리(Directory) :
파일이 위치하는 주소.
폴더.
.NET은 파일과 디렉터리 정보를 다루기 위해
System.IO 네임스페이스와 그 아래의 클래스들을 제공한다.
File
파일의 생성, 복사, 삭제, 이동, 조회
정적 메소드
주로 하나의 파일에 한두 가지 작업을 수행할 때 활용
FileInfo
File과 같은 역할
인스턴스 메소드
하나의 파일에 여러 작업을 수행할 때 활용
Directory
디렉터리의 생성, 복사, 삭제, 이동, 조회
정적 메소드
하나의 디렉터리에 한두 가지 작업을 수행할 때 활용
DirectoryInfo
Directory와 같은 역할
인스턴스 메소드
하나의 디렉터리에 여러 작업을 수행할 때 활용
주요 메소드
기능 | File | FileInfo | Directory | DirectoryInfo |
---|---|---|---|---|
생성 | Create() | Create() | CreateDirectory() | Create() |
복사 | Copy() | CopyTo() | - | - |
삭제 | Delete() | Delete() | Delete() | Delete() |
이동 | Move() | MoveTo() | Move() | MoveTo() |
존재 여부 확인 | Exists() | Exists() | Exists() | Exists() |
속성 조회 | GetAttributes() | Attributes() | GetAttributes() | Attributes() |
하위 파일 조회 | - | - | GetFiles() | GetFiles() |
하위 디렉토리 조회 | - | - | GetDirectories() | GetDirectories() |
데이터가 흐르는 통로
데이터를 옮길 때 (즉 파일을 쓸 때), 메모리와 저장 매체 사이에 스트림을 만들어 연결한 후 데이터를 바이트 단위로 옮긴다.
순차 접근 방식 (Sequential Access) :
스트림은 데이터의 흐름 ⇒ 순서대로 읽고 쓴다.
네트워크의 방식과도 통하기에,
파일이 아닌 네트워크에도 데이터를 흘려보낼 수 있다.
반대 개념 : 임의 접근 방식 (Random Access)
임의의 주소에 있는 데이터에 접근
입력, 출력 스트림 모두 할 수 있다.
순차 접근 방식과 임의 접근 방식 모두 지원한다.
추상 클래스
인스턴스를 만들 수 없다.
파생된 클래스를 이용
이유 :
스트림이 다루는 다양한 매체, 장치들에 대한 파일 입출력을 스트림 모델 하나로 다룰 수 있도록 하기 위함
파생 클래스
FileStream :
디스크 파일에 데이터를 기록
NetworkStream :
네트워크 피어에 데이터를 전송
GZipStream :
데이터를 GZip(GNU Zip)형식으로 압축
BufferedStream :
데이터를 메모리 버퍼에 담아두었다가 일정량이 쌓일 때마다 기록
Stream의 Write(), WriteByte() 메소드 :
매개변수로 byte, byte 배열만 입력 가능
Position 프로퍼티 :
현재 스트림의 읽는 / 쓰는 위치
Stream 클래스를 활용하는 이유
⇒ 메모리의 구조와 데이터를 저장할 장치의 구조가 상이하기 때문
p. 622 ~ 625
자원을 해제하지 않는 실수를 줄이기 위한 문법
using
네임스페이스의 참조
파일, 소켓을 비롯한 자원의 관리
별칭 지시문
객체를 생성할 때 앞에 using을 붙여 using 선언
⇒ Close() 메소드를 대신하여, 코드 블록의 마지막에 Dispose() 메소드를 호출
IDispose를 상속하여 Dispose() 메소드를 구현하는 모든 객체에 대해 사용 가능
별칭 지시문
긴 객체의 이름을 별칭으로 사용할 수 있도록 한다.
예시 코드 :
using FS = System.IO.FileStream;
p. 625 ~ 628
Stream 클래스에서, 데이터를 저장할 때
byte 혹은 byte 배열 형식으로 변환해 저장해야 하는 문제
.NET에서 제공하는 도우미 클래스 :
BinaryWriter / Reader, StreamWriter / Reader
BinaryWriter / BinaryReader
스트림에 이진 데이터(Binary Data)를 기록하고 읽어 들이기 위한 목적
파일 처리의 도우미 역할
⇒ 이용하려면 Stream 파생 클래스의 인스턴스가 필요
기본 데이터 형식만 지원
→ 복합 데이터 형식 (클래스, 구조체 등)은 지원하지 않는다.
p. 629 ~ 631
StreamWriter / StreamReader
이진 데이터 처리와 사용법이 비슷하다.
p. 632 ~ 638
직렬화 (Serialization)
복합 데이터 형식 객체에 대하여, 객체의 상태(객체의 필드에 저장된 값)를
메모리나 영구 저장 장치에 저장이 가능한 0과 1의 순서로 바꾸는 것
.NET에서 지원하는 직렬화
이진 (Binary) 형식
텍스트 형식
C#에서의 직렬화
[Serializable] 어트리뷰트
BinaryFormatter
System.Runtime.Serializatino.Formatters.Binary 네임스페이스 소속
객체를 직렬화(Serialization), 역직렬화(Deserialization)하는 역할
역직렬화 후, 캐스팅으로 형식(타입)을 알려주어야 한다.
[NonSerialized] 어트리뷰트
객체에 상태를 저장하고 싶지 않은 필드에 수식하여 저장을 막는다.
직렬화하지 못하는, Serializable하지 않은 복합 데이터 형식 필드에
수식하여 오류를 막아야 한다,
자료 : 교과서 “이것이 C#이다” ch.13 대리자와 이벤트 p. 455
이벤트 기반 프로그래밍 (Event Driven Programming) :
컴퓨터에 발생하는 이벤트에 반응하도록 프로그램을 만드는 것
p. 457 ~ 471
콜백 (Callback)
다른 코드에 실행을 맡기는 코드
콜백을 맡아줄 코드는 프로그램 실행 중(런타임)에 결정된다.
C#의 경우 대리자가 콜백을 맡아 실행한다.
메소드에 대한 참조(레퍼런스)
메소드의 주소를 할당
선언 형식
한정자 delegate 반환_형식 대리자_이름( 매개변수_목록 );
ex) delegate int MyDelegate(int a, int b);
대리자는 메소드에 대한 참조
⇒ 참조할 메소드의 반환 형식과 매개변수를 명시해야 한다.
대리자는 인스턴스가 아닌 “형식(Type)”
대리자가 참조할 “메소드”의 반환 형식과 매개변수 == “대리자”의 반환 형식과 매개변수
대리자를 이용한 콜백의 구현 과정
대리자 선언
대리자 인스턴스 생성 - 참조할 메소드를 인수로 넘긴다.
대리자 호출
대리자 예제 코드 : p. 459 ~ 460
using System;
namespace Delegate
{
delegate int MyDelegate(int a, int b);
class Calculator
public int Plus(int a, int b)
{
return a + b;
}
public static int Minus(ins a, int b)
{
return a - b;
}
class MainApp
{
static void Main(string[] args)
{
Calculator Calc = new Calculator();
MyDelegate Callback;
Callback = new MyDelegate(Calc.Plus);
Console.WriteLine(Callback(3, 4));
Callback = new MyDelegate(Calc.Minus);
Console.WriteLine(Callback(7, 5));
}
}
}
값이 아닌 코드 자체를 매개변수로 넘길 때
대리자를 이용한 정렬 프로그램 예시 코드 : p. 462 ~ 464
대리자는 일반화 메소드(Generalization Method)도 참조할 수 있다.
→ 일반화 대리자
일반화 대리자는 형식 매개변수()를 이용하여 선언
대리자를 매개변수로 사용하는 메소드도,
대리자를 지원하는(대리자가 참조하는) 메소드도
형식 매개변수를 받아들이도록 한다.
대리자를 지원하는 메소드는 제약 조건이 필요할 수 있다.
⇒ 후에 자세히 배울 예정 - (제약 조건 한정자 where의 문법 포함)
C#의 모든 수치 형식(Int, Float, Double)과 String 형식은 모두 IComparable을 상속해, CompareTo() 메소드를 구현하고 있다.
앞선 예제 프로그램의 일반화 (Generalization, Generic) : p. 466 ~ 468
대리자는 하나가 여러 개의 메소드를 동시에 참조할 수 있다.
체인을 만드는 방법
+= 연산자
+와 = 연산자
Delegate.Combine() 메소드
-= 연산자
-와 = 연산자
Delegate.Remove() 메소드
대리자 체인 예시 코드 : p. 470 ~ 471
프로그램 코드 분석
UML :
소프트웨어 시스템을 개발하는 과정에서 산출물의 명세화, 시각화, 문서화할 때 사용하는 모델링 언어
즉, 구조를 다이어그램 등으로 보기 쉽게 표현하는 언어
UML을 기반하여 다이어그램 쉽게 그리는 사이트 :
https://app.diagrams.net/
C4 모델링 :
소프트웨어 아키텍처를 모델링하기 위한 표기법