메모장은 가장 단순하면서도 실용적인 프로그램 중 하나입니다. 사용자가 입력한 내용을 파일에 저장하고, 다시 불러와서 편집할 수 있는 기능은 모든 운영체제에서 기본적으로 제공됩니다. 자바(Java)를 활용하면 콘솔 기반 혹은 간단한 GUI를 통해 메모장을 쉽게 구현할 수 있습니다. 이 과정에서 파일 입출력, 예외 처리, 사용자 입력, 문자열 처리 같은 기본기를 한 번에 학습할 수 있으며, 프로그램을 점진적으로 발전시켜 나갈 수도 있습니다. 이번 글에서는 파일 입출력을 활용한 자바 메모장 프로그램을 구현하는 과정을 저장, 읽기, 관리라는 세 가지 관점에서 정리해 보겠습니다.
파일 저장 기능 구현하기
메모장의 핵심은 사용자가 입력한 내용을 파일에 안전하게 저장하는 것입니다. 자바에서는 FileWriter
, BufferedWriter
, PrintWriter
같은 클래스를 이용해 텍스트 파일에 데이터를 쓸 수 있습니다. 기본 구조는 다음과 같습니다.
import java.io.*;
import java.util.Scanner;
public class MemoApp {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("메모할 내용을 입력하세요. 저장하려면 'exit' 입력:");
try (BufferedWriter writer = new BufferedWriter(new FileWriter("memo.txt", true))) {
String line;
while (true) {
line = scanner.nextLine();
if (line.equals("exit")) break;
writer.write(line);
writer.newLine();
}
System.out.println("메모가 memo.txt 파일에 저장되었습니다.");
} catch (IOException e) {
System.out.println("파일 저장 중 오류 발생: " + e.getMessage());
}
}
}
위 코드는 사용자가 입력한 문자열을 memo.txt
파일에 한 줄씩 저장합니다. "exit"을 입력하면 프로그램이 종료되고 파일 쓰기를 마칩니다. 여기서 중요한 점은 FileWriter
생성자에 두 번째 매개변수로 true
를 전달해 기존 파일에 이어서 내용을 저장(append)할 수 있다는 것입니다. 만약 false
로 두거나 생략하면 매번 실행할 때마다 기존 내용이 덮어씌워집니다.
저장 기능을 구현하면서 초보자가 주의할 점은 다음과 같습니다.
- 파일 경로: 운영체제에 따라 경로가 달라질 수 있으므로 절대 경로와 상대 경로를 명확히 이해해야 합니다.
- 예외 처리: 파일 입출력은 IOException이 자주 발생하므로 try-catch 블록으로 안전하게 처리해야 합니다.
- 자원 해제: 파일 입출력 스트림은 반드시 닫아야 하며, try-with-resources 구문을 사용하면 자동으로 닫히므로 실수를 줄일 수 있습니다.
파일 읽기 기능 구현하기
메모장 프로그램은 단순히 저장만 하는 것이 아니라, 기존 파일을 불러와서 확인하거나 수정할 수 있어야 합니다. 자바에서는 FileReader
, BufferedReader
를 사용하면 파일 내용을 줄 단위로 읽어올 수 있습니다. 예제 코드는 다음과 같습니다.
import java.io.*;
public class MemoReader {
public static void main(String[] args) {
try (BufferedReader reader = new BufferedReader(new FileReader("memo.txt"))) {
String line;
System.out.println("memo.txt 내용:");
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.out.println("파일 읽기 중 오류 발생: " + e.getMessage());
}
}
}
위 코드는 memo.txt
파일의 모든 내용을 한 줄씩 읽어 출력합니다. readLine()
메서드는 파일 끝에 도달하면 null
을 반환하므로 이를 기준으로 반복문을 종료합니다.
읽기 기능을 구현할 때 주의해야 할 점은 다음과 같습니다.
- 파일이 존재하지 않는 경우:
FileNotFoundException
이 발생할 수 있으므로 이를 별도로 처리하거나 사용자에게 새 파일을 생성하도록 안내해야 합니다. - 인코딩 문제: 텍스트 파일은 운영체제나 작성 프로그램에 따라 인코딩이 다를 수 있습니다.
InputStreamReader
에 문자셋을 지정하면 안정적으로 처리할 수 있습니다. - 메모리 관리: 작은 메모장이라면 상관없지만, 대용량 파일을 한 번에 읽으려 하면 메모리 부족 문제가 생길 수 있으므로 스트리밍 방식으로 읽는 것이 바람직합니다.
저장과 읽기 관리 확장하기
저장과 읽기 기능만으로도 기본적인 메모장은 완성되지만, 프로그램을 조금 더 확장하면 실용적인 도구가 될 수 있습니다. 몇 가지 확장 아이디어는 다음과 같습니다.
- 메뉴 기반 선택 기능: Scanner를 활용해 사용자가 "1: 새 메모 저장, 2: 메모 불러오기, 3: 종료"와 같은 메뉴를 선택하도록 하면 프로그램이 훨씬 직관적이 됩니다.
- 여러 개의 파일 관리: 단일 memo.txt 대신 사용자 입력으로 파일명을 지정해 원하는 주제별 메모를 저장할 수 있습니다. 예: "work.txt", "study.txt" 등.
- 삭제와 수정 기능: 특정 줄을 삭제하거나 수정하려면 파일 전체를 읽은 뒤 수정된 내용을 다시 저장해야 합니다. 이 과정에서 임시 파일을 활용하면 안정적으로 데이터를 다룰 수 있습니다.
- GUI 기반 메모장 확장: Swing이나 JavaFX를 이용하면 윈도우 창 기반의 메모장을 구현할 수 있습니다. 텍스트 영역(JTextArea)에 내용을 입력하고 버튼을 눌러 저장·불러오기 기능을 연동하면 간단한 데스크톱 애플리케이션으로 발전합니다.
- 자동 저장 기능: 일정 시간마다 자동으로 파일에 저장하도록 타이머를 두면, 사용자가 실수로 종료하더라도 기록을 보존할 수 있습니다.
결론: 파일 입출력은 자바 학습의 핵심
파일 입출력을 활용한 메모장 프로그램은 단순하지만, 자바 기초 학습에 큰 도움이 되는 프로젝트입니다. FileWriter
와 FileReader
, BufferedWriter
와 BufferedReader
를 사용하며 예외 처리, 자원 관리, 사용자 입력 처리 같은 중요한 개념을 실습할 수 있습니다. 덧붙여 저장, 읽기, 관리라는 기능을 확장하면서 프로그램 설계와 유지보수 능력도 함께 키울 수 있습니다.
메모장은 모든 개발자가 한 번쯤 만들어 보는 연습 프로젝트지만, 이를 단순히 따라 하는 것에 그치지 않고 파일 관리 기능이나 GUI 확장, 자동 저장 같은 기능을 추가하면서 자기만의 버전으로 발전시킨다면 실무에서도 응용 가능한 역량을 기를 수 있습니다. 작은 메모장 프로젝트를 완성하는 경험은 자바 프로그래밍의 기본기를 탄탄히 다지는 좋은 출발점이 될 것입니다.