본문 바로가기
개발&프로그래밍

[Kotlin] 중첩 클래스와 내부 클래스

by 재아군 2024. 8. 15.

Kotlin의 중첩 클래스와 내부 클래스

Kotlin에서 클래스 내부에 다른 클래스를 정의하는 방법은 코드의 구조화와 캡슐화를 위한 강력한 도구입니다. 이 문서에서는 중첩 클래스와 내부 클래스의 개념과 사용법을 상세히 살펴보겠습니다.

 

 

중첩 클래스 (Nested Classes)

Kotlin에서는 클래스 안에 다른 클래스를 중첩하여 정의할 수 있습니다:

class Outer {
    private val bar: Int = 1
    class Nested {
        fun foo() = 2
    }
}

val demo = Outer.Nested().foo() // == 2

 

 

이 예제에서 Nested 클래스는 Outer 클래스 내부에 정의되어 있지만, Outer 클래스의 인스턴스에 대한 참조를 가지지 않습니다. 따라서 Nested 클래스는 Outer 클래스의 private 멤버인 bar에 접근할 수 없습니다.

중첩은 클래스뿐만 아니라 인터페이스에도 적용할 수 있습니다:

interface OuterInterface {
    class InnerClass
    interface InnerInterface
}

class OuterClass {
    class InnerClass
    interface InnerInterface
}

이러한 구조는 관련된 타입들을 논리적으로 그룹화하는 데 유용합니다.

 

 

내부 클래스 (Inner Classes)

inner 키워드를 사용하여 표시된 중첩 클래스는 외부 클래스의 멤버에 접근할 수 있습니다. 이러한 클래스를 내부 클래스라고 합니다:

class Outer {
    private val bar: Int = 1
    inner class Inner {
        fun foo() = bar
    }
}

val demo = Outer().Inner().foo() // == 1

내부 클래스는 외부 클래스의 인스턴스에 대한 참조를 가지고 있어, 외부 클래스의 private 멤버에도 접근할 수 있습니다. 이는 두 클래스 간의 긴밀한 결합이 필요한 경우에 유용합니다.

 

 

익명 내부 클래스 (Anonymous Inner Classes)

Kotlin에서는 객체 식(object expression)을 사용하여 익명 내부 클래스의 인스턴스를 생성할 수 있습니다:

window.addMouseListener(object : MouseAdapter() {
    override fun mouseClicked(e: MouseEvent) { ... }
    override fun mouseEntered(e: MouseEvent) { ... }
})

 

 

이 방식은 특정 인터페이스나 클래스를 구현 또는 상속받는 일회성 객체를 생성할 때 유용합니다.

JVM에서 함수형 Java 인터페이스(단일 추상 메서드를 가진 인터페이스)의 인스턴스를 생성할 때는 람다 표현식을 사용할 수 있습니다:

val listener = ActionListener { println("clicked") }

이 방식은 코드를 더 간결하고 읽기 쉽게 만들어 줍니다.

 

 

중첩 클래스와 내부 클래스의 차이점

  1. 메모리 사용: 내부 클래스는 외부 클래스의 인스턴스에 대한 참조를 유지하므로, 중첩 클래스보다 더 많은 메모리를 사용합니다.
  2. 접근성: 내부 클래스는 외부 클래스의 private 멤버에 접근할 수 있지만, 중첩 클래스는 그렇지 않습니다.
  3. 인스턴스 생성: 중첩 클래스의 인스턴스는 외부 클래스의 인스턴스 없이 생성할 수 있지만, 내부 클래스의 인스턴스는 외부 클래스의 인스턴스가 필요합니다.

 

 

사용 시 고려사항

  1. 캡슐화: 중첩 클래스와 내부 클래스를 사용하면 관련 코드를 함께 그룹화하여 캡슐화를 강화할 수 있습니다.
  2. 가독성: 적절히 사용하면 코드의 구조를 더 명확하게 만들 수 있지만, 과도한 중첩은 오히려 가독성을 해칠 수 있습니다.
  3. 유지보수성: 내부 클래스는 외부 클래스와 강하게 결합되므로, 유지보수 시 주의가 필요합니다.
  4. 성능: 익명 내부 클래스를 과도하게 사용하면 클래스 파일이 많이 생성되어 애플리케이션의 크기가 커질 수 있습니다.

 

Kotlin의 중첩 클래스와 내부 클래스는 코드의 구조화와 캡슐화를 위한 강력한 도구입니다. 중첩 클래스는 외부 클래스와 논리적으로 관련된 클래스를 그룹화하는 데 유용하며, 내부 클래스는 외부 클래스의 멤버에 접근해야 하는 경우에 적합합니다. 익명 내부 클래스는 일회성 구현에 편리하게 사용할 수 있습니다.

이러한 기능들을 적절히 활용하면 코드의 구조를 개선하고, 관련 기능을 논리적으로 그룹화하며, 불필요한 코드 중복을 줄일 수 있습니다. 하지만 과도한 사용은 코드의 복잡성을 증가시킬 수 있으므로, 상황에 맞게 적절히 사용하는 것이 중요합니다.

 

 

 

 


Kotlin, 중첩클래스, 내부클래스, 익명내부클래스, 객체식, 캡슐화, 코드구조화, 람다표현식, 안드로이드개발, 자바상호운용성, 객체지향프로그래밍, 코틀린문법, 클래스설계, 메모리관리, 성능최적화

댓글