# **Ruby에서 파일 처리 및 입출력(IO) 다루기** 프로그램을 작성하다 보면 데이터를 파일에 저장하거나, 파일에서 데이터를 읽어와야 할 때가 많다. Ruby에서는 파일을 간편하게 읽고 쓸 수 있는 다양한 기능을 제공한다. 이번 글에서는 **파일 읽기/쓰기, 표준 입출력(STDIN, STDOUT, STDERR), 디렉터리 작업** 등을 다룬다. --- ## **1. 파일 읽고 쓰기 (File 클래스)** Ruby에서 파일을 다룰 때는 `File` 클래스를 사용한다. 파일을 열 때는 `File.open`을 사용하며, 읽기 모드, 쓰기 모드 등을 지정할 수 있다. ### **1.1. 파일 쓰기 (`w`, `a`, `w+`, `a+`)** #### **파일 새로 쓰기 (`w` 모드)** 파일을 새로 생성하고 데이터를 저장한다. **기존 파일이 있으면 덮어쓴다.** ```ruby File.open("example.txt", "w") do |file| file.puts "Hello, Ruby!" file.puts "파일 쓰기 예제입니다." end ``` - `puts` → 문자열을 출력하고 자동으로 개행(`\n`) 추가 - `write` → 개행 없이 그대로 출력 ```ruby File.open("example.txt", "w") do |file| file.write "Hello, Ruby!" file.write "이건 개행이 없습니다." end ``` 출력 결과 (`example.txt`): ``` Hello, Ruby!이건 개행이 없습니다. ``` #### **파일 이어 쓰기 (`a` 모드)** 기존 파일이 있으면 내용을 유지하면서 **새로운 내용을 추가**한다. ```ruby File.open("example.txt", "a") do |file| file.puts "새로운 줄이 추가됩니다." end ``` #### **읽기와 쓰기 (`w+`, `a+` 모드)** - `w+` → 읽기 + 쓰기 가능, **기존 파일 삭제 후 새로 생성** - `a+` → 읽기 + 쓰기 가능, **기존 내용 유지하며 추가 가능** --- ### **1.2. 파일 읽기 (`r`, `r+`)** #### **한 줄씩 읽기 (`gets`)** ```ruby File.open("example.txt", "r") do |file| puts file.gets # 첫 번째 줄 읽기 end ``` #### **모든 줄 읽기 (`readlines`)** 파일의 모든 줄을 배열로 읽어온다. ```ruby File.open("example.txt", "r") do |file| file.readlines.each do |line| puts line end end ``` #### **파일 전체 읽기 (`read`)** 파일 내용을 한 번에 읽어 문자열로 반환한다. ```ruby content = File.read("example.txt") puts content ``` #### **파일 존재 여부 확인** ```ruby if File.exist?("example.txt") puts "파일이 존재합니다!" else puts "파일이 없습니다." end ``` --- ## **2. 파일 삭제 및 기타 기능** ### **2.1. 파일 삭제** ```ruby File.delete("example.txt") if File.exist?("example.txt") ``` ### **2.2. 파일 이름 변경** ```ruby File.rename("old_name.txt", "new_name.txt") ``` ### **2.3. 파일 크기 확인** ```ruby puts File.size("example.txt") # 바이트 단위 크기 반환 ``` --- ## **3. 표준 입출력 (STDIN, STDOUT, STDERR)** ### **3.1. 콘솔 입력 (STDIN)** 사용자로부터 입력을 받을 때는 `gets`를 사용한다. ```ruby puts "이름을 입력하세요:" name = gets.chomp # 개행 문자 제거 puts "안녕하세요, #{name}님!" ``` --- ### **3.2. 표준 출력 (STDOUT)** `puts`, `print`, `p`를 이용해 출력할 수 있다. ```ruby puts "Hello, Ruby!" # 개행 포함 print "Hello, " # 개행 없음 print "World!\n" p [1, 2, 3] # 디버깅용 출력 ``` 출력 결과: ``` Hello, Ruby! Hello, World! [1, 2, 3] ``` --- ### **3.3. 오류 출력 (STDERR)** 오류 메시지는 `STDERR.puts`를 사용해 출력할 수 있다. ```ruby STDERR.puts "이건 오류 메시지입니다!" ``` --- ## **4. 디렉터리 작업 (Dir 클래스)** ### **4.1. 디렉터리 생성 및 삭제** ```ruby Dir.mkdir("my_folder") unless Dir.exist?("my_folder") # 폴더 생성 Dir.rmdir("my_folder") # 폴더 삭제 (비어있을 때만 가능) ``` ### **4.2. 디렉터리 내 파일 목록 조회** ```ruby puts Dir.entries(".") # 현재 디렉터리의 파일 및 폴더 목록 출력 ``` --- ## **5. 실전 예제: 로그 파일 기록기** ```ruby class Logger LOG_FILE = "log.txt" def self.log(message) File.open(LOG_FILE, "a") do |file| file.puts("[#{Time.now}] #{message}") end end end Logger.log("프로그램이 실행되었습니다.") Logger.log("사용자가 로그인했습니다.") ``` 출력 (`log.txt`): ``` [2025-03-03 12:34:56] 프로그램이 실행되었습니다. [2025-03-03 12:35:10] 사용자가 로그인했습니다. ``` --- ## **6. 마무리** Ruby에서는 파일과 입출력을 간편하게 다룰 수 있다. - **파일 쓰기** → `"w"`, `"a"`, `"w+"`, `"a+"` 모드 - **파일 읽기** → `gets`, `readlines`, `read` - **파일 관리** → `File.exist?`, `File.delete`, `File.rename`, `File.size` - **입출력(IO)** → `gets`로 입력 받기, `puts`로 출력, `STDERR.puts`로 오류 출력 - **디렉터리 작업** → `Dir.mkdir`, `Dir.entries` 이제 Ruby에서 파일을 활용하여 로그 기록, 데이터 저장, 설정 파일 관리 등을 할 수 있다.