Table of contents
Open Table of contents
프로시저 추상화와 데이터 추상화
- 현대적인 프로그래밍 언어를 특정 짓는 중요한 두 가지 추상화 매커니즘은 **프로시저 추상화(procedure abstraction)**와 **데이터 추상화(data abstraction)**이다.
- 프로시저 추상화는 소프트웨어가 무엇을 해야하는지를 추상화한다.
- 데이터 추상화는 소프트웨어가 무엇을 알아야 하는지를 추상화한다.
시스템 분해 방법
- 프로시저 추상화(기능 분해, 알고리즘 분해)
- 데이터 추상화
- 타입을 추상화(type abstraction) -> 추상 데이터 타입
- 데이터를 중심으로 프로시저를 추상화(procedure abstraction) -> 객체지향
프로시저 추상화와 기능 분해
하양식 기능 분해의 문제점
- 시스템은 하나의 메인 함수로 구성돼 있지 않다.
- 기능 추가나 요구사항 변경으로 인해 메인 함수를 빈번하게 수정해야 한다.
- 비즈니스 로직이 사용자 인터페이스와 강하게 결합된다.
- 하양식 분해는 너무 이른 시기에 함수들의 실행 순서를 고정시키기 때문에 유연성과 재사용성이 저하된다.
- 데이터 형식이 변경될 경우 파급효과를 예측할 수 없다.
모듈의 장점과 한계
모듈 내부의 변수가 변경되더라도 모듈 내부에만 영향을 미친다 모듈을 사용하면 모듈 내부에 정의된 변수를 직접 참조하는 코드의 위치를 모듈 내부로 제한할 수 있다. 이제 어떤 데이더가 변경됐을 때 영향을 받는 함수를 찾기 위해 해당 데이터를 정의한 모듈만 검색하면 된다. 더 이상 전체 함수를 일일이 분석할 필요가 없다. 모듈은 데이터 변경으로 인한 파급효과를 제어할 수 있기 때문에 코드를 수정하고 디버깅하기가 더 용이하다.
비즈니스 로직과 사용자 인터페이스에 대한 관심사를 분리한다 사용자 입력과 화면 출력을 Employees 모듈이 아닌 외부에 뒀다는 점을 주목하라. 수정된 코드에서 Employees 모듈은 비즈니스 로직과 관련된 관심사만을 담당하며 사용자 인터페이스와 관련된 관심사는 모두 Employees 모듈을 사용하는 main 함수 쪽에 위치한다. 이제 GUI 같은 다른 형식의 사용자 인터페이스를 추가하더라도 Employees 모듈에 포합된 비즈니스 로직은 변경되지않는다.
전역 변수와 전역 함수를 제거함으로써 네임스페이스 오염(namespace pollution) 방지한다 모듈의 한 가지 용도는 네임스페이스를 제공하는 것이다. 변수와 함수를 모듈 내부에 포함시키기 때문에 다른 모듈에서도 동일한 이름을 사용할 수 있게 된다. 따라서 모듈은 전역 네임스페이스의 오염을 방지하는 동시에 이름 충돌(name collision)의 위험을 완화한다.
- 모듈은 기능이 아니라 변경의 정도에 따라 시스템을 분해하게 한다.
- 모듈 내부는 높은 응집도를 유지하고 낮은 결합도를 유지한다.
데이터 추상화와 추상 데이터 타입
추상 데이터 타입
절차형 언어들은 적은 수의 내장 타입만을 제공했고, 새로운 타입을 추가하는 것이 불가능하거나 제한적이었다.
추상 데이터 타입의 기본 의도는 프로그래밍 언어가 제공하는 타입처럼 동작하는 사용자 정의 타입을 추가할 수 있게 하는 것이다.
추상 데이터 타입을 구현하려면 다음과 같은 특성을 위한 프로그래밍 언어의 지원이 필요하다.
- 타입 정의를 선언할 수 있어야 한다.
- 타입의 인스턴스를 다루기 위해 사용할 수 있는 오퍼레이션의 집합을 정의할 수 있어야 한다.
- 제공된 오퍼레이션을 통해서만 조작할 수 있도록 데이터를 외부로부터 보호할 수 있어야 한다.
- 타입에 대해 여러 개의 인스턴스를 생성할 수 있어야 한다.
덕타이핑 개발자는 타입의 대표적인 특징들을 뽑아서 코드로 정의한다. 실제 대상은 훨씬 더 많은 특징을 가질 수 있다. 구조적 타이핑에선 객체가 어떤 타입에 부합하는 최소한의 특징을 가지고 있다면, 그 타입이라고 간주한다.
interface Person {
name: string;
}
interface Lifespan {
birth: Date;
death?: Date;
}
type K = keyof (Person | LifeSpan);
클래스
클래스는 추상 데이터 타입인가?
명확한 의미에서 추상 데이터 타입과 클래스는 동일하지 않다. 클래스는 상속과 다형성을 지원하는 데 비해 추상 데이터 타입은 지원하지 못한다는 점이다.
타입 추상화는 개별 오퍼레이션이 모든 개념적인 타입에 대한 구현을 포괄하도록 함으로써 하나의 물리적인 타입 안에 전체 타입을 감춘다. 따라서 타입 추상화는 오퍼레이션을 기준으로 타입을 통합하는 데이터 추상화 기법이다.
- 추상 데이터 타입은 오퍼레이션을 기준으로 타입을 추상화한다.
- 클래스는 타입을 기준으로 절차들을 추상화한다.
타입 추가라는 변경의 압력이 더 강한 경우에는 객체지향의 손을 들어줘야 한다.
- 추상 데이터 타입의 경우 새로운 타입을 추가하려면 타입을 체크하는 클라이언트 코드를 일일이 찾아 수정한 후 올바르게 작동하는지 테스트해야 한다.
- 객체지향의 경우에는 클라이언트 코드를 수정할 필요가 없다. 새로운 클래스를 상속 계층에 추가하기만 하면 된다.
변경의 주된 압력이 오퍼레이션을 추가하는 것이라면 추상 데이터 타입의 승리를 선언해야 한다.
- 객체지향의 경우 새로운 오퍼레이션을 추가하기 위해서는 상속 계층에 속하는 모든 클래스를 한번에 수정해야 한다.
더 볼거리