본문 바로가기
생각 정리/독서

2024-02. 객체지향의 사실과 오해

by Jiyoon-park 2024. 2. 2.

지수님이 동화책이라고 소개해주신 24년도의 두번째 책. 객체지향의 사실과 오해

https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=60550259

 

객체지향의 사실과 오해

위키북스 IT Leaders 시리즈 23권. 객체지향이란 무엇인가? 이 책은 이 질문에 대한 답을 찾기 위해 노력하고 있는 모든 개발자를 위한 책이다.

www.aladin.co.kr

 

객체지향에 대한 오해부터 짚고 넘어가보자

오해1. 객체지향 세계는 현실 세계를 반영한다?

- 객체 지향 세계는 현실 세계와 비슷한 것은 맞지만 큰 차이가 있다. 현실 세계의 사물들은 수동적인 경우가 많은 반면, 객체 지향 세계의 모든 객체들은 능동적이다. 예를 들어 현실 세계에서 커피는 사람이 마셔야 커피의 양이 줄어들지만, 객체 지향 세계에서의 커피는 스스로의 양을 스스로가 줄인다.

 

오해2. 객체에서 중요한 것은 상태이다?

- 아니다. 객체에서 중요한 것은 행동이다. 상태를 중심으로 객체를 바라보는 것은 초보자들이 가장 쉽게 빠지는 함정이다. 초보자들은 객체에 필요한 상태가 무엇인지를 결정하고, 상태에 필요한 행동을 결정한다. 

- 객체에서 중요한 것이 행동인 이유는, 객체는 다른 객체와 협력하기 위해서 존재하기 때문이다. 하지만 상태를 중심으로 객체를 고려할 경우, 협력이라는 문맥에서 벗어난 채 객체를 설계하게 된다. 협력을 생각하고, 협력에 필요한 행동이 무엇인지를 생각하고, 해당 행동을 수행할 적합한 책임을 가진 객체를 찾아라. 그리고 객체의 행동을 중심으로 상태를 생각해라.

 

객체지향에 대한 사실을 알기 위해, 객체란 무엇인지부터 알아보자

객체는 `상태`와 상태를 조작하기 위한 `행동`을 묶은 하나의 단위이다.

class 사람 {
  private 성;
  private 이름;
  private 키;
    
  public 자기소개하기 {
    const fullName = `${성} ${이름}`
    return `나는 ${fullName}이야`
  }
  
  public 키크기 {
    우유마시기()
  }
}

 

앞서 객체지향에 대한 오해에서, 객체지향 세계의 객체들은 현실 세계와 다르게 모든 객체들은 능동적이라고 이야기했다. 객체들은 모두 능동적이며, 능동적이라는 것은 자율성을 가지고 있다고 표현할 수 있다.

 

객체는 자율적 존재이므로, 외부의 객체는 직접적으로 다른 객체의 상태에 직접 접근할수도, 변경할수도 없다. 접근할 수 있는 유일한 방법은 객체가 제공하는 행동뿐이다. 객체는 제공한 행동을 기반으로 오직 객체 자신만이 스스로의 상태를 변경한다.

 

객체 설계의 핵심은, 객체를 외부에 공개되는 인터페이스와 내부에 숨겨지는 구현, 두개의 분리된 요소로 분할해 설계하는 것이다. (= 인터페이스와 구현의 분리 원칙).

 

객체는 객체의 내부와 외부를 명확하게 구분하여, 사적인 부분(어떻게=구현)은 외부에서 일체 간섭할 수 없도록 차단하고, 다른 객체와 협력하기 위한 메시지(무엇을=인터페이스)만 외부로 노출해야 한다. 이것이 객체의 자율성을 높이는 핵심 매커니즘이다. (=캡슐화) 

 

객체에 자율성을 보장하는 책임을 부여하기 위해서는, 객체는 다른 객체에게 `어떻게`가 아니라 `무엇을`에 대한 요청을 해야하고, 요청 받은 객체는 `무엇을`만을 외부로 노출해야한다. 예를 들어 사람 객체에 키를 키우고 싶다면, 요청을 할 때에`우유를 먹고 키를 키워라` 혹은 `운동을 해서 키를 키워라` 대신 `키를 키워라` 라고 요청하는 것이다. 그리고 `키를 키울 것`을 요청 받은 객체는 어떻게 키를 키울지는 자율적으로 결정하면 된다.

 

객체에 구현이 노출되면, 나중에 구현이 변경되었을 때에 전체 소프트웨어에 영향이 가는 큰 공수가 드는 작업이 될 수 있다. 또한, 다른 객체와의 협력이 어려워지고, 협력이 어려워지면 객체의 재사용성은 낮아진다.

 

객체지향 설계란 무엇인가?

객체지향 설계란, 각자의 책임을 가진 객체들끼리 메시지를 통해서 협력하는 것이다.

 

객체 지향 설계의 올바른 순서는, 애플리케이션에 필요한 `협력`을 생각하고 → 협력에 참여하는 데 필요한 `행동`을 생각한 후 → 행동을 수행할 `객체`를 선택하는 방식으로 수행된다( = what/who cycle). → 그리고 행동에 적절한 `상태`를 선택하게 된다.

 

객체 지향 설계를 하면서 중요한 순서는, 메시지(행동)를 먼저 정하는 것이다. 메시지를 정하고, 해당 메시지를 수행할 적절한 객체를 정해라. 메시지를 정하고 수행할 객체(수신자)를 정하기 때문에, 메시지가 수신자의 인터페이스를 정하게 되고, 자연스레 객체들끼리 협력하는 설계가 된다.

 

+ 추가개념1. 추상화

추상화란, 꼭 알아야하는 사실만 명확히 표현하고 몰라도 되는 정보는 무시하는 것이다. 이는 이해하기 쉽고, 단순하며, 목적에 부합하는 객체를 만들어 복잡성을 극복해낼 수 있는 기반이 된다.

 

추상화는 두 가지 차원에서 이루어진다. 첫번째는, 공통점은 취하고 차이점은 버리는 것이다. 두번째는, 불필요한 세부사항은 버리는 것이다. 두 가지 모두 단순화가 목적이다.

 

공통점을 기반으로 객체들을 묶기 위한 그릇을 개념(concept)라고 한다. 개념을 이용하면 객체를 여러 그룹으로 분류(classification) 할 수 있다. 객체가 개념을 가지고 분류되어 어떤 그룹의 일원이 될 때, 객체는 해당 개념의 인스턴스(instance)가 된다.

 

+ 추가개념2. TDD

TDD는 테스트를 먼저 작성하고 테스트를 통과하는 구체적 코드들을 추가하면서 애플리케이션을 완성해나가는 것이다. 객체가 이미 존재한다고 가정하고, 객체에게 어떤 메시지를 보내어 협력할 것인가에 대해서 먼저 생각하는 것이 핵심이다.

 

테스트 주도 개발은 테스트를 작성하는 것이 아니다. 책임을 수행할 객체가 메시지를 수신할 때 어떤 결과를 반환하고, 그 과정에서 어떤 객체와 협력할 것인지에 대한 기대를 코드의 형태로 작성하는 것이다.

'생각 정리 > 독서' 카테고리의 다른 글

2024-04. Clean Code  (0) 2024.09.02
2024-03. 오브젝트 (1)  (1) 2024.02.08
2024-01. 소프트웨어 장인  (2) 2024.01.17
부자 아빠, 가난한 아빠  (0) 2022.09.06
위대한 나의 발견, 강점 혁명  (0) 2022.07.04