Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[17주차] 12. 상속 다루기 (~12.11) (END) #16

Open
DaehunGwak opened this issue Jan 21, 2022 · 3 comments
Open

[17주차] 12. 상속 다루기 (~12.11) (END) #16

DaehunGwak opened this issue Jan 21, 2022 · 3 comments
Labels

Comments

@DaehunGwak
Copy link
Contributor

고생하셨습니다 🥳

진도

  1. 상속 다루기 (~12.11)

방식

  • 코멘트로 자유롭게 느낀점 (좋았단 점) 을 적어주시면 됩니다.
  • 질문, 다른 좋은 참고자료, 실무 적용 사례 등을 공유해주셔도 좋습니다.
@donghoon-song
Copy link

donghoon-song commented Jan 25, 2022

12.9 계층 합치기

클래스와 부모가 너무 비슷해질 때 하나로 합치기

12.10 서브클래스를 위임으로 바꾸기

위임 : 다른 클래스를 멤버로 포함

상속의 단점은 한 번만 쓸 수 있는 카드. 클래스들의 관계를 아주 긴밀하게 결합.

위임은 두 문제를 해결해 준다. 다양한 클래스에 서로 다른 이유로 위임할 수 있다.

생성자 ⇒ 팩터리 함수로 바꿔서 생성자 호출 부분을 캡슐화 (수정할 게 많기 때문)

위임을 저장할 필드를 슈퍼클래스에 추가한다. → 서브클래스 생성 코드를 수정해 위임 인스턴스를 생성 → 서브 클래스의 메서드를 위임 클래스로 이동

_bePremium(extras) {
	this._premiumDelegate = new PremiumBookingDelegate(this, extras);
}

12.11 슈퍼클래스를 위임으로 바꾸기

제대로 된 상속이라면 서브클래스가 슈퍼클래스의 모든 기능을 사용함을 물론, 서브클래스의 인스턴스를 슈퍼클래스의 인스턴스로도 취급할 수 있어야 한다.

사용되는 모든 곳에서 서브클래스의 인스턴스를 대신 사용해도 이상없이 동작해야 한다.

슈퍼클래스 객체를 참조하는 필드를 서브 클래스에 만든다. → 슈퍼클래스 동작 각각에 대응하는 전달 함수를 서브클래스에 만든다. → 슈퍼클래스의 동작 모두가 전달 함수로 오버라이드되었다면 상속을 끊는다.

위임 많이 쓰나요?? 위임 객체가 있으면 이거 없으면 저거 하는 코드가 많아지는데 더 많아지면 이상적인 구조인가

슈퍼클래스의 모든 기능을 사용하는 게 아니라면 위임을 해서 일부 기능만 사용한다.

@minkukjo
Copy link
Contributor

12.9 계층 합치기

코드 보기
// 12.9 계층 합치기
// 리팩토링을 하다보면 어떤 클래스와 부모가 비슷해져서 클래스 계층 구조를 합치는 경우도 있다고 한다.

12.10 서브클래스를 위임으로 바꾸기

코드 보기
// 12.10 서브클래스를 위임으로 바꾸기
// 상속의 문제를 위임으로 해결
// 상속보다는 컴포지션을 사용하라!
// 저자는 상속으로 일단 개발하고 후에 문제가 생기면 위임으로 갈아탄다고 한다. (태세전환 오졌고)

open class Booking(
        val show: String,
        val date: String,
        val extras: String = "",
) {
    private val isPeakDay: Boolean = true

    var premiumBookingDelegate: PremiumBookingDelegate? = null

    open fun hasTalkback(): Boolean {
        return premiumBookingDelegate?.hasTalkback() ?: this.isPeakDay
    }

    fun bePremium(extras: String) {
        this.premiumBookingDelegate = PremiumBookingDelegate(this, extras)
    }

    fun hasDinner(): Boolean? {
        return premiumBookingDelegate?.hasTalkback() ?: null
    }
}

class PremiumBookingDelegate(
        val host: Booking,
        val extras: String
) {
    fun hasTalkback(): Boolean {
        return true
    }
}

fun createBooking(show: String, date: String): Booking {
    return Booking(show, date)
}

fun createPremiumBooking(show: String, date: String, extras: String): Booking {
    val premiumBooking = Booking(show, date, extras)
    premiumBooking.bePremium(extras)
    return premiumBooking
}

fun main() {
    val aBooking = Booking("123", "2022-01-25")
    val aPremiumBooking = Booking("12434", "2022-01-25", "vip")
}

12.11 슈퍼클래스를 위임으로 바꾸기

코드 보기
// 12.11 슈퍼클래스를 위임으로 바꾸기

open class CatalogItem(
        val id: Long,
        val title: String,
        val tags: String,
)

class Scroll(
        val id: Long,
        val title: String,
        val tags: String,
        val dateLastCleaned: String,
        val catalogItem: CatalogItem = CatalogItem(id, title, tags)
)

@DaehunGwak
Copy link
Contributor Author

12.9 계층 합치기

  • 자식과 부모가 너무 비슷해지면 독립적으로 존재해야할 이유가 없으므로 계층구조를 해제하고 하나로 합친다

12.10 서브클래스를 위임으로 바꾸기

  • 상속대신 위임으로 새로운 클래스를 만들어 책임을 돌림
  • 상속 단점
    • 상속은 한번만 사용할 수 있는 카드 (다중 상속 불가)
    • 상속은 결합도가 짙어져 많은 변경이 발생되는 구조
  • 이때 위임으로 클래스를 분리하여 컴포지션으로 활용
  • 컴포지션과 상속을 적절히 이용할 수 있도록 하는 것이 중요
  • 서브클래스를 상태(state) 패턴이나 전략(strategy) 패턴으로 대체 한다고 하면 편하게 생각할 수도 있음

12.11 슈퍼 클래스를 위임으로 바꾸기

  • 슈퍼 클래스를 위임으로 바꾸기
  • 상속 했던 슈퍼 클래스를 서브 클래스의 인스턴스로 컴포지션하는 전략
  • 상속은 잘못했다간 복잡도를 키우는 방식으로 적용됨
    • 예로 자바의 리스트를 상속한 스택 (리스트의 메서드 전부를 사용할 필요가 없음)
  • 위임 단점: 전달 함수 (forwarding function) 이 많이 만들어질 수 있음

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants