• [이펙티브 코틀린] 추상화 설계

    2023. 4. 11.

    by. 하루플스토리

    반응형

    4장 추상화 설계

    • OOP (객체지향 프로그래밍)에서 추상화는 세 가지 주요 개념 중에 하나이다. (추상화, 캡슐화, 상속)
    • 추상화를 간단하게 표현하면 ‘복잡성을 숨기기 위해 사용되는 단순한 형식’ 을 의미한다.
    • 인터페이스는 클래스라는 복잡한 것에서 메서드와 프로퍼티만 추출해서 간단하게 만들었으므로, 클래스의 추상화라고 할 수 있다.
    • 많은 개발자는 프로그래밍에서 하는 모든 일이 추상화라는 것을 종종 잊는다.
      • 숫자를 입력하면 내부에서 0, 1의 복잡한 형식으로 표현된다.
      • 문자열은 UTF-8과 같은 복잡한 형식의 집합으로 표현된다.
      • 이러한 것들이 모두 추상화 되어 있기 때문에 우리가 쉽게 사용할 수 있는 것이다.
    • 강력한 프로그래밍 언어들이 당연히 갖고 있는 기능 중 하나는 공통 패턴에 이름을 붙여서 추상화를 만드는 기능이다.
      • maxOf, lazy 등
    • 프로그래밍에서는 다음과 같은 목적으로 추상화를 사용한다.
      • 복잡성을 숨기기 위해
      • 코드를 체계화하기 위해
      • 만드는 사람에게 변화의 자유를 주기 위해

     

    함수 내부의 추상화 레벨을 통일하라

    • 프로그래밍을 간단하게 할 수 있게 엔지니어는 한 언어를 다른 언어로 변환하는 프로그램인 ‘컴파일러’ 를 만들었다.
    • 최초의 컴파일 언어는 또 더 나은 프로그래밍 언어를 만드는데 사용되었고 그 언어는 또 더 나은 프로그래밍 언어를 만드는데 사용되었다. 그렇게 C, C++ 등의 높은 레벨 언어들이 등장했다.
    • 함수는 간단해야한다. 이는 함수가 작아야하며, 최소한의 책임만을 가져야한다 라는 일반적인 규칙이다. 함수가 작아지면 단위 테스트도 쉬워진다.

     

    변화로부터 코드를 보호하려면 추상화를 사용하라

    • 자주 사용하는 하드코딩 된 값을 사용할 때는 상수(const val)로 표현하는 것이 좋다. 숫자로 기입되어 있는 경우 코드를 이해하기 어려워진다.
    • 상수로 추출하면 이름을 붙일 수 있고, 나중에 해당 값을 쉽게 변경할 수 있다.
    • 만약 토스트를 출력하는 함수를 showToast() 가 아닌 showMessage()와 같이 더 높은 레벨의 함수로 옮겨보았다. 가장 큰 변화는 이름이다. 큰 차이가 없다고 생각할 수 있는데 이는 컴파일러의 관점이지 사람의 관점에서는 이름이 바뀌면 큰 변화가 일어난 것이다.
    • 함수는 추상화를 표현하는 수단이며, 함수 시그니처는 이 함수가 어떤 추상화를 표현하고 있는지 알려준다. 따라서 의미 있는 이름은 굉장히 중요하다.
    • 클래스가 함수보다 더 강력한 이유는 상태를 가질 수 있고 많은 함수를 가질 수 있기 때문이다.
    • 코틀린 표준 라이브러리를 읽어보면 거의 모든 것이 인터페이스로 표현된다는 것을 확인할 수 있다.
    • listOf함수는 List를 리턴한다. 여기서 List는 인터페이스이다. listOf는 팩토리 메서드이다.
    • 라이브러리를 만드는 사람은 내부 클래스의 가시성을 제한하고 인터페이스를 통해 이를 노출하는 코드를 많이 사용한다.
    • 코틀린은 멀티 플랫폼 언어이다. listOf를 사용하면 코틀린/JVM, 코틀린/JS, 코틀린/네이티브에 따라서 구현이 다른 리스트를 리턴한다. 최적화 때문이다.
    • 하지만 어떤 플랫폼을 사용해도 List 인터페이스에 맞춰져있으므로 차이없이 사용할 수 있다.
    • 추상화에는 단점도 존재한다. 추상화는 자유를 주지만 코드를 이해하고 수정하기 어렵게 만든다.
    • 추상화는 많은 것을 숨길 수 있는 테크닉이다. 생각할 것을 어느 정도 숨겨야 개발이 쉬워지는 것도 사실이지만 너무 많은 것을 숨기면 결과를 이해하는 것 자체가 어려워진다.
    • 추상화의 정도는 아래 요소들에 따라서 달라질 수 있다.
      • 팀의 크기
      • 팀의 경험
      • 프로젝트의 크기
      • 특징 세트
      • 도메인 지식
    반응형

    댓글