OOP에서는 추상화, 캡슐화, 상속 등의 주요 개념이 존재하며 추상화는 프로그래밍 세계에서 가장 중요한 개념 중 하나이다.
추상화
복잡한 자료, 모듈 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려내는것, 복잡성을 숨기기 위해 사용되는 단순한 형식이며 대표적인 예로 인터페이스가 있다.
프로그래밍에서는 다음과 같은 목적으로 추상화를 사용한다.
- 복잡성을 숨기기 위해
- 코드를 체계화하기 위해
- 만드는 사람에게 변화의 자유를 주기 위해
추상화 레벨
일반적으로 컴퓨터 과학자들은 어떤 계층이 높은 레벨인지 낮은 레벨인지를 구분한다. 높은 레벨일수록 물리 장치로부터 점점 멀어진다.
높은 레벨일수록 걱정해야 하는 세부적인 내용들이 적지만 제어력을 잃는다.
추상화 레벨 통일
컴퓨터 과학에서 높은 레벨과 낮은 레벨을 구분하는 것 처럼, 함수도 높은 레벨과 낮은 레벨을 구분해서 사용해야 한다는 원칙이 있으며 이를 추상화 레벨 통일(Single Level of Abstraction, SLA) 원칙이라고 부른다.
class CoffeeMachine {
fun makeCoffee() {
// 수백개의 변수와 복잡한 로직
}
}
위와 같이 한 함수가 수많은 로직이 들어간 경우 읽고 이해하는 것이 어렵다.
따라서 최근에는 아래와 같이 함수를 계층처럼 나누어 사용한다.
class CoffeeMachine {
fun makeCoffee() {
boilWater()
brewCoffee()
purCoffee()
}
}
makeCoffee 함수는 이제 이해하기 쉬우며, 낮은 레벨(boilWater, brewCoffee)를 이해해야 한다면 해당 부분의 코드만 살펴보면 된다.
매우 간단한 추상화를 통해 가독성을 크게 향상시킬 수 있다. 이외에 이런 형태로 함수를 추출하면 재사용과 테스트가 쉬워진다.
프로그램 아키텍처의 추상 레벨
추상화 계층이라는 개념은 함수보다 높은 레벨에서도 적용할 수 있다.
이러한 개념을 이용해 모듈 시스템을 설계하고 모듈을 분리하면 계층 고유의 요소를 숨길 수 있다.
입출력을 나타내는 모듈(프론트엔드의 뷰, 벡엔드의 HTTP 요청 처리 등)은 낮은 레벨의 모듈이며 비즈니스 로직을 나타내는 부분이 높은 레벨의 모듈이다.
계층이 잘 분리된 프로젝트를 계층화가 잘 되었다고 부르며 계층화가 잘 된 프로젝트는 어떤 계층 위치에서 코드를 보아도 일관적인 관점을 얻을 수 있다.
정리
별도의 추상화 계층을 만드는 것은 프로그래밍에서 일반적으로 사용되는 개념이다.
추상화를 통해 상호 운영성(interoperability)과 플랫폼 독립성을 얻을 수 있다.
함수 클래스 모듈 등 다양한 방식을 통해 추상화를 분리할 수 있으며 이때 각각의 레이어가 너무 커지는 것은 좋지 않다.
Reference
- 이펙티브 코틀린 - 프로그래밍 인사이트, 마르친 모스칼라 지음, 윤인성 옮김
개인적인 기록을 위해 작성된 글이라 잘못된 내용이 있을 수 있습니다.
오류가 있다면 댓글을 남겨주세요.