[오브젝트] 7장 - 객체 분해
    2022-10-02 10:00
    object

    모든 프로그래밍 패러다임은 추상화와 분해의 관점에서 설명 가능

    추상화 메커니즘

    시스템을 분해하는 방법을 프로시저와 데이터 추상화중 하나를 중심으로 하여 결정해야한다.

      1. 프로시저 추상화
      • 소프트웨어가 무엇을 해야하는지 추상화
      • 기능 분해
        • 기능 구현을 위해 필요한 기능들을 순차적으로 찾아가는 탐색의 과정
      1. 데이터 추상화
      • 소프트웨어가 무엇을 알아야 하는지 추상화
      • 타입을 추상화(추상 데이터 타입) vs 프로시저를 추상화(객체지향)
        • 타입을 추상화 하면 추상 데이터 타입
        • 프로시저를 추상화 하면 객체지향

    1. 프로시저 추상화와 기능 분해

    • 프로시저
      • 반복적으로 수행되는 작업을 한 장소에 모아서 로직을 재사용하고 중복을 방지하는 추상화 방법
      • 내부의 상세 구현을 모르더라도 인터페이스만 알면 프로시저 사용 가능.
      • 기능 분해 방식 - 하향식 접근법

    하향식 접근법

    최상위 기능을 정의하고(메인 함수) 덜 추상적인 하위 기능으로 분해해 나가는 방법

    하향식 접근법의 문제점

    • 현대 시스템은 동등한 수준의 다양한 기능으로 구성된다.
    • 대부분의 시스템은 하나의 메임 함수로 구성돼 있지 않다.
      • "실제 시스템에 정상이란 존재하지 않는다"
    • 요구사항 변경시 메인 함수를 빈번하게 변경해야 한다.
    • 로직이 사용자 인터페이스와 강하게 결합되어있다.
    • 데이터 형식이 변경될 경우 관련된 모든 함수를 수정해야한다.
    • 설계 시작부터 시스템이 어떻게 동작해야 하는지에 집중하게 한다.
    • 이른 시기에 함수 실행 순서를 고정하여 유연성과 재사용성이 떨어진다.

    이와 같은 기능 분해의 문제를 해결하기 위해 정보 은닉과 모듈 개념이 등장.

    모듈

    • 변경의 방향에 맞춰 시스템을 분해하라
    • 함께 변경되는 부분을 하나의 구현 단위(모듈)로 묶고 퍼블릭 인터페이스를 통해서만 접근 가능하도록 만드는 것. (높은 응집도, 낮은 결합도)
    • 각 모듈은 외부에 감춰야 하는 비밀과 관련성 높은 데이터, 함수의 집합.

    정보 은닉

    시스템을 모듈 단위로 분해하기 위한 기본 원리.

    시스템에서 자주 변경되는 부분을 상대적으로 덜 변경되는 인터페이스 뒤로 감춰라.

    • 모듈 분해
      • 감춰야 하는 정보를 선택하고 정보를 안정적인 보호막(퍼블릭 인터페이스)을 통해 보존하는 과정
      • 모듈 분해 후, 기능 분해를 통해서 모듈에 필요한 퍼블릭 인터페이스를 구현

    모듈의 장점과 한계

    장점

    • 모듈 데이터 변경으로 인한 파급효과를 제어할 수 있기 때문에 코드 수정 및 디버깅이 용이하다.
    • 비즈니스 로직과 사용자 인터페이스에 대한 관심사가 분리된다.
    • 전역 변수와 전역 함수를 제거하여 네임스페이스 오염을 방지한다.

    단점

    • 인스턴스의 개념을 제공하지 않는다.

    이러한 단점을 개선하기 위해 추상 데이터 타입이라는 개념이 등장.

    2. 데이터 추상화

    추상 데이터 타입

    • 프로그래밍 언어가 제공하는 타입처럼 동작하는 사용자 정의 타입
    • 타입을 개발자가 정의할 수 있다.
    • 하나의 물리적 타입 안에 개념적 타입에 대한 구현을 감춘다.

    클래스는 추상 데이터 타입인가?

    클래스와 추상 데이터 타입의 차이

    • 클래스

      • 상속과 다형성을 지원 - 객체지향 프로그래밍
      • 절차를 추상화 한것
      • 타입을 기준으로 오퍼레이션을 묶는다.
    • 추상 데이터 타입

      • 상속과 다형성 지원 X - 객체기반 프로그래밍
      • 타입을 추상화 한것
      • 오퍼레이션을 기준으로 타입을 묶는다
    • 클래스가 추상 데이터 타입의 개념을 따르는지 확인하는 방법

      • 클래스 내부에 인스턴스의 타입을 표현하는 변수의 유무
        • 인스턴스 변수에 저장된 값을 기반으로 메서드 내에서 타입을 명시적으로 구분하는건 객체지향을 위반
      • 타입을 기준으로 절차를 추상화하지 않았다면 객체지향 분해가 아니다.

    변경을 기준으로 선택하라

    설계의 유용성은 변경의 방향성과 발생 빈도에 따라 결정된다.

    • 클래스 구조를 선택하는 경우
      • 타입 추가라는 변경의 압력이 더 강한 경우
        • 새로운 타입을 빈번하게 추가해야 하는 경우
    • 추상 데이터 타입을 선택하는 경우
      • 변경의 주된 압력이 오퍼레이션 추가인 경우
        • 새로운 오퍼레이션을 빈번하게 추가해야 하는 경우

    변경의 축을 찾아야 한다. 객체지향적인 접근법이 은총알은 아니다.

    느낀점

    추상 데이터 타입이 사용된 예가 뭐가있을지 고민해 보았는데 스택과 같은 자료구조가 떠올랐다.

    자료구조 수업에서 C++로 스택과 연결 리스트 등을 구현해 보았었는데, 이번 기회에 자바로도 한번 구현해 보도록 해야겠다.