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") }
이 방식은 코드를 더 간결하고 읽기 쉽게 만들어 줍니다.
중첩 클래스와 내부 클래스의 차이점
- 메모리 사용: 내부 클래스는 외부 클래스의 인스턴스에 대한 참조를 유지하므로, 중첩 클래스보다 더 많은 메모리를 사용합니다.
- 접근성: 내부 클래스는 외부 클래스의 private 멤버에 접근할 수 있지만, 중첩 클래스는 그렇지 않습니다.
- 인스턴스 생성: 중첩 클래스의 인스턴스는 외부 클래스의 인스턴스 없이 생성할 수 있지만, 내부 클래스의 인스턴스는 외부 클래스의 인스턴스가 필요합니다.
사용 시 고려사항
- 캡슐화: 중첩 클래스와 내부 클래스를 사용하면 관련 코드를 함께 그룹화하여 캡슐화를 강화할 수 있습니다.
- 가독성: 적절히 사용하면 코드의 구조를 더 명확하게 만들 수 있지만, 과도한 중첩은 오히려 가독성을 해칠 수 있습니다.
- 유지보수성: 내부 클래스는 외부 클래스와 강하게 결합되므로, 유지보수 시 주의가 필요합니다.
- 성능: 익명 내부 클래스를 과도하게 사용하면 클래스 파일이 많이 생성되어 애플리케이션의 크기가 커질 수 있습니다.
Kotlin의 중첩 클래스와 내부 클래스는 코드의 구조화와 캡슐화를 위한 강력한 도구입니다. 중첩 클래스는 외부 클래스와 논리적으로 관련된 클래스를 그룹화하는 데 유용하며, 내부 클래스는 외부 클래스의 멤버에 접근해야 하는 경우에 적합합니다. 익명 내부 클래스는 일회성 구현에 편리하게 사용할 수 있습니다.
이러한 기능들을 적절히 활용하면 코드의 구조를 개선하고, 관련 기능을 논리적으로 그룹화하며, 불필요한 코드 중복을 줄일 수 있습니다. 하지만 과도한 사용은 코드의 복잡성을 증가시킬 수 있으므로, 상황에 맞게 적절히 사용하는 것이 중요합니다.
Kotlin, 중첩클래스, 내부클래스, 익명내부클래스, 객체식, 캡슐화, 코드구조화, 람다표현식, 안드로이드개발, 자바상호운용성, 객체지향프로그래밍, 코틀린문법, 클래스설계, 메모리관리, 성능최적화
'개발&프로그래밍' 카테고리의 다른 글
[kotlin] 인라인 값 클래스(Inline Value Classes) (0) | 2024.08.15 |
---|---|
[Kotlin] 열거형 클래스(Enum class) (0) | 2024.08.15 |
[kotlin] 제네릭: in, out, where (0) | 2024.08.14 |
[kotlin] Sealed classes & interfaces (0) | 2024.08.14 |
[kotlin] 데이터 클래스(Data classes) (0) | 2024.08.14 |
댓글