[오브젝트] 19일차

da__ell·2023년 8월 27일
0

독서 - 오브젝트

목록 보기
19/25
post-thumbnail

p. 235 ~ p. 249

7-3. 모듈

정보 은닉과 모듈

시스템 변경을 관리하는 기본적인 전략 → 함께 변경되는 부분을 하나의 구현 단위로 묶고 퍼블릭 인터페이스를 통해서만 접근하도록 만드는 것

정보 은닉은 시스템을 모듈 단위로 분해하기 위한 기본 원리 → 자주 변경되는 부분을 상대적으로 덜 변경되는 안정적인 인터페이스 뒤로 감추는 것이 핵심

모듈과 기능 분해는 상호 배타적인 관계가 아니다.

기능 분해는 하나의 기능을 구현하기 위해 필요한 기능들을 순차적으로 찾아가는 탐색의 과정
모듈 분해는 감출 비밀을 선택하고 비밀 주변에 안정적인 보호막을 설치하는 보존의 과정

모듈이 감추는 비밀은 다음과 같다.

  • 복잡성 : 외부에 모듈을 추상화할 수 있는 간단한 인터페이스를 제공 → 모듈의 복잡도를 낮춘다.
  • 변경 가능성 : 변경 발생 시 하나의 모듈만 수정하도록 변경 가능한 설계 설정을 모듈 내부로 감춘다.

비밀이 반드시 데이터일 필요는 없다. 복잡한 로직이나 변경 가능성이 큰 자료 구조 일 수도 있다. but 변경 시 시스템을 굴복시키는 대부분의 경우는 데이터가 변경되는 경우

모듈의 장점과 한계

  • 모듈 내부의 변수가 변경되더라도 모듈 내부에만 영향을 미친다.
    어떤 데이터가 변경됐을 때 영향을 받는 함수를 찾기 위해 해당 데이터를 정의한 모듈만 검색하면 된다. → 데이터 변경의 파급효과 제어
  • 비즈니스 로직과 사용자 인터페이스에 대한 관심사 분리
    모듈은 비즈니스 로직과 관련된 관심사만을 담당
  • 전역 변수와 전역 함수를 제거
    변수와 함수를 모듈 내부에 포함시킴으로써 다른 모듈에서도 동일한 이름을 사용 가능

모듈은 기능이 아니라 변경의 정도에 따라 시스템을 분해. 각 모듈은 감춰야 하는 비밀과 관련성 높은 데이터와 함수의 집합이다. → 모듈 내부는 높은 응집도를 유지

모듈과 모듈 사이에는 퍼블릭 인터페이스를 통해서만 통신 → 모듈 간의 낮은 결합도를 유지

모듈은 정보 은닉이라는 개념을 통해 데이터를 핵심요소로 부각

모듈은 데이터와 함수가 통합된 한 차원 높은 추상화를 제공하는 설계 단위다.

모듈이 프로시저 추상화보다는 높은 추상화 개념을 제공 but 추상화 관점에서의 한계점이 명확. 모듈의 가낭 큰 단점은 인스턴스 개념을 제공하지 않는다.

모듈의 가장 큰 단점은 인스턴스 개념을 제공하지 않는다는 것. 좀더 높은 수준의 추상화를 위해서는 개별적인 다수의 인스턴스를 독립적인 단위로 다룰 수 있어야 한다.

이를 만족시키기 위해 등장한 개념이 추상 데이터 타입.

7-4. 데이터 추상화와 추상 데이터 타입

추상 데이터 타입

프로그래밍 언어에서 타입이란 변수에 저장할 수 있는 내용물의 종류와 변수에 저장될 수 있는 연산의 가짓수를 의미. 타입은 저장된 값에 대해 수행될 수 있는 연산의 집합을 결정 → 변수의 값이 어떻게 행동할지 예측 가능

프로그래밍 언어는 다양한 형태의 내장 타입을 제공

바바라 리스코프 → 프로시저 추상화의 한계를 인지하고 데이터 추상화의 개념 제안.

추상 데이터 타입은 추상 객체의 클래스를 정의한 것으로 추상 객체에 사용할 수 있는 오퍼레이션을 이용해 규정

추상 데이터 객체를 사용할 때 프로그래머는 오직 객체가 외부에 제공하는 행위에만 관심 → 행위가 구현되는 세부적 사항 무시

추상 데이터 타입을 구현하기 위해 다음과 같은 프로그래밍 언어의 지원 필요

  • 타입 정의 선언
  • 타입의 인스턴스를 다루기 위해 사용할 수 있는 오퍼레이션의 집합을 정의할 수 있어야 한다.
  • 제공된 오퍼레이션을 통해서만 조작할 수 있도록 데이터를 외부로부터 보호
  • 타입에 대해 여러 개의 인스턴스 생성 가능

언어 차원에서 추상 데이터 타입을 지원하는 것과 관습, 기법 등을 통해 모방하는 것은 다르다. (불가능)

추상 데이터 타입을 설계하려면 어떤 데이터를 감추기 위해 데이터 추상화가 필요한지 질문해야 한다.

내부에 캡슐화할 데이터를 결정했다면 추상 데이터 타입에 적용할 수 있는 오퍼레이션을 결정해야 한다.

추상적인 데이터 타입은 사람들이 세상을 바라보는 방식에 좀 더 근접해지도록 추상화 수준을 향상시킨다.

추상화 데이터 타입 정의를 기반으로 객체를 생성하는 것은 가능하지만 여전히 데이터와 기능을 분리해서 바라본다는 점을 주의하라.
추상 데이터 타입으로 표현된 데이터를 이용해서 기능을 구현하는 핵심 로직은 추상 데이터 타입 외부에 존재한다 → 여전히 데이터와 기능을 분리하는 절차적인 설계에 틀에 갖혀있음.

7-5. 클래스

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

대부분의 프로그래밍 서적은 클래스를 추상 데이터 타입으로 설명한다 → 클래스와 추상 데이터 타입 모두 외부에서는 객체의 내부 속성에 직접 접근할 수 없으며 오직 퍼블릭 인터페이스를 통해서만 외부와 의사소통할 수 있다.

하지만 명확한 의미에서 추상 데이터 타입과 클래스는 동일하지 않다.
핵심적인 차이는 클래스는 상속과 다형성을 지원하는 데 비해 추상 데이터 타입은 지원하지 못한다는 점이다.

상속과 다형성을 지원하지 않은 추상 데이터 타입 기반의 프로그래밍 패러다임 → 객체 지향이 아닌 객체 기반 프로그래밍

윌리엄 쿡 : 추상 데이터 타입은 타입을 추상화한 것 vs 클래스는 절차를 추상화 한 것

하나의 대표적인 타입이 다수의 세부적인 타입을 감추기 때문에 이를 타입 추상화라고 부른다. → 오퍼레이션을 기준으로 타입을 통합하는 데이터 추상화 기법

객체지향은 타입에 대한 각각의 클래스를 정의하고 각 클래스들이 오퍼레이션을 적절하게 구현한다.
이렇게 클래스로 분리할 경우 공통 로직을 어디에 둘 것인지 고민 → 가장 간단한 방법은 공통 로직을 포함할 부모클래스를 정의하고 → 유형의 클래스가 부모 클래스를 상속받게 하는 것

클라이언트가 부모 클래스의 참조자에 대해 메시지를 전송하면 실제 클래스가 무엇인가에 따라 절차가 실행 → 다형성

실제로 내부에서 수행되는 절차는 다르지만 클래스를 이용한 다형성은 절차의 차이점을 감춘다 → 절차 추상화

추상화 데이터 타입은 오퍼레이션을 기준으로 타입을 추상화, 클래스는 타입을 기준으로 절차들을 추상화

추상 데이터 타입에서 클래스로 변경하기

추상 데이터 타입 → 타입 모두를 완전한 구현

클래스 구현 → 타입이 공통적으로 가지는 속성과 메서드 시그니처만 정의하고 있는 불완전한 구현체

모든 타입에 대해 인스턴스를 생성해야 했던 추상 데이터 타입과 달리 클래스를 이용한 구현의 경우 클라이언트가 원하는 타입에 해당하는 클래스의 인스턴스를 명시적으로 지정할 수 있다.

클라이언트는 메시지를 수신할 객체의 구체적인 클래스에 관해 고민할 필요가 없다. 그저 수신자가 이해할 것으로 예상되는 메시지를 전송하기만 하면 된다.

profile
daelkdev@gmail.com

0개의 댓글