C# I/O

이동근·2026년 1월 14일

C#

목록 보기
4/9

I/O

  • Input/Output : 입력/출력

    • Input : 프로그램으로 데이터를 가져오는 것

    • Output : 프로그램에서 데이터를 내보내는 것

I/O 종류용도주요 클래스설명 / 예시
콘솔(Console)사용자와 대화Console키보드 입력, 화면 출력
파일(File)간단한 파일 읽기/쓰기File파일 전체를 읽거나 쓰기, 간단한 작업에 적합
스트림(Stream)큰 데이터, 세밀한 제어StreamReader, StreamWriter텍스트 단위 읽기/쓰기, 버퍼 사용 가능
바이너리(Binary)이진 데이터BinaryReader, BinaryWriter이미지, 오디오, 비디오 등 이진 파일 처리
  • 메모리를 효율적으로 사용하기 위해 I/O에서 Stream을 주로 사용

Stream

Stream 데이터 표현

byte [] buffer;
  • Stream은 결국 바이트 배열로 데이터를 주고 받는다

stream 데이터 종류

Stream (추상 클래스 - 최상위 부모)
  │
  ├─ FileStream        → 파일 데이터
  ├─ MemoryStream      → 메모리 내 데이터 (임시 저장, 변환 작업)
  ├─ NetworkStream     → 네트워크 데이터
  ├─ GZipStream        → 압축 데이터
  ├─ CryptoStream      → 암호화 데이터
  ├─ StreamReader, StreamWriter  → 문자열 데이터
  └─ BufferedStream    → 버퍼링된 데이터

정리된 개념도

┌─────────────────────────────────────┐
│  모든 데이터는 결국 byte[] (바이트)  │
└─────────────────────────────────────┘
                  │
                  ↓
         ┌────────────────┐
         │  Stream (추상)  │  ← 최상위 부모
         └────────────────┘
                  │
      ────────────┼────────────
      │           │           │
┌──────────┐ ┌─────────────┐ ┌──────────────┐
│FileStream│ │MemoryStream │ │NetworkStream │
└──────────┘ └─────────────┘ └──────────────┘
     │             │               │
     ↓             ↓               ↓
  파일 데이터   메모리 작업    네트워크 데이터
  (txt, jpg,   (임시 저장,     (패킷,
   mp3, etc)    변환 작업)      TCP/UDP)

파일 시스템

Stream 계열 (데이터 흐름 처리)

바이트 단위

  • FileStream : 파일을 바이트로 읽기/쓰기
  • BinaryReader : 바이너리 데이터 읽기
  • BinaryWriter : 바이너리 데이터 쓰기

문자열 단위

  • StreamReader : 텍스트 파일 읽기
  • StreamWriter : 텍스트 파일 쓰기
  • StringReader : 문자열을 Stream처럼 읽기
  • StringWriter : 문자열을 Stream처럼 쓰기

파일/디렉토리 관리 계열

정적 클래스

  • 인스턴스를 만들 수 없음 → 행위(메서드)만 존재 → 속성이 존재하지 않음

  • File : 파일 생성, 복사, 삭제, 읽기/쓰기

  • Directory : 디렉토리 생성, 삭제, 탐색

  • Path : 경로 문자열 처리

인스턴스 클래스(상세 정보)

  • 객체 생성이 필요 → 속성 + `메서드 존재

  • FileInfo : 파일 정보 (파일 이름, 크기, 날찌 등)

  • DirectoryInfo : 디렉토리 정보

모니터링

  • FileSystemWatcher : 파일/폴더 변경 감시

구조도

구조도

파일 시스템 관련 클래스
│
├─ Stream 계열 (데이터 읽기/쓰기)
│   ├─ 바이트: FileStream, BinaryReader, BinaryWriter
│   └─ 텍스트: StreamReader, StreamWriter, StringReader, StringWriter
│
└─ 파일 관리 계열
    ├─ 파일: File, FileInfo
    ├─ 디렉토리: Directory, DirectoryInfo
    ├─ 경로: Path
    └─ 감시: FileSystemWatcher

인코딩/디코딩

  • 인코딩 : 문자(사람이 읽는 것)를 바이트(컴퓨터가 저장하는 것)로 변환하는 과정

    • UTF-8 : 한글을 지원하지만 일부 윈도우 프로그램에서는 한글이 깨짐

    • UTF-8-BOM : 윈도우 프로그램에서 한글이 깨지지 않음

    • EUC-KR : 구형 한국 시스템

    • CP949 : 윈도우 한글 환경, 레거시 시스템에서 사용

    • KS_C_5601-1987 : 한국 산업 표준으로 가장 많이 사용

  • 디코딩 : 바이트(컴퓨터가 저장하는 거섀)를 문자(사람이 읽는 것)로 변환하는 과정


using

  • using : 다른 네임스페이스의 클래스를 간단하게 사용할 수 있게 해줍니다.

    • java나 python에 import와 유사

    • 리소스 자동 해제 (Dispose패턴)

      • Dispose : 사용한 리소스를 반납하는 것

      • 리소스 : 컴퓨터의 자원 (파일, 데이터베이스 연결, 네트워크 연결, 메모리)

      • 파일을 열었지만 닫지 않은 경우를 방지하기 위해

        • 파일을 계속 "열린 상태"로 둔다면 메모리를 계속 소요 → 프로그램이 느려지거나 오류 발생
    • using을 사용할 경우 리소스를 자동으로 해제

      • using을 사용하지 않을 겨우 수동으로 리소스를 해제 시켜야함

using으로 인한 Dispose 사용

using (FileStream fs  = new FileStream
			(
				Path.Combine(Application.StartupPath, "text.txt"),
                // 보통은 Create, /OpenOrCreate 사용
				FileMode.OpenOrCreate, 
                // FileAccess -> 내가 무엇을 할지 (읽을것인지, 쓸것인지, 읽기쓰기 둘다 할지)
				FileAccess.Write 
                // FileShare -> 상대방은 무엇을 할지 (보통 상대방은 읽기만 가능하도록 구현)
				FileShare.Read 
			))
			{
				string textData = "테스트입니다.";
				// 바이트로 전환 작업 -> string으로는 확인할 수 없기 때문
				Encoding kor = Encoding.GetEncoding("ks_c_5601-1987");
				byte [] buffer = kor.GetBytes(testData);
				fs.Write(buffer, 0, buffer.Length)
			};
profile
안녕하세요

0개의 댓글