kyucumber
전체 글 보기

이펙티브 코틀린 아이템 26. 함수 내부의 추상화 레벨을 통일하라

OOP에서는 추상화, 캡슐화, 상속 등의 주요 개념이 존재하며 추상화는 프로그래밍 세계에서 가장 중요한 개념 중 하나이다.

추상화

복잡한 자료, 모듈 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려내는것, 복잡성을 숨기기 위해 사용되는 단순한 형식이며 대표적인 예로 인터페이스가 있다.

프로그래밍에서는 다음과 같은 목적으로 추상화를 사용한다.

  • 복잡성을 숨기기 위해
  • 코드를 체계화하기 위해
  • 만드는 사람에게 변화의 자유를 주기 위해

추상화 레벨

일반적으로 컴퓨터 과학자들은 어떤 계층이 높은 레벨인지 낮은 레벨인지를 구분한다. 높은 레벨일수록 물리 장치로부터 점점 멀어진다.

item-26-level.png

높은 레벨일수록 걱정해야 하는 세부적인 내용들이 적지만 제어력을 잃는다.

추상화 레벨 통일

컴퓨터 과학에서 높은 레벨과 낮은 레벨을 구분하는 것 처럼, 함수도 높은 레벨과 낮은 레벨을 구분해서 사용해야 한다는 원칙이 있으며 이를 추상화 레벨 통일(Single Level of Abstraction, SLA) 원칙이라고 부른다.

class CoffeeMachine { fun makeCoffee() { // 수백개의 변수와 복잡한 로직 } }

위와 같이 한 함수가 수많은 로직이 들어간 경우 읽고 이해하는 것이 어렵다.

따라서 최근에는 아래와 같이 함수를 계층처럼 나누어 사용한다.

class CoffeeMachine { fun makeCoffee() { boilWater() brewCoffee() purCoffee() } }

makeCoffee 함수는 이제 이해하기 쉬우며, 낮은 레벨(boilWater, brewCoffee)를 이해해야 한다면 해당 부분의 코드만 살펴보면 된다.

매우 간단한 추상화를 통해 가독성을 크게 향상시킬 수 있다. 이외에 이런 형태로 함수를 추출하면 재사용과 테스트가 쉬워진다.

프로그램 아키텍처의 추상 레벨

추상화 계층이라는 개념은 함수보다 높은 레벨에서도 적용할 수 있다.

이러한 개념을 이용해 모듈 시스템을 설계하고 모듈을 분리하면 계층 고유의 요소를 숨길 수 있다.

입출력을 나타내는 모듈(프론트엔드의 뷰, 벡엔드의 HTTP 요청 처리 등)은 낮은 레벨의 모듈이며 비즈니스 로직을 나타내는 부분이 높은 레벨의 모듈이다.

계층이 잘 분리된 프로젝트를 계층화가 잘 되었다고 부르며 계층화가 잘 된 프로젝트는 어떤 계층 위치에서 코드를 보아도 일관적인 관점을 얻을 수 있다.

정리

별도의 추상화 계층을 만드는 것은 프로그래밍에서 일반적으로 사용되는 개념이다.

추상화를 통해 상호 운영성(interoperability)과 플랫폼 독립성을 얻을 수 있다.

함수 클래스 모듈 등 다양한 방식을 통해 추상화를 분리할 수 있으며 이때 각각의 레이어가 너무 커지는 것은 좋지 않다.

Reference

  • 이펙티브 코틀린 - 프로그래밍 인사이트, 마르친 모스칼라 지음, 윤인성 옮김

개인적인 기록을 위해 작성된 글이라 잘못된 내용이 있을 수 있습니다.

오류가 있다면 댓글을 남겨주세요.