이번 단계에서는 메모 하나를 String[] 배열이 아니라 Memo 클래스로 표현하도록 변경했다.
이전 단계에서는 Java 콘솔에서 메모 작성, 목록 보기, 수정, 삭제 기능을 구현했다.
그때 메모 하나는 다음처럼 문자열 배열로 저장했다.
String[] memo = {title, content};
그리고 값을 꺼낼 때는 배열 인덱스를 사용했다.
memo[0] // 제목
memo[1] // 내용
이 방식도 동작은 한다.
하지만 코드를 볼 때 memo[0]이 제목인지, memo[1]이 내용인지 계속 기억해야 한다.
그래서 이번 단계에서는 메모 하나를 더 명확하게 표현하기 위해 Memo 클래스를 만들었다.
기존에는 메모 하나를 String[] 배열로 다뤘다.
String[] memo = {title, content};
전체 메모 목록은 다음처럼 선언했다.
List<String[]> memos = new ArrayList<>();
이 구조에서는 메모 하나가 배열이기 때문에 제목과 내용을 인덱스로 구분해야 했다.
memo[0] // 제목
memo[1] // 내용
작은 프로그램에서는 크게 문제되지 않을 수 있다.
하지만 코드가 조금만 길어져도 memo[0]이 무엇을 의미하는지 바로 보이지 않는다.
예를 들어 목록을 출력할 때도 다음처럼 작성해야 했다.
System.out.println((i + 1) + ". " + memo[0]);
System.out.println(memo[1]);
동작은 하지만 의미가 명확하지 않았다.
Memo 클래스 만들기
그래서 메모 하나를 표현하는 Memo 클래스를 만들었다.
public class Memo {
private String title;
private String content;
public Memo(String title, String content) {
this.title = title;
this.content = content;
}
public String getTitle() {
return title;
}
public String getContent() {
return content;
}
}
이제 메모 하나는 단순한 문자열 배열이 아니라 Memo 객체가 되었다.
Memo
→ title
→ content
title과 content라는 이름이 생겼기 때문에, 메모가 어떤 데이터를 가지고 있는지 더 명확해졌다.
필드를 private으로 둔 이유
Memo 클래스 안의 필드는 private으로 만들었다.
private String title;
private String content;
private으로 두면 클래스 밖에서 필드에 직접 접근할 수 없다.
대신 값을 가져올 때는 getter 메서드를 사용한다.
public String getTitle() {
return title;
}
public String getContent() {
return content;
}
지금은 단순히 값을 꺼내는 정도지만, 이렇게 작성하면 나중에 클래스 내부 구조를 조금 더 안전하게 관리할 수 있다.
생성자의 역할
Memo 객체를 만들 때는 생성자를 사용한다.
public Memo(String title, String content) {
this.title = title;
this.content = content;
}
이 생성자는 제목과 내용을 받아서 Memo 객체 안에 저장한다.
예를 들어 다음 코드를 실행하면,
Memo memo = new Memo(title, content);
입력받은 title, content 값이 Memo 객체의 필드에 들어간다.
List 타입 변경
기존에는 문자열 배열 목록을 사용했다.
List<String[]> memos = new ArrayList<>();
이제는 Memo 객체 목록으로 변경했다.
List<Memo> memos = new ArrayList<>();
즉, memos는 이제 문자열 배열이 아니라 Memo 객체들을 저장하는 리스트다.
기존:
List<String[]>
변경 후:
List<Memo>
이 변화만으로도 코드의 의미가 더 명확해졌다.
memos 리스트 안에는 메모 객체들이 들어간다는 것을 타입만 봐도 알 수 있다.
메모 작성 코드 변경
기존에는 제목과 내용을 배열로 묶어서 저장했다.
String[] memo = {title, content};
memos.add(memo);
변경 후에는 Memo 객체를 생성해서 저장한다.
Memo memo = new Memo(title, content);
memos.add(memo);
흐름은 비슷하다.
제목 입력
→ 내용 입력
→ Memo 객체 생성
→ memos 리스트에 추가
차이는 메모 하나를 배열로 만들었는지, 클래스로 만들었는지다.
메모 목록 출력 코드 변경
기존에는 배열 인덱스로 제목과 내용을 꺼냈다.
System.out.println((i + 1) + ". " + memo[0]);
System.out.println(memo[1]);
변경 후에는 getter 메서드를 사용했다.
System.out.println((i + 1) + ". " + memo.getTitle());
System.out.println(memo.getContent());
이제 코드를 읽었을 때 의미가 더 분명하다.
memo.getTitle()
→ 메모 제목을 가져온다.
memo.getContent()
→ 메모 내용을 가져온다.
memo[0], memo[1]보다 훨씬 읽기 쉽다.
메모 수정 코드 변경
수정할 때도 기존에는 새 배열을 만들어 교체했다.
String[] updateMemo = {newTitle, newContent};
memos.set(index, updateMemo);
변경 후에는 새 Memo 객체를 만들어 교체했다.
Memo updateMemo = new Memo(newTitle, newContent);
memos.set(index, updateMemo);
즉, 해당 위치의 기존 메모 객체를 새 메모 객체로 바꾸는 방식이다.
수정 흐름은 이전과 같다.
수정할 번호 입력
→ index 계산
→ 새 제목 입력
→ 새 내용 입력
→ 새 Memo 객체 생성
→ memos.set(index, updateMemo)
바뀐 것은 데이터 표현 방식이다.
삭제 코드는 거의 그대로
삭제 기능은 크게 바뀌지 않았다.
삭제는 특정 index의 메모를 리스트에서 제거하는 작업이기 때문이다.
memos.remove(index);
기존에는 List<String[]>에서 제거했고, 이제는 List<Memo>에서 제거한다.
리스트 안에 들어 있는 타입은 바뀌었지만, 삭제 흐름 자체는 그대로다.
이번 단계에서 가장 크게 바뀐 점은 메모 하나를 표현하는 방식이다.
기존 방식은 다음과 같았다.
메모 하나 = String 배열
memo[0] = 제목
memo[1] = 내용
변경 후에는 다음과 같다.
메모 하나 = Memo 객체
memo.getTitle() = 제목
memo.getContent() = 내용
기능이 새로 늘어난 것은 아니지만, 코드의 의미가 더 명확해졌다.
처음에는 String[]만으로도 충분해 보였다.
하지만 메모에 필요한 정보가 늘어나면 배열 방식은 금방 불편해진다.
예를 들어 나중에 다음 정보가 추가될 수 있다.
id
작성일
수정일
중요 표시
카테고리
배열로 계속 관리한다면 이런 식으로 외워야 한다.
memo[0] // 제목
memo[1] // 내용
memo[2] // 작성일
memo[3] // 수정일
이렇게 되면 코드가 점점 헷갈린다.
반면 클래스를 사용하면 필드 이름으로 의미를 표현할 수 있다.
memo.getTitle()
memo.getContent()
memo.getCreatedAt()
그래서 이번 단계에서 Memo 클래스로 바꾼 것은 나중에 구조를 확장하기 위한 준비이기도 하다.
아직 파일 저장이나 DB 저장은 없다.
프로그램을 종료하면 메모는 사라진다.
하지만 이번 단계에서는 저장 기능보다, Java에서 데이터를 더 명확한 구조로 표현하는 데 집중했다.
다음 단계에서는 이 구조를 바탕으로 기능을 더 나누거나, 메모 저장 방식을 개선해볼 수 있을 것 같다.
'Project > Memo Evolution' 카테고리의 다른 글
| #22 Tomcat으로 Servlet 실행하기 (0) | 2026.06.21 |
|---|---|
| #21 Java 콘솔 메모장: MemoService로 로직 분리하기 (0) | 2026.06.21 |
| #19 Java 콘솔 메모장: CRUD기능 구현하기 (0) | 2026.06.20 |
| #18 Java 콘솔 메모장 시작 중 만난 IntelliJ 설정 문제 (0) | 2026.06.20 |
| #17 Java 콘솔 메모장 시작하기 (0) | 2026.06.20 |