202 lines
4.9 KiB
Markdown
202 lines
4.9 KiB
Markdown
# **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에서 파일을 활용하여 로그 기록, 데이터 저장, 설정 파일 관리 등을 할 수 있다. |