ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 객체지향의 사실과 오해 - Chapter7
    Computer기본지식/객체지향의 사실과 오해 2021. 8. 6. 11:49
    반응형

    안녕하세요. 이번 포스팅은 객체지향의 사실과 오해 Chapter7과 부록에 대한 정리를 해보겠습니다.

    드디어 마지막 스터디가 끝나고 책 한권을 정리하네요! 

    시작해보겠습니다.

     

    Chapter 7 : 함께 모으기

    파울러의 객체 지향 설계내에서의 세 가지 관점

     

    1. 개념 관점(Conceptual Perspective)

    도메인 안에 존재하는 개념과 개념들 사이의 관계를 표현.

    실제 도메인의 규칙과 제약을 최대한 유사하게 반영하는 것이 핵심.

     

    2. 명세 관점(Specification Perspective)

    사용자 영역인 도메인을 벗어나 개발자의 영역인 소프트웨어로 초점을 옮김. 실제 객체들의 책임에 초점을 맞춤.

    인터페이스의 초점을 맞춤. 인터페이스와 인터페이스 구현을 분리해야함.

     

    3. 구현 관점(Implementation Perspective)

    프로그래머에 익숙한 관점으로 구현에 초점을 맞춤. "무엇"보다 "어떻게"에 초점이 맞춰짐.

     

    여기서 우리는 객체를 설계 할 경우 "명세 관점"으로 접근해야합니다. 인터페이스에 대한 프로그래밍이 끝난 후

    구현 관점에서 보는 것이 휼륭한 설계라고 할 수 있습니다.

     

    도메인 모델

    소프트웨어가 대상으로 하는 영역인 도메인을 단순화해서 표현한 모델

    ◆ : 포함 또는 합성관계

    이러한 도메인들은 각자 자율적인 객체이고 이것의 공동체가 객체지향의 세계입니다.

     

    설계

     

    객체가 메세지를 선택하는게 아니라 메세지가 객체를 선택해야합니다.

    첫 번째로 "커피를 주문하라" 메세지를 설정해줍니다.

    커피를 주문 할 수 있는 도메인(객체)를 찾습니다. "손님"이라는 객체를 찾았습니다.

    그리고 "손님이 할 수 없는 일인 메뉴를 찾는 책임을 "메뉴판"객체에 메뉴이름과 함께 전달합니다.

    그럼 "메뉴판" 객체는 "메뉴이름"을 반환해줍니다. "손님"객체는 "커피 제조하라"라는 명령을 객체에게 전달해야합니다.

    "바리스타"가 "커피 제조하라"메세지를 받게 됩니다. 이제 바리스타는 커피를 만들게 됩니다.

     

    이러한 과정을 들여다보면 각 객체는 자신이 할 수 없는 일을 외부 객체에게 책임을 맡기며 협력하고 있습니다.

    그리고 인터페이스를 열어서 "저 이거 할 수 있어요"라는 것만 알지 안에서 어떤 행동을 하는지는 모릅니다.

    잘 설계되어진 객체지향 설계라고 할 수 있습니다.

    구현

    이제 위에서 설계한 도메인 모델을 가지고 인터페이스 및 객체를 구현해보겠습니다.

    첫 번째로 각 객체의 타입을 구현해보겠습니다.

     

    class Customer {
    	public void order(String menuName) {}
    }
    
    class MenuItem {
    }
    
    class Menu {
    	public MenuItem choose(String name) {}
    }
    
    class Barista {
    	public Coffee makeCoffee(MenuItem menuItem() {}
    }
    
    class Coffee {
    	public Coffee(MenuItem menuItem) {}
    }

    이렇게 객체의 타입을 자바 문법을 이용하여 표현했습니다.

    그리고 손님 객체는 바리스타와 메뉴판 객체와 협력해야합니다. 어떻게 손님이 다른 객체에 접근 할 지 정해줘야합니다.

    접근을 할려면 바리스타, 메뉴판 객체를 참조해야합니다. 그래서 코드를 수정하겠습니다.

    class Customer {
    	public void order(String menuName, Menu menu, Barista barista) {
        	MenuItem menuItem = menu.choose(menuName);
            Coffee coffee = barista.makeCoffee(menuItem);
        }
    }

    이렇게 손님 객체를 구현해 보았습니다. 이렇게 인터페이스가 변경 된다는 점을 주목해야 합니다.

    이제 Menu객체를 구현해보겠습니다.

    class Menu {
    	private List<MenuItem> items;
        
        public Menu(List<MenuItem> items) {
        	this.items = itmes;
        }
        
        public MenuItem choose(String name) {
        	for(MenuItem each : items) {
            	if (each.getName().equals(name)) {
                	return each;
                }
            }
            return null;
        }
    }

    메뉴 같은 경우는 내부적으로 MenuItem을 관리하고 있습니다.

     

    class Barista {
    	public Coffee make Coffee(MenuItem menuItem) {
        	Coffee coffee = new Coffee(menuItem);
            return coffee;
        }
    }

    바리스타는 MenuItem을 이용하여 커피를 제조합니다.

    class Coffee {
    	private String name;
        private int price;
        
        public Coffee(MenuItem menuItem) {
        	this.name = menuItem.getName();
            this.price = menuItem.cost();
        }
    }

    커피는 생성자에서 MenuItem을 이용하여 자신의 인스턴스를 생성합니다.

    이렇게 인터페이스와 구현의 분리를 몸소 체험해봤습니다. 이러한 것이 바로 객체지향의 설계입니다.

     

    설계 시 중요한 3가지

    1. 코드의 세 가지 관점을 모두 제공하라

    2. 도메인 개념을 참조하라

    3. 인터페이스와 구현을 분리하라

     

     

    이렇게 객체지향의 사실과 오해에 대해서 스터디를 하며 많은 것들을 알아봤습니다.

    이 책을 읽으면서 객체를 누군가에게 설명할 수 있다는 것만으로도 저로써는 큰 수확을 얻었습니다.

    스터디가 끝나도 현업에 들어가기 전 책을 한 번더 깊이있게 읽고 싶습니다.

    그 때 쯤이면 지금보다도 훨씬 성장해있는 상태에서 보는 것이기에 또 다른 내용이 보일 수 있을 것이라 생각합니다.

    지금까지 객체지향의 사실과 오해 정리 읽어주셔서 감사합니다.

    다음 편은 "리팩터링"책을 주제로 스터디를 진행하려고 합니다. 기대해주세요~ 

    반응형

    댓글

Designed by Tistory.