코드 공유를 위한 Mixin

Picbel·2023년 2월 20일
1

Architecture

목록 보기
3/3
post-thumbnail

흔히들 상속을 하는 이유 중 코드 재사용성을 꼽곤 합니다.
하지만 상속을 통해서 기능을 재사용하는 경우엔 해결하지 못하는 문제가 생기게 됩니다.

오늘은 코드의 공유를 위해서 상속말고 Mixin이란 기법을 왜 사용해야하는지를 보겠습니다.

코드 공유를 위한 상속의 문제점

클래스들 사이에 복잡한 계층 구조가 생길 수 있으며, 이로 인해 코드를 유지보수하기 어려워집니다.
간단한 예제 코드를 한번 보시죠

class Bird { // 새는 날 수 있다.
	fun fly() {
        println("I can fly!")
    }
}

class Penguin : Bird()

class Goose : Bird()

fun main() {
    val goose = Goose()
    goose.fly() // "I can fly!" 출력
    // 추후 Bird를 확장하여 펭귄이 생긴다 하면?
    val penguin = Penguin()
    penguin.fly() // ??? 펭귄은 날 수 없다.
}

펭귄은 날 수 없지만 새다. 하지만 Bird를 그대로 사용 할 수 없습니다.

Mixin

위 문제를 해결하기 위해 나온것이 Mixin입니다.
먼저 간단하게 코드부터 보겠습니다.

interface Flyable {
    fun fly() {
        println("I can fly!")
    }
}

class Bird

class Penguin : Bird()

class Goose : Bird(), Flyable

fun main() {
     val goose = Goose()
    goose.fly() // "I can fly!" 출력
    
    val penguin = Penguin()
    penguin.fly() // error penguin엔 fly라는 메서드가 존재하지 않는다.
}

코틀린(Kotlin)에서 Mixin을 구현할려면 인터페이스를 사용해야 합니다. 코틀린에서는 인터페이스에 Default 메소드 구현체를 추가할 수 있습니다.

Mixin과 상속의 차이점

상속과 Mixin의 차이점은 계층 구조를 만들지 않는다는 것입니다.
상속을 사용하면 클래스 간의 계층 구조가 생기기 때문에, 새로운 클래스를 만들 때마다 상속 계층을 고려해야 합니다.
즉 부모 클래스의 변경이 하위 클래스에 영향을 미치기 때문에 유지보수하기 어렵습니다.
하지만 Mixin을 사용하면, 클래스 간의 계층 구조가 생기지 않기 때문에 새로운 클래스를 만들 때마다 고려할 필요가 없습니다.
또한, interface는 다중 상속을 지원하기 때문에 여러 개의 Mixin을 조합해 새로운 클래스를 만들 수 있습니다

결론

Mixin은 OOP 관점 에서 매우 유용한 기법 중 하나로 상속에서 발생할 수 있는 문제점을 해결합니다.

  • 다중 상속을 지원함으로써 코드 공유를 보다 효과적으로 할 수 있게 해줍니다.
  • 자식 클래스와 부모 클래스 사이에 의존성을 강제하지 않으므로 유연한 코드 작성이 가능합니다.

하지만 Mixin을 사용할 때는 주의해야 할 점이 있습니다.
Mixin은 인터페이스를 사용하기 때문에(Kotlin과 Java 기준), 인터페이스를 구현한 모든 클래스에서 공통적으로 사용하는 메소드만을 Mixin으로 사용해야 합니다.
Mixin을 사용할 때는 코드의 가독성을 유지해야 합니다. 너무 많은 Mixin을 사용하면 코드가 복잡해지고 유지보수하기 어려워집니다.

profile
Software Developer

0개의 댓글