8강. lateinit, lazy()class Person( private val name: String) { val isKim: Boolean get() = this.name.startsWith("최") // 홍길동 -> 홍** val maskingName: String get() = name[0] + (1 until name.length).joinToString("") { "*" }}fun main() { val person = Person("홍길동")}클래스 인스턴스화가 이뤄지며 name에 '홍길동'이 들어감만약, 인스턴스화 시점과 프로퍼티 초기화 시점을 분리하고 싶다면?테스트 코드 작성테스트 코드의 특징은 각 테스트 메소드가 Person을 각각 ..
상속의 문제점 상위 클래스와 하위 클래스의 결합도가 높아져 상위 클래스의 변화가 하위 클래스에 주는 영향을 예측하기 어렵다. 불필요한 상위 클래스의 메서드까지 구현해야 한다. 하위 클래스로 내려갈수록 기능이 더해져 파악하기 어렵다. final클래스의 경우 상속이 불가능하다. 상속의 대안 위임 특정 처리를 다른 객체에게 넘기는 것을 의미한다. 다른 객체는 클래스 내부(포함)에 가지고 있는다. 코틀린 에서는 by키워드로 클래스 위임을 만들 수 있다. interface Attackable { fun attack() } class Knife: Attackable { override fun attack() { println("attack with knife") } } class Gun: Attackable { o..