Archives
Recent Posts
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[16일차 Kotlin] 중첩 클래스 본문

Computer/Kotlin

[16일차 Kotlin] 중첩 클래스

Wise-99 2023. 5. 19. 02:37

 

 

출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT

 

 

 

📖 중첩 클래스란?

  • 클래스안에 만드는 클래스를 중첩 클래스라고 부른다.
  • 내부 클래스는 외부 클래스로부터 생성된 객체를 통해서만 객체 생성이 가능하다.
  • 내부의 클래스를 가지고 만든 객체는 외부 클래스를 통해 만든 객체가 무조건 있다는 것을 보장받을 수 있기 때문에 외부 클래스에 정의한 멤버의 접근이 자유롭다.
  • 외부 클래스는 내부 클래스의 멤버를 자유롭게 사용할 수 없지만 내부 클래스는 외부 클래스의 멤버를 자유롭게 사용할 수 있다.

익명 중첩 클래스

  • 이름이 없는 클래스를 익명 중첩 클래스라고 부른다.
  • 인터페이스나 추상클래스를 사용할 때 이용한다.
  • 인터페이스를 구현한 클래스나 추상 클래스를 상속받은 클래스를 만듬과 동시에 메서드를 Overriding하고 객체를 생성하는 것까지 수행된다.
  • 이름이 없으므로 다시는 객체를 생성할 수 없다.
  • 만약 클래스를 통해 생성하는 객체가 두 개 이상이면 클래스를 정의하고 객체를 생성해서 사용한다.

 

 

 

📖 일반 중첩 클래스 예제 코드

fun main(){
    fun main() {

    val obj1 = Outer1()
    val obj2 = obj1.Inner1()

    obj2.innerMethod() // outerV1 : 100
}


class Outer1{
    var outerV1 = 100

    fun outerMethod(){
        println("Outer1의 outerMethod 입니다")
    }

    inner class Inner1{
        fun innerMethod(){
            println("outerV1 : $outerV1")
            outerMethod()
        }
    }
}

✔️코드 리뷰

  • obj1은 외부 클래스(Outer1)의 객체이다.
  • obj1을 통해 내부 클래스(Inner1)의 객체인 obj2를 생성한다.
  • obj2를 통해 innerMethod()를 호출한다.

 

 

 

📖 익명 중첩 클래스 예제 코드

fun main(){
    val t1 = TestClass1()
    t1.interMethod1()
    t1.interMethod2()

    val t2 = object : Inter1{
        override fun interMethod1() {
            println("익명 중첩 클래스의 interMethod1")
        }

        override fun interMethod2() {
            println("익명 중첩 클래스의 interMethod2")
        }
    }
    t2.interMethod1() // 익명 중첩 클래스의 interMethod1
    t2.interMethod2() // 익명 중첩 클래스의 interMethod2
}

interface Inter1{
    fun interMethod1()
    fun interMethod2()
}

class TestClass1 : Inter1 {
    override fun interMethod1() {
        println("TestClass1의 interMethod1")
    }

    override fun interMethod2() {
        println("TestClass1의 interMethod2")
    }
}

✔️ 코드 리뷰

  • 익명 중첩 클래스를 사용하지 않는다면 인터페이스를 구현하거나 상속을 받은 다음 메서드를 오버라이딩한 클래스를 만들고 위로 올라가서 객체 생성해 사용해야 한다.
    • 해당 코드의 t1이 그 예시이다.
  • 만약 인터페이스를 구현하거나 클래스를 상속받은 클래스를 통해 객체를 하나만 생성한다면 익명 중첩클래스를 사용해도 된다.
    • 해당 코드의 t2가 그 예시이다.