Kotlin 공부(kotlin in action)/4장

2023 01 09 코틀린 공부 - 클래스, 객체, 인터페이스

posite 2023. 1. 9. 22:13

4장 클래스 객체 인터페이스

코틀린의 인터페이스는 디폴트 구현 가능, 프로퍼티도 포함 가능

기본적으로 final, public이다

상속되게 하려면 open을 붙여주어야 한다

final - 오버라이드 불가
open - 오버라이드 가능
abstract - 반드시 오버라이드 해야함
override - 상위 클래스나 인터페이스의 멤버를 오버라이드함을 의미

가시성
public    모든곳에서 볼 수 있음
internal  같은 모듈 안에서만 볼 수 있음
protected 하위 클래스만 볼 수 있음
private   같은 클래스만 볼 수 있음

 

봉인된 클래스 -> 장점 : 상위 클래스 Expr을 상속한 하위 클래스 Num, Sum의 정의를 제한 할 수 있다
=> eval()의 when에서 default 분기가 필요없어진다

sealed class Expr{
    class Num(val value:Int): Expr()
    class Sum(val leftExpr:Expr, val rightExpr: Expr): Expr()
}
fun eval(e:Expr): Int{
    return when(e){
        is Expr.Num->{
            e.value
        }
        is Expr.Sum->{
            eval(e.rightExpr)+eval(e.leftExpr)
        }
    }
}

 

프로퍼티의 접근자 가시성을 변경 가능

open class LengthCounter{
    //counter의 세터를 private으로 변경 -> 이 클래스에서만 접근 가능
    var counter : Int =0
        private set
    fun addWord(word: String){
        counter += word.length
        println(counter)
    }
}

 

클래스 위임하기
상속을 허용하지 않는 클래스에 새로운 동작등을 추가 할 때 사용
데코레이터가 새로운 기능을 제공하고 기존의 기능은 기존 클래스의 메서드에게 요청을 전달한다
by 키워드로 위임한 후 변경할 메서드만 변경하면 된다 -> 수많은 코드 준비를 안해도 된다

class CountingSet<T>(
    val innerSet : MutableCollection<T> = HashSet<T>()
):MutableCollection<T> by innerSet{
    var objectAdded = 0
    override fun add(element: T): Boolean {
        objectAdded++
        return innerSet.add(element)
    }

    override fun addAll(elements: Collection<T>): Boolean {
        objectAdded += elements.size
        return innerSet.addAll(elements)
    }
}

 

코틀린에서는 클래스의 유일한 객체를 저장하는 싱글턴 패턴을 객체 선언 기능을 통해 지원

object 키워드를 통해 객체 선언
object ~~~{

}


동반 객체 : 클래스의 인스턴스와 상관없이 클래스 내부 정보에 접근해야 하는 함수가 필요할 때 중첩된 객체 선언의 멤버 함수로 정의하는데 팩토리 메서드가 대표적이며 companion이라는 표시를 붙이면 동반 객체를 만들 수 있어 자바의 정적 메서드 호출이나 정적 필드 사용 구문과 같아짐(static)

class A{
//  동반객체 생성
    companion object{
        fun bar(){
            println("companion object called")
        }
    }
}

또한 동반 객체에 인터페이스를 구현 가능하며 확장도 가능하다 확장 함수와 프로퍼티를 정의 가능하다