본문 바로가기
책/오브젝트

07. 객체 분해

by 오오오오니 2025. 3. 17.

07. 객체 분해

비어 있음
2024년 4월 16일
조지 밀러의 이론에 따르면 사람이 동시에 단기 기억 안에 저장할 수 있는 정보의 개수는 9개 정도를 넘지 못한다고 한다.
프로그램은 시간과 공간의 트레이드오프를 통해 효율을 향상시킬 수 있지만, 사람의 단기 기억에 있어 시간과 공간의 두 측면 모두가 병목지점으로 작용한다.
본질적인 정보만 남기는 추상화를 통해 단기 기억의 한계를 초월할 수 있다.
이런 추상화는 인류가 소프트웨어 개발 영역에 사용해 왔다.

프로시저 추상화와 데이터 추상화

현대적인 프로그래밍 언어를 특징 짓는 중요한 두 가지 추상화 매커니즘은 프로시저 추상화데이터 추상화다.
데이터 추상화를 할 때 데이터를 중심으로 타입을 추상화 하는 것을 추상 데이터 타입이라고 하고 , 데이터를 중심으로 프로시저를 추상화하는 것을 객체지향이라고 한다.

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

전통적인 기능 분해 방법인 하향식 접근법은 변경에 취약한 설계를 낳는다.
시스템이 하나의 메인 함수로만 구현된다는 개념은 현대적인 상호작용 시스템을 개발하는 데 적합하지 않다.
또한 하향식 접근법은 기능을 분해하는 과정에서 사용자 인터페이스의 관심사와 비지니스 로직의 관심사를 동시에 고려하도록 강요하기 때문에 “관심사의 분리”라는 아키텍처 설계의 목적을 달성하기 어렵다.
하향식 설계와 관련된 모든 문제의 원인은 결합도다. 상위 함수가 강요하는 문맥에 강하게 결합된다.

모듈

데이비드 파나스는 소프트웨어 개발의 가장 중요한 원리인 동시에 가장 많은 오해를 받고 있는 정보 은닉의 개념을 소개했다.
정보 은닉은 시스템을 모듈 단위로 분해하기 위한 기본 원리로 시스템에서 자주 변경되는 부분을 상대적으로 덜 변경되는 안정적인 인터페이스 뒤로 감춰야 한다는 것이 핵심이다.
기능 분해가 하나의 기능을 구현하기 위해 필요한 기능들을 순차적으로 찾아가는 것이라면
모듈 분해는 감춰야 하는 비밀을 선택하고 비밀 주변에 안정적인 보호막을 설치하는 보존의 과정이다.

모듈의 장점과 한계

모듈 내부의 변수가 변경되더라도 모듈 내부에만 영향을 미친다.
비지니스 로직과 사용자 인터페이스에 대한 관심사를 분리한다.
전역 변수와 전역 함수를 제거함으로써 네임스페이스 오염을 방지한다.
비록 모듈이 프로시저 추상화보다는 높은 추상화 개념을 제공하지만 태생적으로 변경을 관리하기 위한 구현 기법이기 때문에 추상화 관점에서의 한계점이 명확하다.

데이터 추상화와 추상 데이터 타입

프로시저 추상화를 보완하기 위해 데이터 추상화의 개념을 제안했다.
추상 데이터 타입을 구현하려면 프로그래밍 언어의 지원이 필요하다.
타입 정의를 선언할 수 있어야 한다.
타입의 인스턴스를 다루기 위해 사용할 수 있는 오퍼레이션의 집합을 정의할 수 있어야 한다.
제공된 오퍼레이션을 통해서만 조작할 수 있도록 데이터를 외부로부터 보호할 수 있어야 한다.
타입에 대해 여러 개의 인스턴스를 생성할 수 있어야 한다.

클래스

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

추상 데이터 타입과 클래스는 동일하지 않다.
클래스는 상속과 다형성을 지원하는 데 비해 추상 데이터 타입은 지원하지 못한다.
상속과 다형성을 지원하는 객체지향 프로그래밍과 구분하기 위해 상속과 다형성을 지원하지 않는 추상 데이터 타입 기반의 프로그래밍 패러다임을 객체기반 프로그래밍이라고 부르기도 한다.

변경을 기준으로 선택하라

단순히 클래스를 구현 단위로 사용한다는 것이 객체지향 프로그래밍을 한다는 것을 의미하지는 않는다.
타입을 기준으로 절차를 추상화하지 않았다면 그것은 객체지향 분해가 아니다.
클래스가 추상 테이터 타입의 개념을 따르는지를 확인할 수 있는 가장 간단한 방법은 클래스 내부에 인스턴스의 타입을 표현하는 변수가 있는지를 살펴보는 것이다.
인스턴스 변수에 저장된 값을 기반으로 메서드 내에서 타입을 명시적으로 구분하는 방식은 객체지향을 위반하는 것으로 간주된다.
객체지향에서는 타입 변수를 이용한 조건문을 다형성으로 대체한다.
기존 코드에 아무런 영향도 미치지 않고 새로운 객체 유형과 행위를 추가할 수 있는 객체지향의 특성을 개방-폐쇄 원칙이라고 부른다.
새로운 타입을 빈번하게 추가해야 한다면 객체지향의 클래스 구조가 더 유용하다.
새로운 오퍼레이션을 빈번하게 추가해야 한다면 추상 데이터 타입을 선택하는 것이 현명하다.
변경의 축을 찾아라. 객체지향적인 접근법이 모든 경우에 올바른 해결 방법인 것은 아니다.

협력이 중요하다

객체지향은 기능을 수행하기 위해 객체들이 협력하는 방식에 집중한다. 협력이라는 문맥을 고려하지 않고 오퍼레이션의 구현 방식을 타입별로 분배하면 안된다.
객체를 설계할 때는 책임 주도 설계의 흐름을 따라야 한다.
타입계층과 다형성은 협력이라는 문맥 안에서 책임을 수행하는 방법에 관해 고민한 결과물이어야 하며 그 자체가 목적이 되어서는 안된다.

느낀점

“객체지향에서는 타입 변수를 이용한 조건문을 다형성으로 대체한다. “라는 말이 인상깊었다.
그렇다고 이렇게 타입을 중심으로 클래스 계층에 오퍼레션의 구현을 분배하는 것이 객체지향 설계가 아니라, 역할, 책임, 협력을 중심으로 접근해야 객체지향 설계라는 것을 배웠다.
프로시저 추상화와 데이터 추상화에 대한 설명이 추상화와 객체지향에 대해서 더 깊이있게 이해할 수 있게 했다.
내가 했던 설계 방법이 하향식 접근법과 비슷했던 것 같다. 객체지향설계를 할 수 있게 노력해야되겠다.

' > 오브젝트' 카테고리의 다른 글

09. 유연한 설계  (0) 2025.03.17
08. 의존성 관리하기  (0) 2025.03.17
06. 메시지와 인터페이스  (0) 2025.03.17
05. 책임 할당하기  (0) 2025.03.17
04. 설계 품질과 트레이드 오프  (0) 2025.03.17