본문 바로가기
  • Let's study
알고리즘/Java

[Java] 명언 게시판 만들기(1~5단계) - 리팩토링

by 코딩고수이고파 2026. 7. 16.

이번 단계에서는 명언 게시판의 기능은 변경하지 않고, 책임을 분리하여 가독성과 유지보수성을 높이는 방향으로 리팩토링을 진행했다.

1. Main 클래스에서 로직 분리

기존에는 Main 클래스가 프로그램의 모든 로직을 담당했다.

하지만 Main은 프로그램을 시작하는 역할만 담당하고, 실제 기능은 App 클래스에서 처리하도록 변경했다.

변경 전

Main
 ├─ 등록
 ├─ 목록
 └─ 종료

변경 후

Main
 └─ App.run()
public class Main {
    public static void main(String[] args) {
        App app = new App();
        app.run();
    }
}

2. run() 함수의 책임 분리

기존 run() 메서드는

 

  • 사용자 입력
  • 등록
  • 목록 출력
  • 데이터 처리

까지 모두 담당하고 있었다.

이처럼 하나의 함수가 너무 많은 일을 하면

 

  • 코드가 길어진다.
  • 읽기 어렵다.
  • 수정하기 어렵다.

그래서 명령어에 따라 각각의 메서드를 호출하도록 변경한다.

 

if (cmd.equals("등록")) {
    actionWrite();
}
else if (cmd.equals("목록")) {
    actionList();
}

 

기존에는 run() 내부에서 필요한 변수들을 지역 변수로 선언했는데, actionWrite(), actionList(), write() 등으로 기능을 분리하면서 여러 메서드에서 동일한 데이터를 사용하게 되어 이 변수들을 App 클래스의 인스턴스 변수로 이동한다.

 

public class App {

    Scanner sc = new Scanner(System.in);
    WiseSaying[] wiseSayings = new WiseSaying[10];
    String cmd = "";
    int lastNo = 0;

    public void run() {
        ...
    }
}
 

3. actionWrite() 분리

기존에는 등록 기능 하나의 메서드에서

  • 사용자 입력
  • 객체 생성
  • 데이터 저장

까지 모두 수행했지만 다음과 같이 분리했다.

actionWrite()

사용자와 상호작용(UI)만 담당한다.

 

private void actionWrite() {
    System.out.print("명언: ");
    String content = sc.nextLine();

    System.out.print("작가: ");
    String author = sc.nextLine();

    WiseSaying wiseSaying = write(content, author);

    System.out.println("%d번 명언이 등록되었습니다.".formatted(wiseSaying.no));
}

write()

실제 데이터를 생성하고 저장하는 역할만 담당한다.

 
private WiseSaying write(String content, String author) {
    WiseSaying wiseSaying = new WiseSaying();

    wiseSayings[lastNo] = wiseSaying;

    wiseSaying.no = ++lastNo;
    wiseSaying.content = content;
    wiseSaying.author = author;

    return wiseSaying;
}

4. actionList() 분리

목록 출력 기능도 run()에서 분리했다.

private void actionList() {
    System.out.println("번호 / 작가 / 명언");
    System.out.println("----------------------");

    for (int i = lastNo - 1; i >= 0; i--) {
        WiseSaying target = wiseSayings[i];

        if (target.content.isEmpty())
            continue;

        System.out.println("%d / %s / %s"
                .formatted(target.no, target.author, target.content));
    }
}

리팩토링 후 구조

Main
 └── App.run()

App
 ├── run()
 ├── actionWrite()
 ├── write()
 └── actionList()
 

각 메서드가 하나의 역할만 담당하는 구조가 됐다.

 

이번 리팩토링에서는 기능을 변경하지 않고 코드의 구조만 개선했다. Main과 App의 역할을 분리하고, run()의 책임을 줄였으며, 등록과 목록 기능을 각각 독립적인 메서드로 분리했다. 또한 사용자와 상호작용하는 코드와 데이터를 처리하는 코드를 분리하여 SRP(단일 책임 원칙)에 가까운 구조로 개선했다.

'알고리즘 > Java' 카테고리의 다른 글

[Java] 명언 게시판 만들기(1~5단계)  (0) 2026.07.16
[Java] 캡슐화(Encapsulation)  (0) 2026.07.15
[Java] 추상 클래스 / 추상 메서드  (0) 2026.07.15
[Java] 구성  (0) 2026.07.15
[Java] 상속  (0) 2026.07.14

댓글