(핵심만 쏙!) 객체 지향 소프트웨어 설계(디자인)하기
오늘은 소프트웨어를 설계할 때 적용할 수 있는 객체 지향 설계에 관한 글이다.
👀TL;DR
- 바로 구현 작업을 하는 것은 프로젝트 실패의 주원인이 될 수 있다.
 - 프로젝트를 실패하지 않으려면 요구사항을 만들고 소프트웨어를 설계하는 데 시간을 들여야 한다.
 - 크게는 개념적 설계, 기술적 설계로 나눌 수 있는데,
    
- 개념적 설계는 1) 구성 요소 식별 2) 구성 요소 간 연결 3) 구성 요소의 책임 식별 로 진행된다.
 - 기술적 설계는 위 단계를 더 이상 분해될 수 없을 때까지 구성 요소를 식별한 후 이를 속성(Attribute), 메서드(Method)로 구현한다.
 
 - 객체 지향 설계란, 현실을 객체의 관점에서 바라보고 이를 컴퓨터의 언어로 모델링하는 작업이다.
 - 요구 사항은 사용자 스토리로 표현할 수 있다.
    
- 사용자 스토리: As a __, I want to ___ so that_______ 형태를 띈다.
        
- As a __ : 해당 빈칸에는 요구 사항을 원하는 사용자를 적는다.(user role로 칭함.)
 - I want to __: 위에서 적은 사용자가 무엇을 이루고 싶어하는 지를 적는다.
 - so that __: 왜 이루고 싶어하는 지를 적는다.
 
[ 예시 ]
As a online shopper, I want to add item to shopping cart so that I purchase that.
- 주로 명사는 객체로 식별한다. (온라인 쇼핑하는 사람, 장바구니, 물건)
 - 주로 동사는 객체의 책임을 의미한다. (add, purchase)
            
- 그리고 객체 간 연결을 정의하는 데 도움이 된다.(온라인 쇼핑하는 사람이 장바구니에 물건을 추가한다.)
                
- 
                    
한 사람은 하나의 장바구니를 이용한다.
 - 
                    
한 사람은 여러 개의 물건을 살 수 있다.
 
 - 
                    
 
 - 그리고 객체 간 연결을 정의하는 데 도움이 된다.(온라인 쇼핑하는 사람이 장바구니에 물건을 추가한다.)
                
 
 
 - 사용자 스토리: As a __, I want to ___ so that_______ 형태를 띈다.
        
 - 이렇게 요구 사항에서 객체와 객체의 책임, 객체 간 관계를 추출했다면 CRC 카드를 이용하자.
 - 
    
CRC 카드란? Class name, Responsibility, Collaborator 의 약어로 다음과 같은 형태를 띄고 있다.
- 요구 사항에서 추출한 객체를 Class name에 작성하자.
 - 책임도 마찬가지다.
 - Collaborator는 해당 객체가 책임을 수행하기 위해 상호 작용하는 객체를 일컫는다.
 - 그렇게 카드가 만들어졌다면 해결하려는 실생활의 문제를 시나리오 별로 나누고 실제 시뮬레이션을 해보며 추가적인 객체를 식별하고 다른 가능성을 탐구한다.
 - 그렇게 더 이상 나올 객체가 없다면 마무리한다.
 
 - 이렇게 하면 개념적 설계가 끝나고 기술적 설계로 넘어간다. 즉, Class.(속성과 행동)를 정의한다.
 - 이 때 객체 지향 설계의 원칙 4가지를 적용한다.
    
- 추상화: Class를 정의할 때 특정한 맥락(context)에서 꼭 필요한 속성과 행동(behavior)를 정의.
 - 캡슐화
        
- bundle: 클래스에 필요한 데이터와 이 데이터를 사용할 메서드를 묶는 것을 의미한다.
 - expose: 외부에서 접근할 수 있도록 외부에 노출 시킬 클래스의 메서드를 정한다.
 - restrict: 외부에서 접근할 수 없도록 클래스의 속성과 메서드를 정의한다.
 
 - 분해(Decomposition): 전체 객체를 부분으로 나눈다. 이 때는 3가지 관점을 고려한다.
        
- fixed, dynamic number: 전체와 비교했을 때 부분의 개수가 고정적인지 가변적인지 고려.
            
- 예를 들어 자동차를 생각해보자. 운전 핸들은 개수가 1개로 고정적이지만 탑승객의 수는 변한다.
 
 - lifetime: 전체와 수명주기가 같은지 다른지를 고려.
 - share: 부분 또는 전체와 공유되는 부분이 있는지 고려.
 
 - fixed, dynamic number: 전체와 비교했을 때 부분의 개수가 고정적인지 가변적인지 고려.
            
 - 일반화: 공통되는 속성이나 행동을 하나의 코드 덩어리로 묶음으로써 재사용가능하게 만들어 추가 코드 작성을 줄이는 것.
        
- 대표적인 예로 상속(Inheritance)을 들 수 있다.
            
- 즉, 두 개 이상의 클래스 간에 1) 반복되거나 2) 공유되거나 3) 공통되는 속성과 행동들을 묶어서 다른 하나의 클래스로 만든다.
 - 이를 부모(Super) 클래스라고 칭하고 부모 클래스의 속성과 행동을 물려받는 클래스를 자식(sub) 클래스라고 칭한다.
 
 
 - 대표적인 예로 상속(Inheritance)을 들 수 있다.
            
 
 
      
댓글남기기