경일게임아카데미 멀티 디바이스 메타버스 플랫폼 개발자 양성과정 20220810 2022/04/04~2022/12/14

Jinho Lee·2022년 8월 10일
0

2022.08.10 경일 메타버스 19주차 3일 수업내용. 파일 다루기, 대리자와 이벤트, 코드 분석 팁

파일 다루기

  • 자료 : 교과서 “이것이 C#이다” ch.18 파일 다루기 p. 603

파일 정보와 디렉터리 정보 다루기

  • p. 605 ~ 606

  • 파일(File) :
    컴퓨터 저장 매체에 기록되는 데이터의 묶음

  • 디렉터리(Directory) :
    파일이 위치하는 주소.
    폴더.

  • .NET은 파일과 디렉터리 정보를 다루기 위해
    System.IO 네임스페이스와 그 아래의 클래스들을 제공한다.

System.IO

  • File

    • 파일의 생성, 복사, 삭제, 이동, 조회

    • 정적 메소드

    • 주로 하나의 파일에 한두 가지 작업을 수행할 때 활용

  • FileInfo

    • File과 같은 역할

    • 인스턴스 메소드

    • 하나의 파일에 여러 작업을 수행할 때 활용

  • Directory

    • 디렉터리의 생성, 복사, 삭제, 이동, 조회

    • 정적 메소드

    • 하나의 디렉터리에 한두 가지 작업을 수행할 때 활용

  • DirectoryInfo

    • Directory와 같은 역할

    • 인스턴스 메소드

    • 하나의 디렉터리에 여러 작업을 수행할 때 활용

  • 주요 메소드

    기능FileFileInfoDirectoryDirectoryInfo
    생성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()

스트림 (Stream)

  • p. 612 ~ 622

스트림(Stream)이란?

  • 데이터가 흐르는 통로

  • 데이터를 옮길 때 (즉 파일을 쓸 때), 메모리와 저장 매체 사이에 스트림을 만들어 연결한 후 데이터를 바이트 단위로 옮긴다.

  • 순차 접근 방식 (Sequential Access) :
    스트림은 데이터의 흐름 ⇒ 순서대로 읽고 쓴다.

    • 네트워크의 방식과도 통하기에,
      파일이 아닌 네트워크에도 데이터를 흘려보낼 수 있다.

    • 반대 개념 : 임의 접근 방식 (Random Access)
      임의의 주소
      에 있는 데이터에 접근

System.IO 네임스페이스의 Stream 클래스

  • 입력, 출력 스트림 모두 할 수 있다.

  • 순차 접근 방식과 임의 접근 방식 모두 지원한다.

  • 추상 클래스

    • 인스턴스를 만들 수 없다.

    • 파생된 클래스를 이용

    • 이유 :
      스트림이 다루는 다양한 매체, 장치들에 대한 파일 입출력을 스트림 모델 하나로 다룰 수 있도록 하기 위함

    • 파생 클래스

      1. FileStream :
        디스크 파일
        에 데이터를 기록

      2. NetworkStream :
        네트워크 피어
        에 데이터를 전송

      3. GZipStream :
        데이터를 GZip(GNU Zip)형식으로 압축

      4. BufferedStream :
        데이터를 메모리 버퍼에 담아두었다가 일정량이 쌓일 때마다 기록

  • Stream의 Write(), WriteByte() 메소드 :
    매개변수로 byte, byte 배열만 입력 가능

    • BitConverter 클래스 :
      다른 데이터 형식을 byte 배열로 변환
  • Position 프로퍼티 :
    현재 스트림의 읽는 / 쓰는 위치

  • Stream 클래스를 활용하는 이유
    메모리의 구조와 데이터를 저장할 장치의 구조가 상이하기 때문

using 선언을 활용한 자원 해제

  • p. 622 ~ 625

  • 자원을 해제하지 않는 실수를 줄이기 위한 문법

  • using

    • 사용
    1. 네임스페이스의 참조

    2. 파일, 소켓을 비롯한 자원의 관리

    3. 별칭 지시문

    • 객체를 생성할 때 앞에 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) 형식

    • 텍스트 형식

      • JSON (JavaScript Object Notation), XML 등
  • C#에서의 직렬화

    • [Serializable] 어트리뷰트

      • 파일로 저장할 수 있는 형식으로 변환
    • BinaryFormatter

      • System.Runtime.Serializatino.Formatters.Binary 네임스페이스 소속

      • 객체를 직렬화(Serialization), 역직렬화(Deserialization)하는 역할

      • 역직렬화 후, 캐스팅으로 형식(타입)을 알려주어야 한다.

    • [NonSerialized] 어트리뷰트

      • 객체에 상태를 저장하고 싶지 않은 필드에 수식하여 저장을 막는다.

      • 직렬화하지 못하는, Serializable하지 않은 복합 데이터 형식 필드
        수식하여 오류를 막아야 한다,

대리자와 이벤트

  • 자료 : 교과서 “이것이 C#이다” ch.13 대리자와 이벤트 p. 455

  • 이벤트 기반 프로그래밍 (Event Driven Programming) :
    컴퓨터에 발생하는 이벤트에 반응하도록 프로그램을 만드는 것

대리자 (Delegate)

  • p. 457 ~ 471

  • 콜백 (Callback)

    • 다른 코드에 실행을 맡기는 코드

    • 콜백을 맡아줄 코드프로그램 실행 중(런타임)에 결정된다.

    • C#의 경우 대리자가 콜백을 맡아 실행한다.

대리자 (Delegate)

  • 메소드에 대한 참조(레퍼런스)

  • 메소드의 주소를 할당

  • 선언 형식

    한정자 delegate 반환_형식 대리자_이름( 매개변수_목록 );
    
    ex) delegate int MyDelegate(int a, int b);
  • 대리자는 메소드에 대한 참조
    ⇒ 참조할 메소드의 반환 형식매개변수를 명시해야 한다.

  • 대리자는 인스턴스가 아닌 “형식(Type)

    • 따라서, 사용하려면 인스턴스를 따로 만들어야 한다.
  • 대리자가 참조할 “메소드”의 반환 형식과 매개변수 == “대리자”의 반환 형식과 매개변수

  • 대리자를 이용한 콜백의 구현 과정

    1. 대리자 선언

    2. 대리자 인스턴스 생성 - 참조할 메소드를 인수로 넘긴다.

    3. 대리자 호출

  • 대리자 예제 코드 : 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));
            }
        }
    }

대리자를 사용하는 이유

일반화 대리자

  • 대리자는 일반화 메소드(Generalization Method)도 참조할 수 있다.
    일반화 대리자

    • 일반화 ← 제너릭(Generic), 템플릿(Template), (형식 매개변수)
  • 일반화 대리자형식 매개변수()를 이용하여 선언

    • 대리자를 매개변수로 사용하는 메소드도,
      대리자를 지원하는(대리자가 참조하는) 메소드도
      형식 매개변수를 받아들이도록 한다.

    • 대리자를 지원하는 메소드는 제약 조건이 필요할 수 있다.
      ⇒ 후에 자세히 배울 예정 - (제약 조건 한정자 where의 문법 포함)

    • C#의 모든 수치 형식(Int, Float, Double)과 String 형식은 모두 IComparable을 상속해, CompareTo() 메소드를 구현하고 있다.

    • 앞선 예제 프로그램의 일반화 (Generalization, Generic) : p. 466 ~ 468

    2022. 08. 10 일반화 대리자를 이용한 정렬 프로그램 예시 코드

대리자 체인

  • 대리자는 하나가 여러 개의 메소드를 동시에 참조할 수 있다.

  • 체인을 만드는 방법

  1. += 연산자

  2. +와 = 연산자

  3. Delegate.Combine() 메소드

  • 체인을 끊어내는 방법
  1. -= 연산자

  2. -와 = 연산자

  3. Delegate.Remove() 메소드

코드 분석 팁

  • 프로그램 코드 분석

    UML :
    소프트웨어 시스템을 개발하는 과정에서 산출물의 명세화, 시각화, 문서화할 때 사용하는 모델링 언어
    즉, 구조를 다이어그램 등으로 보기 쉽게 표현하는 언어

    UML을 기반하여 다이어그램 쉽게 그리는 사이트 :
    https://app.diagrams.net/

    C4 모델링 :
    소프트웨어 아키텍처를 모델링하기 위한 표기법

    https://velog.io/@jun_/C4-모델링

0개의 댓글