개발일지

Kotlin in A..Z (22) - 내부 클래스 본문

Kotlin (코틀린)

Kotlin in A..Z (22) - 내부 클래스

강태종 2020. 7. 17. 17:06

- 내부 클래스

내부 클래스를 사용하는 이유는 독립적인 클래스로 정의하기 모호한 경우나 다른 클래스에서 잘 사용하지 않고 내부에서만 사용하는 클래스를 외부에서 접근할 필요가 없을 때 사용한다. 너무 무분별하게 사용하면 코드의 의존성이 커지기 때문에 조심해야 한다.


- 중첩 클래스 (Nested Class)

기본적으로 자바의 정적(static)클래스 처럼 다뤄진다.

  • 바깥 클래스를 접근할 수 없다.
  • 바깥 클래스를 인스턴스 할 필요 없이 바로 인스턴스화 할 수 있다.
  • 바깥 클래스에서 중첩 클래스를 바로 접근할 수 없다. -> 인스턴스화 해야 함

 

코드

class Parent {
    val value: Int = 0
    
    fun func() {
        println("Parent")
    }
    
    fun nestedAction() {
        // Nested의 메서드를 바로 접근할 수 없음
        Nested.action()
        
        // Nested를 인스턴스화를 하고 접근
        Nested().action()
    }
    
    class Nested {
        fun action() {
            // 바깥 클래스에 바로 접근할 수 없음.
            func()

            // 바깥 클래스에 바로 접근할 수 없음.
            println(value)
        }
    }
}

fun main() {
    // Parent를 인스턴스화 할 필요없이 바로 Nested를 인스턴스화 할 수 있음.
    val nested = Parent.Nested()
    nested.action()
}

- 이너 클래스 (Inner Class)

inner 키워드를 사용한다

바깥 클래스의 멤버들에 접근할 수 있다. (private도 접근할 수 있음)

 

코드

class Parent {
    var value: Int = 0

    inner class InnerClass {
        fun action() {
            println(value)
        }

        fun setValue(value: Int) {
            this@Parent.value = value
        }
    }
}

fun main() {
    val parent = Parent()
    val inner1 = parent.InnerClass()

    inner1.action()

    parent.value = 10
    inner1.action()

    inner1.setValue(20)
    println(parent.value)
    inner1.action()
}

 

결과

0
10
20
20

- 지역 클래스

특정 블록에서만 유효하는 클래스이다.

 

코드

fun main() {
    class LocalClass(val x:Int, y:Int) {
        
    }
    
    val pos1 = LocalClass(1, 1)
    val pos2 = LocalClass(2, 2)
}
Comments