• [이펙티브 코틀린] 상속보다는 컴포지션을 사용하라

    2023. 4. 27.

    by. 하루플스토리

    반응형

    상속보다는 컴포지션을 사용하라

    • 상속은 굉장히 강력한 기능으로 is-a 관계의 객체 계층 구조를 만들기 위해 설계되었다.
    • 상속은 하나의 클래스만을 대상으로 할 수 있다. 상속을 사용해 행위를 추출하다 보면 많은 함수를 갖는 거대한 Base 클래스를 만들게 되고, 굉장히 깊고 복잡한 계층 구조가 만들어진다.
    • 상속은 클래스의 모든 것을 가져오므로 불필요한 함수를 갖는 클래스가 만들어 질 수 있다.
    • 상속은 코드를 이해하기 어렵게 할 수 있다. 슈퍼클래스를 여러번 확인해야할 수 있다.
    • 그래서 대표적인 대안으로 컴포지션이 있다.
    • 컴포지션을 사용한다는 것은 객체를 프로퍼티로 갖고, 함수를 호출하는 형태로 재사용하는 것을 의미한다.
    • 상속은 슈퍼 클래스의 메서드, 제약, 행위 등 모든 것을 가져온다. 따라서 상속은 객체의 계층 구조를 나타낼 때 굉장히 좋은 도구이다. 하지만 일부분을 재사용 하기 위한 목적으로는 적합하지 않다.
    • 코틀린은 다중 상속을 지원하지 않는다.
    • 어떤 이유로 상속은 허용하지만 메서드는 오버라이드 하지 못하게 하려면 opne 클래스에 open 메서드를 사용한다.
    • open 한 메서드만 오버라이드 하게 할 수 있다.
    • 일반적으로 OOP에서는 상속보다 컴포지션을 사용하는 것이 좋다. 코틀린에서는 더욱 이런 규칙을 지켜주는 것이 좋다.

    데이터 집합 표현에 data 한정자를 사용하라

    • 때로는 데이터를 한번에 전달해야 할 때가 있다. 이럴 때 data 한정자를 사용한다.
    • data 한정자를 붙이면 toString, equals, hashCode, copy, componentN 함수가 자동으로 생성된다.
    • toString : 클래스 이름과 기본 생성자 형태로 모든 프로퍼티와 값을 출력해준다. 로그를 출력할 때나 디버그 할 때 유용하다.
    • euqals : 기본 생성자의 프로퍼티가 같은지 확인해준다.
    • copy: immutable 데이터 클래스를 만들 때 편리하다. 기본 생성자 프로퍼티가 같은 새로운 객체를 복제한다.
    • 튜플대신 데이터 클래스 사용하기
      • Pair, Triple이 코틀린에 남은 마지막 튜플이다.
      • 튜플은 데이터 클래스와 같은 역할을 하지만 가독성이 훨씬 나쁘다. 튜플만 보고는 어떤 타입을 나타내는지 예측할 수 없다. 튜플보다 데이터 클래스를 사용하는 것이 더 좋았기 때문에 점차 없어진 것이다.
    • Pair와 Triple은 몇가지 지역적인 목적으로 인해 남아있을 뿐이다.
      • 값에 간단하게 이름을 붙일 때
      • 표준 라이브러리에서 볼 수 있는 것처럼 미리 알 수 없는 aggregate(집합)를 표현할 때
    • 이런 경우를 제외하면 무조건 데이터 클래스를 사용하는 것이 좋다.

    연산 또는 액션을 전달할 때는 인터페이스 대신 함수 타입을 사용하라

    • 대부분의 프로그래밍 언어에는 함수 타입이라는 개념이 없다.
    • 그래서 연산 또는 액션을 전달할 때 메서드가 하나만 있는 인터페이스를 활용한다. 이런 인터페이스를 SAM 이라고 부른다.
    • 이런 코드를 함수 타입을 사용하는 코드로 변경하면 더 많은 자유를 얻을 수 있다.
    • 람다 표현식을 사용할 때는 아규먼트 분해도 사용할 수 있다. SAM보다 함수타입을 사용하는 것이 훨씬 더 좋은 이유이다.
    • 코틀린이 아닌 다른 언어에서 사용할 클래스를 설계할 때만 SAM을 사용하는 것이 좋다.
    반응형

    댓글