객체지향

오브젝트(조영호) 책 정리 -7-

정한_s 2021. 11. 18. 11:50

프로그래밍 언어의 발전은 좀 더 효과적인 추상화를 통해 복잡성을 극복하려는 노력에서 출발했다. 현대적인 프로그래밍 언어를 특징을 짓는 두 가지 추상화 메커니즘은 프로시저 추상화와 데이터 추상화이다.

 

프로시저 추상화는 소프트웨어가 무엇을 해야 하는지 추상화한다. 데이터 추상화는 소프트웨어가 무엇을 알아야 하는지를 추상화한다.

 

시스템을 분해하는 방법을 결정하려면 프로시저를 추상화를 중심으로 할 것인지, 정보를 추상화 중심으로 할 것인지 결정해야 한다. 프로시저를 중심으로 시스템을 분리한다면 기능 분해이다. 정보를 중심으로 추상화한다면 타입을 추상화 (Abstract Data Type)와 프로시저를 추상화(Object-Oriented)가 있다.

 

전통적인 기능 분해 방법은 하향식 접근법이 있다. 하향식 접근이란 시스템을 최상위의 가장 추상적인 메인 함수로 정의하고, 메인 함수를 구현 가능한 수준까지 세부적인 단계로 분해하는 것이다. 이 방법은 논리적이고 체계적인 개발 절차를 제시하지만 현실 세계는 예측하기가 어렵고 변하기 때문에 여러 문제점을 지닌다.

 

하향식 접근 문제점

  • 본래의 시스템은 하나의 메인 함수로 구성돼 있지 않다
  • 기능 추가나 요구사항 변경으로 인해 메인 함수가 빈번하게 수정된다
  • 비즈니스 로직과 사용자 인터페이스가 강하게 결합되어 있다
  • 하향식 분해는 이른 시기에 함수의 실행 순서를 고정시켜 유연성이 떨어진다
  • 데이터의 형식이 변경되는 경우 파급 효과를 예측하기 어렵다

이러한 문제점으로 인해 시스템을 분해하는 것을 기능 기반으로 하는 것이 아니라 변경의 방향에 맞춰 시스템 분해하는 방법을 사용했다. 시스템 분해의 전략이 기능 기반으로 시스템을 분해하는 것이 아니라, 함께 변경하는 부분을 하나의 구현 단위로 묶고 퍼블릭 인터페이스를 통해서만 접근하도록 만들었다(모듈 분해 방식).

 

모듈 분해 방식 장점 및 한계

  • (장점) 모듈 내부의 변수가 변경되더라도 모듈 내부에만 영향을 미친다
  • (장점) 비즈니스 로직과 사용자 인터페이스에 대한 관심사를 분리한다
  • (장점) 전역 변수와 전역 함수를 제거함으로써 네임 스페이스 오염을 방지한다
  • (한계) 인스턴스 개념을 제공하지 않는다. 

한계를 극복하기 위해 다수의 개별 인스턴스가 존재하는 추상화 메커니즘이 필요했다. 따라서 추상 데이터 타입이라는 개념이 등장하였다. 추상 데이터 타입의 기본 의도는 프로그래밍 언어가 제공하는 타입처럼 동작하는 사용자 정의 타입을 추가할 수 있게 하는 것이다. 

 

 

타입 추상화는 개별 오퍼레이션이 모든 개념적인 타입에 대한 구현을 포괄하도록 함으로써 하나의 물리적인 타입 안에 전체 타입을 감춘다.

추상 데이터 타입이 오퍼레이션을 기준으로 타입을 묶는 방법이라면 객체 지향은 타입을 기준을 오퍼레이션을 기준으로 묶는다. 하나의 타입을 여러 개의 타입으로 나누며 타입 유형과 관련된 오퍼레이션의 실행 절차를 타입들에게 분배한다.

 

객체지향 분해를 위해서...

클래스가 추상 데이터 타입을 따르는지 객체지향을 따르는지 확일 할 수 있는 가장 간단한 방법은 클래스 내부에 인스턴스의 타입을 표현하는 변수가 있는지 확인하는 것이다. 인스턴스 변수에 저장된 값을 기반으로 메서드 내에서 타입에 따라 명시적으로 구분되어 있다면 객체지향을 위반하는 것이다.

즉, 객체지향에서는 타입 변수를 이용한 조건문을 다형성으로 대체한다.  

 

마지막으로 설계는 변경과 관련된 것이다. 설계의 유용성은 변경의 방향성과 발생 빈도에 따라 결정된다. 새로운 타입을 빈번하게 추가해야 한다면 객체지향의 클래스 구조가 더 유용하다. 하지만 새로운 오퍼레이션을 빈번하게 추가해야 한다면 추상 데이터 타입을 선택하는 것이 현명한 판단이다. 변경의 방향에 따라 적절한 설계 구조를 선택해야 한다.