프로그래밍에서 파일 입출력(I/O)은 필수적인 개념으로, 파일 시스템과의 상호작용을 통해 데이터를 읽고 쓰는 과정을 포함합니다. 특히 C#에서는 이러한 파일 작업이 로깅, 구성 관리, 데이터 저장 등 다양한 응용 프로그램에서 중요한 역할을 합니다. 이번 블로그 포스트에서는 C#에서 파일 I/O의 주요 개념과 실용적인 예제를 통해 효율적인 데이터 관리 방법을 알아보겠습니다.
파일 I/O의 기본 개념
파일 I/O의 목적
파일 I/O의 주된 목적은 프로그램 실행 중 데이터를 지속적으로 저장하여 나중에 다시 불러올 수 있도록 하는 것입니다. 이를 통해 정보의 영속성을 보장하고, 필요 시 데이터를 쉽게 접근할 수 있습니다.
파일 유형
C#에서는 다양한 파일 유형을 다룰 수 있습니다:
- 텍스트 파일: 일반 텍스트 형식으로 저장된 파일
- 바이너리 파일: 이진 형식으로 저장된 데이터
- 구조화된 파일: XML, JSON 등 특정 구조를 가진 파일
파일 스트림
파일을 읽고 쓰기 위해 C#에서는 스트림을 사용합니다. 스트림은 읽거나 쓸 수 있는 바이트의 연속을 나타내며, 파일 작업의 기본 단위로 사용됩니다.
주요 파일 I/O 작업
파일 읽기
파일을 읽기 위해 StreamReader 객체를 사용합니다. 전체 내용을 한 번에 읽거나 한 줄씩 읽을 수 있습니다.
using System;
using System.IO;
class Program
{
static void Main()
{
string path = "example.txt"; // 파일 경로
try
{
using (StreamReader sr = new StreamReader(path))
{
string line;
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line); // 각 줄을 출력합니다
}
}
}
catch (Exception e)
{
Console.WriteLine($"프로세스가 실패했습니다: {e.Message}");
}
}
}
파일 쓰기
파일에 데이터를 쓰기 위해 StreamWriter를 사용합니다. 한 번에 모든 내용을 쓸 수도 있고, 순차적으로 줄을 추가할 수도 있습니다.
using System;
using System.IO;
class Program
{
static void Main()
{
string path = "output.txt"; // 출력 경로
try
{
using (StreamWriter sw = new StreamWriter(path))
{
sw.WriteLine("Hello World!"); // 첫 번째 줄 쓰기
sw.WriteLine("This is an example."); // 두 번째 줄 쓰기
Console.WriteLine("데이터가 성공적으로 작성되었습니다.");
}
}
catch (Exception e)
{
Console.WriteLine($"프로세스가 실패했습니다: {e.Message}");
}
}
}
파일 경로와 인코딩
파일 작업 시 절대 경로와 상대 경로를 이해하는 것이 중요합니다. 또한, 텍스트 인코딩은 파일을 읽고 쓸 때 문자가 바이트로 어떻게 표현되는지를 결정합니다(예: UTF-8).
오류 처리
파일 작업을 수행할 때는 항상 오류 처리를 구현해야 합니다. 누락된 파일이나 권한 오류와 같은 문제가 발생할 수 있기 때문입니다.
실용적인 예제
파일에서 읽기
텍스트 파일에서 모든 줄을 읽는 방법을 보여주는 예제입니다.
파일에 쓰기
텍스트 파일에 내용을 쓰는 방법을 살펴보겠습니다.
읽기 및 쓰기 작업 결합
기존 내용을 읽고 약간 수정한 후 다시 쓰는 응용 프로그램이 필요할 수 있습니다.
using System;
using System.IO;
class Program
{
static void Main()
{
string inputPath = "input.txt";
string outputPath = "modified_output.txt";
try
{
using (StreamReader sr = new StreamReader(inputPath))
{
using(StreamWriter sw = new StreamWriter(outputPath))
{
string line;
while ((line = sr.ReadLine()) != null)
{
sw.WriteLine(line.ToUpper()); // 쓰기 전에 내용을 수정합니다
}
}
}
Console.WriteLine("내용이 수정되어 성공적으로 저장되었습니다.");
}
catch(Exception e)
{
Console.WriteLine($"오류가 발생했습니다: {e.Message}");
}
}
}
결론
C#에서 파일 I/O를 이해하면 지속적인 저장 솔루션을 포함하는 실제 응용 프로그램을 개발하는 데 필요한 필수 기능을 개발자에게 제공합니다. 이러한 개념을 숙달하면 간단한 작업을 처리할 수 있을 뿐만 아니라 더 큰 데이터 세트를 효과적으로 처리하는 강력한 응용 프로그램을 구축할 수 있습니다.
'프로그래밍 > C#' 카테고리의 다른 글
| C#에서 파일 I/O와 직렬화의 중요성 및 실용적인 활용법 (0) | 2025.08.30 |
|---|---|
| C# 파일 I/O 스트림의 이해와 활용 (0) | 2025.08.30 |
| C#에서의 예외 처리: Finally 블록의 중요성과 활용 (0) | 2025.08.29 |
| C#에서의 예외 처리와 사용자 정의 예외의 중요성 (2) | 2025.08.28 |
| C#에서 예외 처리를 통한 안정적인 애플리케이션 개발 (1) | 2025.08.28 |