Post

객체지향개발 연습2-5 - 사용자 객체 수정

Intro

이전 글 마지막에 언급했던 대로 갑자기 사용자 객체가 수신해야 할 메시지가 여러가지 떠올라서 사용자 객체를 수정하려 했는데, 글을 쓰는 와중에 첫 단추부터 잘못 끼워졌음을 이제서야 깨달았습니다.

기존 사용자 객체에 대한 문제점

가장 처음해본 단순한 협력 설계와 지금 진행하고 있는 두 번째 객체 지향 연습에서 수행한 협력 설계에서 사용자 객체가 수신하고 있는 메시지는 오로지 학습하라 하나밖에 없다는 것을 볼 수 있습니다. 처음해본 협력 설계

두 번째 협력 설계

당시 프로그램의 시작점이 어디인가 생각하면서 학습하라 메시지를 메시지로 보지 않고, 단순히 프로그램 시작점으로서의 역할만 생각했던게 문득 떠올랐습니다.

학습하라 메시지는 협력을 시작하게 하는 첫 번째 메시지로, 그에 맞는 객체가 메시지에 의해 선택됐어야 했습니다.

객체지향 사실과 오해

그런데 저는 첫 메시지를 단순 프로그램 시작점으로 생각하고, 개인적으로 느끼기에 시작과 함께 있어야 할 객체를 찾아서 메시지와 객체를 단순 결합했습니다.

그러다보니 어디서부턴가 또 생각이 꼬이고, 사용자 객체를 생명체로서의 사람과 동일시 하면서 학습하라 외에는 아무런 메시지 수신이 없었는데도 능동적으로 다른 객체에 메시지를 보내는 그림이 그려지게 됐습니다.

다시 수정하기

다시 사용자 객체를 수정해야겠습니다.

사라질 위기의 사용자 객체

아래는 이전까지 구현했던 사용자 객체입니다.

1
2
3
4
5
6
7
8
9
10
11
public class User {

    // 학습하라
    public User(Board board, Deck deck, Planner planner) {
        
        // 보관함 목록 및 보관함 별 학습 대상 카드 개수 확인하기
        board.showBoard(deck, planner);

    }

}

메시지부터 잘못됐다고 볼 수 있기 때문에, 처음 프로그램이 시작하면서 보내야할 메시지가 무엇인지 고민해봤습니다.

학습 시작 전에 준비하듯 학습을 준비하라 혹은 제가 생각하고 있는 프로그램의 시작 후의 화면은 보관함 목록과 각 보관함의 카드 갯수가 정리되어 보여지는 것을 원하므로 학습현황을 보여라 정도가 되겠습니다.

하지만 전자는 아무래도 사용자 객체가 있으니 사용자 객체를 사용하고 싶은 마음이 들어간 메시지인 것 같고, 후자가 요구사항에 맞는 메시지이며 현황판(Board) 객체가 메시지를 수신해야 할 것으로 판단됩니다.

그럼 이제 사용자 객체는 할 일이 없어집니다. 음…?

1
2
3
public class User {
    // ... ?
}

처음부터 사용자가 1인인 상황을 생각하고 있었기 때문에 사용자 객체가 사라지는게 맞기는 하지만, 다시 만들 때는 어차피 2인 이상의 사용자를 고려할 생각이고, 저번주에 배운 데이터베이스를 적용해보려는 학습 목적도 있었으므로 사용자 객체를 살릴 방안을 생각해보기로 했습니다.

메시지 수정하기

프로그램 시작 시 사용자를 선택하기로 하고, 사용자 목록을 보여라 메시지를 프로그램의 첫 메시지로 선택했습니다. 메시지에 따라 모든 사용자 목록을 불러오려면 어떻게 해야할지 고민이 됩니다. 사용자 객체 하나가 모든 사용자 객체를 들고있을 이유가 없고, 사용자간의 관계도 없으니 다른 객체가 필요할 것으로 보입니다.

그냥 진입 시에만 사용하는 단순한 뷰(View) 객체를 만들까 고민하다가, 현황판(Board) 객체에서 사용자 목록 정보를 갖고 사용자 전환 시에도 사용되는 것이 좋겠다고 생각했습니다. 그래서 첫 메시지는 다음 글에서 현황판 객체를 수정하면서 고민해보겠습니다.

현황판에서 선택된 사용자 정보를 기반으로 사용자 객체를 초기화합니다. 메시지로 굳이 만들자면 빙의하라 같은 것만 떠올라서 적당히 사용자 객체 초기화로 넘어가보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class User {

    private int id; // 사용자 식별자
    private String name; // 사용자 이름

    // 사용자 객체 초기화
    public User(int id, String name) {
        
        // 사용자 정보 설정
        this.id = id;
        this.name = name;

    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

}

학습 현황을 불러올 때 사용자 정보를 사용해야하므로, getter 까지 추가하였습니다.

이상 사용자 객체 소생기였습니다.

Outro

다음은 중간에 언급했던 대로 첫 메시지를 수신할 현황판 객체를 다시 수정하고, 시간이 남으면 다른 객체들도 수정해보려 합니다.

다른 객체들도 협력 설계할 때 사용자 객체 외에는 단독으로 메시지를 받으면 안되는 걸로 잘못 생각하고 있었기 때문에 수정할게 많지 않을까 생각됩니다.

삽질한게 스스로 한심스럽기도 한데, 지금이라도 알게된게 어디냐 싶기도 하네요.

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