Post

작은 프로젝트로 객체 지향 연습하기

Intro

이번주에 2주짜리 Java 수업도 끝났고, 객체지향의 사실과 오해도 거의 다 읽어갑니다. 그래서 객체 지향을 연습해 볼겸 자주 사용하는 플래시카드 프로그램 기능 중 일부를 아주 작게나마 만들어보기로 했습니다.

플래시카드는 앞 면에는 문제, 뒷 면에는 답을 적어 학습에 사용하는 도구입니다.

플래시카드

요구사항

  • 공부를 시작하면 제공된 파일에 있는 영어단어를 카드의 앞면에 보여줍니다.
  • 사용자의 요청에 따라 앞면과 영어단어의 뜻이 적힌 뒷면을 동시에 보여줍니다.
  • 카드를 뒤집은 후에 사용자의 요청에 따라 다음 카드로 넘어갑니다.
  • 마지막 카드까지 모두 확인하면, 학습한 카드의 갯수와 총 학습 시간을 표시합니다.

도메인 모델

플래시카드 도메인 모델

실제 사용할 플래시카드 프로그램을 만든다면 더 많은 객체들이 필요하겠지만, 최대한 단순화하기 위해 도메인 모델도 단순하게 만들었습니다.

인터페이스 정리

인터페이스 정리

객체가 수신하는 메시지를 정리합니다.

영어단어 파일 만들기

구현하기 전에 테스트 시에도 사용 할 데이터를 만들어 줍니다.

간단하게 chatGPT로 영어단어 목록을 만듭니다. TOEIC 900점을 넘어보지 못했으니, TOEIC 900점을 넘기 위해 외워야 할 영어단어를 추천받았습니다.

영어단어 추천

구현하기

먼저 사용자(User) 클래스를 만들어봅니다. 사용자 객체는 자신이 공부한 시간과 카드 갯수에 대한 정보를 갖고, 이를 요구사항에 맞춰 학습 종료 시 출력할 수 있게 하였습니다.

1
2
3
4
5
6
7
8
9
10
11
12
class User {
    
    private long startTime;
    private long endTime;
    private int numCards;

    public void startStudy() {}
    public void exitStudy() {}
    public void nextCard() {}
    public void printExitMessage() {}
    
}

다음으로 카드(Card) 클래스를 만들어봅니다. 앞면을 보여주거나 뒷면을 보여줄 수 있게 하였습니다.

1
2
3
4
5
6
7
8
9
class Card {

    private String front;
    private String back;

    public void showFront() {}
    public void showBack() {}
    
}

구현을 하면서 도메인 모델을 너무 많이 줄였다는 것을 깨달았습니다. 그래서 사용자 객체와 카드 객체 사이에서 파일을 불러와줄 WordLoader 클래스를 별도로 만들었습니다.

1
2
3
4
5
6
7
8
9
class WordLoader {
    
    private final List<card> cards;

    private Card parseFromCSV(String line) {}
    private List<Card> parseLinesFromCSV(List<String> lines) {}
    public List<Card> getCards(){}
	
}

마무리

아직 능력이 부족해서 생각보다 시간도 오래걸리고 아쉬운 점도 많은 작업이었습니다. 그래도 예제만 따라칠 때 보다는 여러가지를 다양하게 고민해 볼 수 있는 좋은 기회였습니다.

  • 프로젝트 이름은 어떻게 해야될지
  • main 메소드가 있는 클래스명은 어떻게 해야될지
  • package는 어떻게 나눠야할지
  • 구현을 할 때는 문자열 상수를 어디에 배치하고, 어떻게 관리해야 할지
  • 사용자를 생각한다면, 사용성이나 예외처리는 어떻게 해야할지
  • 결국 사용자 객체는 아무런 메시지도 보내지 않게 됐는데, 다시 도메인 모델을 설계한다면 어떻게 해야할지

이외에도 고민한게 많았는데 그때그때 정리를 안했더니 생각이 안나네요. 막히거나 고민했던 목록을 바로바로 만들어야겠습니다.

최대한 간단하게 해봤으니 다음에 규모를 조금 더 키운 프로젝트를 하면서, 고민만 하고 해결하지 못했던 것들(위에 있는거 전부…)과 아쉬웠던 점들도 해결해 봐야겠습니다.

소스 코드는 여기 있기는 한데… 주석도 없고 정리도 안돼서 보기 힘드실 겁니다.🥹 그래도 저와 비슷한 수준에 있는 분들한테 도움이 될까싶어 링크 걸어놓았습니다.

This post is licensed under CC BY 4.0 by the author.