티스토리 뷰

728x90

 


익명 클래스

• class 키워드를 이용하여 명시적으로 선언한 클래스가 아니다.

• 클래스를 한 번만 사용하면 될 때 유용하다.

     -> 객체를 하나만 만들고, 바로 쓸 경우.

• 익명 클래스의 인스턴스를 익명 객체라고 한다.

• object 키워드를 사용한다.

• 기존의 클래스를 상속하여 사용하여야 한다. 상속을 명시하지 않은 경우 Any를 상속한다.

     - 익명 클래스는 타입이 없기 때문에, 익명 객체의 타입은 익명 클래스가 상속한 부모 클래스이다.

     * 클래스 타입은 클래스명으로 만들어지기 때문에 익명 클래스는 타입이 있을 수 없는 듯하다.

• 익명 클래스에서 새로 추가한 멤버는 외부에서 접근할 수 없다.

     - 상속받은 멤버를 오버라이드한 것만 외부에서 접근이 가능하다.

     - 새로 추가한 멤버는 클래스 내부에서만 사용 가능하다.

     * 익명 객체의 타입은 익명 클래스가 상속한 부모 클래스이므로, 익명 클래스에 새로운 멤버를 추가해도 부모 클래스에는 없는 멤버이기 때문에 접근이 불가능 한 듯하다.

// 1. 상속을 명시하지 않을 경우
// 상속을 명시하지 않은 익명 객체 myAnonymousObject -> Any를 상속하게 된다.
val myAnonymousObject = object {
    val hello: String = "Hello"
    val world: String = "World"
    override fun toString(): String { // Any의 toString을 override
        return "$hello $world"
    }
}
println(myAnonymousObject.toString()) // Hello World 출력
// 2. 상속을 명시할 경우
// 부모 클래스 explicitClass 선언
open class explicitClass(var name: String, var age: Int) {
    val asdf: Int = 1234
    open fun printMe(): Unit {
        println("저는 ${age}살 ${name}입니다.")
    }
}
val explicitObject: explicitClass = explicitClass("홍길동", 20)
explicitObject.printMe() // 저는 20살 홍길동입니다. 출력

// explicitClass를 상속하는 익명 클래스의 익명 객체 myAnonymousObject2
val myAnonymousObject2 = object : explicitClass("고길동", 40) {
    val gender: String = "남자"
    override fun printMe(): Unit { // explicitClass의 printMe를 override
        println("나는 ${age}살 ${name}이고, ${gender}다.")
    }
}
myAnonymousObject2.printMe() // 나는 40살 고길동이고, 남자다. 출력
println(myAnonymousObject2.gender) // 오류 발생 : myAnonymousObject2는 explicitClass 타입이기 때문에 gender 접근 불가.

 

 


728x90
댓글
공지사항