반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

안드로이드 개발자 노트

[이펙티브 코틀린] Item26. 함수 내부의 추상화 레벨을 통일하라. 본문

Kotlin/이펙티브 코틀린

[이펙티브 코틀린] Item26. 함수 내부의 추상화 레벨을 통일하라.

어리둥절범고래 2023. 11. 19. 18:28
반응형

 

계층이 잘 분리되면 어떤 계층에서 작업할 때 그 아래의 계층은 이미 완성되어 있으므로, 전체를 이해할 필요없이 해당 계층만 생각하면 됩니다.

 

 

추상화 레벨

 

계층 레벨이 높아질 수록 물리 장치와 프로세서로부터 멀어집니다.

높은 레벨일 수록 걱정해야 하는 세부적인 내용들이 적어져서 단순함을 얻지만, 제어력을 잃을 수 있습니다.

예를 들어 C언어는 메모리 관리를 직접 할 수 있지만, 자바는 가비지 컬렉터가 자동으로 메모리를 관리해 줍니다.

따라서 자바는 메모리 사용을 최적화하는 것이 힘듭니다.

 

 

추상화 레벨 통일

 

코드도 추상화를 계층처럼 만들어서 사용할 수 있으며, 이를 위한 기본적인 도구가 바로 함수입니다.

함수도 높은 레벨과 낮은 레벨을 구분해서 사용해야 한다는 원칙(Single Level of Abstraction, SLA)이 있습니다.

 

다음과 같이 makeCoffee라는 함수를 갖는 CoffeeMachine 클래스가 있습니다.

class CoffeeMachine {
    fun makeCoffee() {
        // 수백 개의 변수를 선언합니다.
        // 복잡한 로직을 처리합니다.
        // 낮은 수준의 최적화도 여기서 잔뜩합니다.
    }
}

이렇게 코드를 작성하면, "물의 온도를 수정해 달라"는 요청이 받았을 경우 어디서부터 어떻게 수정해야 할지 감조차 잡히지 않을 것입니다.

class CoffeeMachine {
    fun makeCoffee() {
        boilWater()
        brewCoffee()
        pourCoffee()
        pourMilk()
    }
    private fun boilWater() {
        // ...
    }
    private fun brewCoffee() {
        // ...
    }
    private fun pourCoffee() {
        // ...
    }
    private fun pourMilk() {
        // ...
    }
}

이제 이 함수가 어떤 식으로 동작하는지 확실하게 확인할 수 있습니다.

만약 에스프레소 커피를 만드는 기능을 추가한다면, 우유만 안 넣으면 될 것입니다.

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

함수를 재사용하는 일이 훨씬 쉬워진 것입니다.

이처럼 간단한 추상화를 추출해서 여러 이점을 얻을 수 있습니다.

 

  • 재사용과 테스트가 쉬워진다
  • 가독성이 높아진다
  • 이해가 쉬워진다 (필요한 경우에만 낮은 레벨의 코드를 살펴보면 된다)

 

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

 

추상화를 구분하는 이유는 서브시스템의 세부 사항을 숨김으로써 상호 운영성과 플랫폼 독립성을 얻기 위함힙니다.

이는 문제 중심으로 프로그래밍한다는 의미이며, 모듈 시스템을 설계할 때 중요하게 작용합니다.

 

 


정리

 

  • 추상화 계층을 만드는 것은 knowledge를 체계화하고, 서브시스템의 세부 사항을 숨김으로써 상호 운영성과 플랫폼 독립성을 얻게 한다.
  • 함수, 클래스, 모둘 등의 다양한 방식을 통해서 추상화를 분리한다. (이때 각각의 레이어가 너무 커지는 것은 좋지 않다)
반응형