IMCAT.DEV
로그인 가입
C# 중급 네트워크

C# 파일 및 네트워크 I/O

C# 파일 및 네트워크 I/O — 중급

C# 파일 및 네트워크 I/O

1. 도입 (왜 배워야 하는가)

파일 및 네트워크 I/O(Input/Output)는 소프트웨어 개발에서 매우 중요한 부분입니다. 대부분의 애플리케이션은 데이터를 저장하고, 읽어오며, 다른 시스템과 통신하는 기능을 필요로 합니다. 예를 들어, 웹 애플리케이션은 사용자의 정보를 데이터베이스에 저장하고, 다른 서비스와 데이터를 주고받아야 합니다. 이러한 기능이 없다면 애플리케이션은 데이터 없이 동작할 수 없고, 사용자는 불편함을 겪게 됩니다.

또한, 파일 및 네트워크 I/O는 성능과 보안 측면에서도 중요한 요소입니다. 데이터를 어떻게 효율적으로 읽고 쓸 것인지, 네트워크 통신을 어떻게 안전하게 처리할 것인지 고민해야 합니다. 이를 모른다면, 애플리케이션의 성능 저하나 보안 취약점이 발생할 수 있습니다.

2. 핵심 개념 설명

  • 파일 I/O: 파일을 읽고 쓰는 작업을 말합니다. 마치 책을 읽고 내용을 기록하는 것과 비슷합니다. 책이 없으면 내용을 알 수 없고, 기록하지 않으면 나중에 기억하기 어렵습니다.
  • 네트워크 I/O: 다른 시스템과 통신하여 데이터를 주고받는 작업입니다. 이는 사람 간의 대화와 같으며, 정보가 오고 갈 수 있어야 원활한 소통이 이루어집니다.
  • 용어설명
    Stream데이터의 흐름을 나타내며, 파일이나 네트워크에서 데이터를 읽거나 쓰는 통로입니다.
    FileStream파일에서 데이터를 읽고 쓰기 위한 스트림입니다.
    TcpClientTCP 네트워크를 통해 다른 컴퓨터와 연결할 수 있게 해주는 클래스입니다.

    3. 기본 코드 예제

    파일 I/O의 기본 예제를 살펴보겠습니다. 텍스트 파일을 생성하고 내용을 기록한 후 읽어오는 과정을 보여줍니다.

    using System;
    using System.IO;
    
    class Program
    {
        static void Main()
        {
            // 파일 경로 설정
            string filePath = "example.txt";
    
            // 파일에 텍스트 쓰기
            File.WriteAllText(filePath, "안녕하세요, C# 파일 I/O!");
    
            // 파일에서 텍스트 읽기
            string content = File.ReadAllText(filePath);
            Console.WriteLine(content);
        }
    }
  • 실행 결과:
  • 안녕하세요, C# 파일 I/O!
  • 코드 한 줄씩 동작 설명:
  • 1. using System; using System.IO;: C#에서 필요한 네임스페이스를 포함합니다. 2. string filePath = "example.txt";: 파일의 경로를 설정합니다. 3. File.WriteAllText(filePath, "안녕하세요, C# 파일 I/O!");: 지정된 경로에 텍스트를 기록합니다. 4. string content = File.ReadAllText(filePath);: 파일에서 텍스트를 읽어옵니다. 5. Console.WriteLine(content);: 읽어온 내용을 콘솔에 출력합니다.

    4. 실전 활용 예제

    예제 1: 쇼핑몰 장바구니 구현

    쇼핑몰 애플리케이션에서 장바구니 정보를 파일에 저장하고, 사용자가 다시 방문했을 때 장바구니를 복원하는 기능을 구현할 수 있습니다.

    using System;
    using System.Collections.Generic;
    using System.IO;
    
    class ShoppingCart
    {
        private List<string> items;
        private string filePath = "cart.txt";
    
        public ShoppingCart()
        {
            items = new List<string>();
            LoadCart();
        }
    
        public void AddItem(string item)
        {
            items.Add(item);
            SaveCart();
        }
    
        private void SaveCart()
        {
            File.WriteAllLines(filePath, items);
        }
    
        private void LoadCart()
        {
            if (File.Exists(filePath))
            {
                items.AddRange(File.ReadAllLines(filePath));
            }
        }
    
        public void ShowCart()
        {
            Console.WriteLine("장바구니 내용:");
            foreach (var item in items)
            {
                Console.WriteLine(item);
            }
        }
    }
  • 사용자가 아이템을 추가할 때마다 장바구니 내용을 파일에 저장하고, 애플리케이션 시작 시 파일에서 장바구니를 불러옵니다.
  • 예제 2: 네트워크 데이터 송수신

    TCP 클라이언트를 사용하여 서버에 데이터를 전송하고 응답을 받는 기본 구조입니다.

    using System;
    using System.Net.Sockets;
    using System.Text;
    
    class SimpleTcpClient
    {
        static void Main()
        {
            TcpClient client = new TcpClient("localhost", 8080);
            NetworkStream stream = client.GetStream();
    
            // 서버에 메시지 전송
            byte[] data = Encoding.ASCII.GetBytes("안녕하세요, 서버!");
            stream.Write(data, 0, data.Length);
    
            // 서버로부터 응답 수신
            byte[] responseData = new byte[256];
            int bytes = stream.Read(responseData, 0, responseData.Length);
            Console.WriteLine("서버 응답: " + Encoding.ASCII.GetString(responseData, 0, bytes));
    
            stream.Close();
            client.Close();
        }
    }
  • 이 코드는 로컬 서버에 연결하여 메시지를 보내고, 서버로부터 응답을 받는 예제입니다.
  • 5. 흔한 실수와 주의사항

    실수 1: 파일 경로 오류

    잘못된 경로를 지정하면 FileNotFoundException이 발생합니다.

  • 잘못된 코드:
  • File.ReadAllText("wrongPath.txt");
  • 올바른 코드:
  • File.ReadAllText("correctPath.txt");

    실수 2: 스트림 닫기

    스트림을 닫지 않으면 리소스 누수가 발생합니다.

  • 잘못된 코드:
  • NetworkStream stream = client.GetStream();
    // 작업 수행
  • 올바른 코드:
  • using (NetworkStream stream = client.GetStream())
    {
        // 작업 수행
    }

    6. 정리

  • 파일 및 네트워크 I/O는 애플리케이션에서 데이터를 저장하고, 읽어오는 데 필수적입니다.
  • 파일 I/O는 데이터의 영속성을 보장하며, 네트워크 I/O는 시스템 간의 통신을 가능하게 합니다.
  • 기본적인 파일 읽기 및 쓰기, TCP 클라이언트 사용법을 익혔습니다.
  • 다음 학습 주제로는 비동기 프로그래밍이나 데이터베이스 I/O를 추천합니다.