이번 단계에서는 Java 콘솔 메모장에 실제 CRUD 기능을 붙였다.
이전 단계에서는 메뉴만 출력하고, 각 메뉴를 선택했을 때 “아직 구현되지 않았습니다.”라는 안내 문구만 출력했다.
이번에는 사용자가 콘솔에서 직접 메모를 작성하고, 목록을 보고, 수정하고, 삭제할 수 있도록 만들었다.
현재 프로그램 흐름
현재 콘솔 메모장은 다음과 같은 메뉴를 가진다.
===== 메모장 =====
1. 메모 작성
2. 메모 목록 보기
3. 메모 수정
4. 메모 삭제
0. 종료
메뉴 선택:
사용자는 번호를 입력해서 원하는 기능을 실행한다.
1 → 메모 작성
2 → 메모 목록 보기
3 → 메모 수정
4 → 메모 삭제
0 → 프로그램 종료
이전에는 메뉴만 있었고 실제 기능은 없었다.
이번 단계부터는 각 메뉴가 실제로 메모 데이터를 처리한다.
메모를 저장할 List 만들기
여러 개의 메모를 저장하기 위해 List를 사용했다.
List<String[]> memos = new ArrayList<>();
여기서 memos는 전체 메모 목록이다.
메모 하나는 아직 별도의 클래스로 만들지 않고, 문자열 배열로 저장했다.
String[] memo = {title, content};
현재 구조에서는 메모 하나가 다음처럼 구성된다.
memo[0] = 제목
memo[1] = 내용
즉, 전체 메모 목록은 개념적으로 이런 형태가 된다.
memos
→ [
["제목1", "내용1"],
["제목2", "내용2"],
["제목3", "내용3"]
]
JavaScript에서 배열에 메모 객체를 넣었던 것과 비슷하다.
JavaScript에서는 다음처럼 추가했다.
memos.push(newMemo)
Java에서는 다음처럼 추가한다.
memos.add(memo);
입력 처리는 nextLine으로 통일
처음에는 메뉴 입력에 scanner.nextInt()를 사용했다.
하지만 이후 제목과 내용 입력까지 함께 처리하다 보니 nextInt()와 nextLine()을 섞어 쓰는 것이 헷갈릴 수 있었다.
그래서 이번에는 입력 처리를 nextLine() 기준으로 통일했다.
int menu = Integer.parseInt(scanner.nextLine());
이 코드는 사용자가 입력한 문자열을 숫자로 변환해서 메뉴 번호로 사용한다.
제목과 내용도 nextLine()으로 입력받았다.
String title = scanner.nextLine();
String content = scanner.nextLine();
이렇게 하니 메뉴 입력, 제목 입력, 내용 입력 흐름을 한 방식으로 처리할 수 있었다.
1번: 메모 작성
1번 메뉴를 선택하면 제목과 내용을 입력받는다.
if (menu == 1) {
System.out.println("제목을 입력해 주세요");
String title = scanner.nextLine();
System.out.println("내용을 입력해 주세요");
String content = scanner.nextLine();
String[] memo = {title, content};
memos.add(memo);
System.out.println("저장 완료되었습니다.");
}
흐름은 다음과 같다.
제목 입력 안내
→ 제목 입력받기
→ 내용 입력 안내
→ 내용 입력받기
→ 제목과 내용을 String[]로 묶기
→ memos에 추가하기
→ 저장 완료 메시지 출력
여기서 중요한 부분은 제목과 내용을 하나의 메모로 묶는 부분이다.
String[] memo = {title, content};
그리고 이 메모 하나를 전체 메모 목록에 추가한다.
memos.add(memo);
이제 프로그램이 실행 중인 동안에는 작성한 메모가 memos 리스트 안에 저장된다.
2번: 메모 목록 보기
2번 메뉴를 선택하면 저장된 메모 목록을 출력한다.
else if (menu == 2) {
if (memos.isEmpty()) {
System.out.println("작성된 메모가 없습니다.");
} else {
for (int i = 0; i < memos.size(); i++) {
String[] memo = memos.get(i);
System.out.println((i + 1) + ". " + memo[0]);
System.out.println(memo[1]);
}
}
}
먼저 메모가 비어 있는지 확인했다.
memos.isEmpty()
메모가 없으면 안내 문구를 출력한다.
작성된 메모가 없습니다.
메모가 있으면 for문으로 전체 메모를 출력한다.
for (int i = 0; i < memos.size(); i++)
그리고 memos.get(i)로 i번째 메모를 꺼낸다.
String[] memo = memos.get(i);
출력할 때는 i + 1을 사용했다.
System.out.println((i + 1) + ". " + memo[0]);
Java 리스트의 index는 0부터 시작하지만, 사용자에게 보여줄 번호는 1부터 시작하는 것이 자연스럽기 때문이다.
리스트 index: 0, 1, 2
사용자 번호: 1, 2, 3
3번: 메모 수정
3번 메뉴에서는 수정할 메모 번호를 입력받고, 해당 메모를 새 제목과 새 내용으로 교체한다.
수정 기능의 흐름은 다음과 같다.
수정할 메모 번호 입력
→ 사용자 번호를 index로 변환
→ index 범위 검사
→ 새 제목 입력
→ 새 내용 입력
→ 새 메모 배열 생성
→ memos.set(index, updatedMemo)로 교체
사용자가 보는 번호는 1부터 시작하지만, List의 index는 0부터 시작한다.
그래서 다음 계산이 필요하다.
int index = memoNumber - 1;
예를 들어 사용자가 1번 메모를 수정하려고 하면 실제 index는 0이다.
사용자 번호 1 → index 0
사용자 번호 2 → index 1
사용자 번호 3 → index 2
범위 검사도 필요하다.
if (index < 0 || index >= memos.size()) {
System.out.println("올바른 메모 번호를 입력하세요.");
}
이 검사를 하지 않으면 존재하지 않는 위치에 접근할 수 있다.
올바른 번호라면 새 제목과 내용을 입력받아 기존 메모를 교체한다.
String[] updatedMemo = {newTitle, newContent};
memos.set(index, updatedMemo);
여기서 memos.set(index, updatedMemo)는 해당 위치의 메모를 새 메모로 바꾸는 코드다.
4번: 메모 삭제
4번 메뉴에서는 삭제할 메모 번호를 입력받고, 해당 메모를 삭제한다.
삭제 기능은 수정 기능과 흐름이 거의 비슷하다.
삭제할 메모 번호 입력
→ 사용자 번호를 index로 변환
→ index 범위 검사
→ memos.remove(index)로 삭제
삭제의 핵심은 다음 코드다.
memos.remove(index);
이 코드는 memos 리스트에서 해당 index 위치의 메모를 제거한다.
예를 들어 사용자가 2번 메모를 삭제한다고 하면,
int index = 2 - 1;
결과는 다음과 같다.
index = 1;
따라서 다음 코드로 두 번째 메모가 삭제된다.
memos.remove(1);
수정과 삭제의 공통점
수정과 삭제는 모두 사용자가 보는 번호와 실제 List index를 연결해야 한다.
사용자 번호 1 → index 0
사용자 번호 2 → index 1
사용자 번호 3 → index 2
그래서 공통적으로 다음 계산을 사용한다.
int index = memoNumber - 1;
그리고 잘못된 번호가 들어오지 않도록 범위 검사를 한다.
if (index < 0 || index >= memos.size()) {
System.out.println("올바른 메모 번호를 입력하세요.");
}
이 부분은 단순해 보이지만 중요했다.
사용자가 존재하지 않는 번호를 입력했을 때 프로그램이 바로 오류로 멈추지 않도록 막아주는 역할을 한다.
현재 사용한 자료구조
이번 단계에서는 List<String[]> 구조를 사용했다.
List<String[]> memos = new ArrayList<>();
메모 하나를 String[]로 다루는 방식이다.
String[] memo = {title, content};
아직 완성형 구조는 아니다.
제목은 memo[0], 내용은 memo[1]로 접근해야 하기 때문에 코드가 길어지면 헷갈릴 수 있다.
나중에는 String[] 대신 Memo 클래스를 만들어서 더 명확하게 바꿀 예정이다.
예를 들면 다음과 같은 구조다.
class Memo {
private String title;
private String content;
}
하지만 지금 단계에서는 클래스 설계보다 Java에서 CRUD 흐름을 먼저 익히는 것이 목적이다.
그래서 배열과 리스트를 이용해 메모 데이터를 먼저 다뤄봤다.
이번 단계에서 사용한 Java 개념
이번 단계에서는 Java의 기본 문법을 사용해서 CRUD 흐름을 만들었다.
List
ArrayList
String[]
Scanner
nextLine
Integer.parseInt
for문
if / else if
isEmpty
get
add
set
remove
React에서는 state 배열을 기준으로 메모를 추가, 수정, 삭제했다.
Java 콘솔에서는 List를 기준으로 메모를 추가, 수정, 삭제했다.
도구와 환경은 다르지만 결국 흐름은 비슷했다.
메모 작성 → 데이터 추가
메모 목록 → 데이터 전체 조회
메모 수정 → 특정 데이터 교체
메모 삭제 → 특정 데이터 제거
현재 구현된 기능
현재 Java 콘솔 메모장은 다음 기능을 가진다.
메모 작성
메모 목록 보기
메모 수정
메모 삭제
프로그램 종료
아직 파일 저장이나 DB 저장은 없다.
프로그램을 종료하면 메모는 사라진다.
현재 메모는 프로그램이 실행되는 동안만 memos 리스트 안에 존재한다.
하지만 이번 단계의 목적은 저장소를 만드는 것이 아니라, Java에서 메모 데이터를 어떻게 다루는지 연습하는 것이다.
정리
이번 단계에서는 Java 콘솔 환경에서 CRUD 기능을 직접 구현했다.
브라우저나 React 없이도 다음 흐름을 Java 코드로 만들 수 있게 되었다.
입력받기
데이터 저장하기
목록 출력하기
기존 데이터 수정하기
기존 데이터 삭제하기
이 구조는 나중에 Servlet/JSP나 Spring으로 넘어갈 때도 이어질 수 있다.
콘솔 입력
→ 나중에는 브라우저 요청
List에 저장
→ 나중에는 DB에 저장
if문으로 기능 분기
→ 나중에는 Controller에서 요청 분기
즉, 이번 단계는 Java 웹 개발로 넘어가기 전에 메모 CRUD 로직을 Java 문법으로 먼저 익혀보는 과정이었다.
다음 단계에서는 String[]로 메모를 다루는 방식에서 벗어나, Memo 클래스를 만들어 메모 데이터를 조금 더 명확한 구조로 바꿔볼 예정이다.
'Project > Memo Evolution' 카테고리의 다른 글
| #21 Java 콘솔 메모장: MemoService로 로직 분리하기 (0) | 2026.06.21 |
|---|---|
| #20 Java 콘솔 메모장 : String 배열에서 Memo 클래스로 변경하기 (0) | 2026.06.21 |
| #18 Java 콘솔 메모장 시작 중 만난 IntelliJ 설정 문제 (0) | 2026.06.20 |
| #17 Java 콘솔 메모장 시작하기 (0) | 2026.06.20 |
| #16 HTML/CSS/JS 메모장을 React로 고도화 정리 (0) | 2026.06.20 |