본문 바로가기
개발 도서

개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴 - PART 1

by 성건희 2019. 11. 26.
반응형

<!doctype html>

PART 1. 객체 지향

 

객체 지향

  • 시스템을 상호작용하는 자율적인 객체들을 공동체로 보고 객체들을 이용해서 시스템을 분할하는 방식

 

자율적인 객체란?

  • 상태와 행위를 가지고 자신의 일을 스스로 책임질 수 있는 객체

 

절차 지향 / 객체 지향

  • 절차 지향

    • 데이터 중심의 프로시저로 프로그래밍을 구성하는 기법
  • 객체 지향

    • 데이터와 관련된 프로시저를 객체라는 단위로 묶어 객체들이 모여 프로그래밍을 구성하는 기법

 

객체 지향의 핵심

  • 기능을 제공하는 것
  • 말 그대로 객체를 지향하는 것이지 클래스를 지향하는 것이 아님

 

객체 지향의 장점

  • 한 곳의 구현 변경이 다른 곳에 변경을 시키지 않도록 해줌

    • 캡슐화
    • 추상화

 

오퍼레이션 / 시그니처

  • 오퍼레이션

    • 객체가 제공하는 기능
  • 시그니쳐

    • 오퍼레이션의 사용법

      • 다음 3가지로 구성

        • 기능 식별 이름
        • 파라미터 및 파라미터 타입
        • 기능 실행 결과 값
  • 인터페이스

    • 객체가 제공하는 모든 오퍼레이션의 집합
    • 자바의 인터페이스와는 다름
    • 객체 지향에서 오퍼레이션 집합을 표현할 때 사용되는 용어
    • 객체를 사용하기 위한 일종의 명세나 규칙

 

다형성

  • 한 객체가 여러 타입을 가질 수 있다는 뜻

 

추상화

  • 데이터나 프로세스등을 의미가 비슷한 개념이나 표현으로 정의하는 과정
  • ex) '이상한 나라의 앨리스' 동화전집에서 병사 스페이스 트럼프, 병사 하트 트럼프, 왕비 트럼프, 왕 트럼프 들을 앨리스가 보고 '고작 트럼프에 불과해!'라는 말로 트럼프로 추상화 했다

 

콘크리트 클래스 (concrete class)

  • 인터페이스에 정의된 기능을 하위 타입에게 실제 구현을 제공한다는 의미로 하위 타입들을 콘크리트 클래스로 부름

 

콘크리트 클래스 타입을 쓰지 않고 추상 타입을 쓰는 이유

  • 유연함
  • 추상화는 책임을 분리시키는 촉매제 역할을 함

 

TDD

  • 테스트 주도 개발
  • 구현할 코드에 대한 테스트를 먼저 작성하고, 작성한 테스트를 성공시키는 코드를 점진적으로 완성
  • 테스트를 강제함으로써 알맞은 책임을 가진 객체를 만들도록 유도하여 객체 지향 설계를 유도하는 개발 방식이다

 

상속보단 조립

  • 상속의 단점
    • 상위 클래스 변경의 어려움

      • 클래스의 계층도가 커질수록 상위 클래스를 변경하는 것은 점점 어려워진다
    • 클래스의 불필요한 증가

      • 다중 상속을 지원하지 않기 때문에 동일한 기능을 2개이상 사용하려면 클래스를 하나 더 만들어야 하는 불상사 발생
    • 상속자체를 잘못 사용할 수 있다

  • 조립
    • 여러 객체를 묶어 더 복잡한 기능을 제공하는 객체를 만드는 것

    • 조립의 장점
      • 필요한 객체를 붙이면 되므로 클래스를 불필요하게 증가하지 않는다
      • 런타임에 조립 대상 객체를 교체할 수 있다
    • 조립의 단점
      • 상속에 비해 상대적으로 런타임 구조가 복잡해진다

      • 상속보다 구현이 더 어렵다

        • 하지만 장기적 관점에서 구현 / 구조의 복잡함보다 변경의 유연함을 확보하는 데서 오는 장점이 더 크므로, 기능을 재사용해야 할 경우 상속보다는 조립을 먼저 고려할 것

 

모든 상황에서 조립을 사용하라는 것은 아님 상속을 사용하다 보면 변경의 관점에서 유연함이 떨어질 가능성이 높으니 조립을 먼저 고려하라는 것이다

 

위임

  • 내가 할 일을 다른 객체에게 넘긴다

  • 보통 조립 방식으로 구현

  • 위임의 단점
    • 내가 바로 실행할 수있는 것을 다른 객체에게 한 번 더 요청하므로 실행 시간이 증가한다

      • 연산 속도가 매우 중요한 시스템에서는 많은 위임 코드가 성능에 문제를 일으킬 수 있지만, 대부분의 경우에는 위임으로 인해 발생하는 미세한 성능 저하보다 위임을 통해서 얻을 수 있는 유연함 / 재사용의 장점이 더 크다

 

그럼 상속은 언제 사용하나

  • 재사용이 아닌 기능의 확장이라는 관점에서 상속을 적용해야 한다
  • 명확한 IS-A 관계가 성립되어야 한다
  • 최초에는 명확한 IS-A 관계로 보여서 상속을 이용해 기능을 확장했다고 하더라도, 이후에 클래스의 개수가 불필요하게 증가하는 문제가 발생하거나 상위 클래스의 변경이 어려워지는 등 상위 클래스를 상속받을 때의 단점이 발생한다면 조립으로 전환하는 것을 고려하라

 

참고

  • 개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴 - 최범균

 

반응형

댓글