중요하다고 생각하는 내용을 기준으로 정리
현대적인 프로그래밍 언어를 특징짓는 중요한 두 가지 추상화 메커니즘
프로시저 추상화(procedure abstruction)
알고리즘 분해 : 기능 분해 (function decomposition)
데이터 추상화(data abstruction)
추상 데이터 타입 : 타입을 추상화 (type abstraction)
객체 지향: 프로시저 추상화 (procedure abstruction)
알고리즘 분해를 기준으로 만든 하향식 기능 분해의 문제점
다수의 시스템은 하나의 메인 함수로 구성돼 있지 않다.
기능 추가나 요구사항 변경으로 인해 메인 함수를 빈번하게 수정해야 한다.
비즈니스 로직이 사용자 인터페이스와 강하게 결합된다.
하향식 분해는 너무 이른 시기에 함수들의 실행 순서를 고정시키기 때문에 유연성과 재사용성이 떨어진다.
데이터 형식이 변경될 경우 파급효과를 예측할 수 없다.
◎ 정보 은닉(information hiding)
시스템을 모듈 단위로 분해하기 위한 기본 원리
시스템에서 자주 변경되는 부분을 상대적으로 덜 변경되는 안정적인 인터페이스 뒤로 감춰야 한다는 것이 핵심
모듈이 감춰야 하는 비밀
복잡성
: 외부에 모듈을 추상화할 수 있는 간단한 인터페이스를 제공해서 모듈의 복잡도를 낮춘다.
변경 가능성
: 변경 발생 시 하나의 모듈만 수정하면 되도록 변경 가능한 설계 결정을 모듈 내부로 감추고 외부에는 쉽게 변경되지 않을 인터페이스를 제공한다.
◎ 모듈의 장점
모듈 내부의 변수가 변경되더라도 모듈 내부에만 영향을 미친다.
비즈니스 로직과 사용자 인터페이스에 대한 관심사를 분리한다.
전역 변수와 전역 함수를 제거함으로써 네임스페이스 오염을 방지한다.
◎ 추상 데이터 타입
필요 조건
타입 정의를 선언할 수 있어야 한다.
타입의 인스턴스를 다루기 위해 사용할 수 있는 오퍼레이션의 집합을 정의할 수 있어야 한다.
제공된 오퍼레이션을 통해서만 조작할 수 있도록 데이터를 외부로부터 보호받을 수 있어야 한다.
타입에 대해 여러 개의 인스턴스를 생성할 수 있어야 한다.
추상 데이터 타입 기반의 프로그래밍 패러다임을 객체기반 프로그래밍(Object-Based Programming) 이라고 한다.
정확하게는 객체지향 프로그래밍과 구분하기 위해 객체기반 프로그래밍이라고 부르기도 한다.
여기에 상속과 다형성을 지원하면 객체지향 프로그래밍(Object-Orientied Programming) 이라고 한다.