[Effective Kotlin] 아이템26 : 함수 내부의 추상화 레벨을 통일 하라

0

컴퓨터는 굉장히 복작한 장치다.
개발자의 관점에서, 컴퓨터의 가장 낮은 추상화 계층은 하드웨어이다.
개발자는 일반적으로 프로세서를 위한 코드를 작성하므로, 하드웨어 위의 관심있는 계층은 Processor Control Command 이다.
프로세서를 제어명령은 0과 1로 이루어지지만, 이를 쉽게 이해할 수 있도록 일대일 대응이되는 어셈블리어로 표현이 된다.

하지만 어셈블리어언어로 프로그래밍을 하는것은 굉장히 어렵기때문에, 높은 레벨의 언어로 변환하는 컴파일러가 만들어졌고,이후에 추상머신과 인터프리터 언어의 개념이 등장하였다.

이제 추상계층에 대해 살펴보자.

우리는 프로그래밍 언어와, 애플리케이션 계층을 주로 작업하는데, 추상화가 잘되어 있기 때문에, 아래 계층을 몰라도 사용할 수 있다.

추상화 레벨

일반적으로 컴퓨터 과학자들은 어떤계층이 높은레벨인지 낮을 레벨인지를 구분한다.
높은 레벨일 수록, 프로세서와 멀어지고, 걱정해야 하는 세부적인 내용들이 적다.

하지만 C와 자바의 메모리 관리에서 그렇듯 무엇이 장점이라 할 수 없다.

추상화 레벨 통일

위의 컴퓨터 추상화 계층 처럼 코드 또한 추상화를 할 수 있는데 그것을 이뤄주는 도구가 바로 함수이다.
컴퓨터 과학이 높은 레벨과 낮은 레벨을 구분해서 사용해야하는 원칙처럼 함수도 추상화 레벨통일 원칙을 지켜야한다.
만약 버튼을 하나 누르면, 커피를 만드는 커피 머신을 나타내는 클래스를 만든다고 해보자.

class CoffeMachine{

	fun makeCoffe(){
	// 수백개의 변수를 선언한다.
    // 복잡한 로직을 처리한다.
    // 낮은 수준의 최적화도 잔뜩한다.
	}
}

이렇게 작성할 경우, 세부 내용을 하나하나 읽으며 코딩해야하기 때문에 읽고 이해하는것이 불가능에 가깝다.
물의 온도를 수정해 달라라는 요청을 받았을때, 어떤 부분을 수정해야 할지 감조차 잡히지 않을것이다.
그래서 최근에는 함수를 계층처럼 나누어서 사용하는것이 중요하다.

class CoffeeMachine{
 
 fun makeCoffe(){
  boilWater()
  brewCoffe()
  PourCOffe()
  pourMilk()
 }

}

이렇게 구현할 경우, 함수가 어떤식으로 동작하는지 확실하게 이해할 수 있다.
물의 온도를 수정하는것은 boilwater()함수에서 수정을 하면 된다는것이 한눈에 보인다.
이렇게 매우 간단한 추상화를 통해 가독성을 크게 향상시킨것이다.
함수는 작아야 하며, 최소한의 책임만을 가져야 한다.
만약 어떤 함수가 다른 함수보다 좀 복잡하다면 일부분을 추출해서 추상화 하는것이 좋다.

추가로, 이런 형태의 함수 추출은 재사용과 테스트에 이점이 있다.

 fun makeEspressoCoffee(){
 	boilWater()
    brewCoffee()
    pourCoffee()
 }

위처럼 함수를 재사용하는것이 쉬워지고, 종속성이 사라져 테스트가 쉽다.

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

추상화 계층은 함수보다 높은 레벨에서도 적용할 수 있다.
추상화를 구분하는것은 서브시스템의 세부 사항을 숨김으로써 상호 운영성과 플랫폼 독립성을 얻기 위함이다.

이러한 개념은 모듈 시스템을 설계할때도 중요하다.

입력과 출력을 나타내는 프론트엔드의 뷰와 백엔드의 HTTP 요청은 낮은 레벨의 모듈이고, 비즈니스 로직이 높은 부분의 레벨이다.

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

정리

추상화 계층을 만드는것은 세부사항을 숨김으로써, 상호 운영성과 플랫폼 독립성을 얻기위함이다.
함수, 클래스, 모듈등의 다양한 방식을 통해 추상화를 분리하며, 각각의 레이어는 최소한의 책임만 갖는 함수로 만들도록 하자.
추상화 레벨을 구체적인 동작, 프로세서, 입출력과 가까울수록 낮은레벨이라고 표현한다.
낮은 추상화 계층에서는 높은 계층에서 사용하는 요소(API)를 만든다.

잘 생각해보면 마틴옹의 클린 아키텍처에서 분리를 하고자 하는 이유는 종속성 제거와 낮은 레벨과 높은 레벨의 추상화때문이라고 생각한다.
이번 챕터에서는 그얘기를 하고있다.

여기서 추상화에 대한 내용이 있기때문에 읽어보길 추천한다

profile
쉽게 가르칠수 있도록 노력하자

0개의 댓글