본문 바로가기
IT

[ 코틀린 ] 중첩 클래스 이너 클래스

by hak0205 2023. 2. 6.
반응형

코틀린 중첩 클래스(nested class), 이너 클래스(inner class)에 대해서 소개하겠습니다.

 

중첩 클래스는 클래스의 인터페이스, 인터페이스의 클래스 및 인터페이스의 인터페이스를 중첩할 수 있습니다.

이너 클래스는 외부 클래스의 개체에 대한 참조를 전달합니다

 

중첩 클래스

중첩 클래스(nested class)는 다른 클래스 내에 클래스를 정의할 수 있습니다. 중첩 클래스는 외부 클래스의 멤버(필드 및 메서드)에 액세스 할 수 있으며 정적이거나 비정적(내부 클래스) 일 수 있습니다.

 

Kotlin의 정적 중첩 클래스는 Java의 정적 내부 클래스와 유사하며 "companion object" 키워드를 사용하여 선언됩니다. 비정적 내부 클래스(내부 클래스라고도 함)는 외부 클래스의 인스턴스에 액세스 할 수 있으며 "inner" 키워드를 사용하여 선언됩니다.

 

다음은 Kotlin 중첩 클래스의 몇 가지 주요 기능입니다.

1. 외부 클래스 멤버에 대한 액세스 : 중첩 클래스는 외부 클래스의 멤버(필드 및 메서드)에 액세스 할 수 있습니다.

2. 내부 클래스 및 컴패니언 개체 : 중첩 클래스는 내부 클래스 또는 컴패니언 개체일 수 있습니다. 내부 클래스는 외부 클래스의 인스턴스에 액세스 할 수 있는 반면 동반 객체는 Java의 정적 중첩 클래스와 동일합니다.

3. 중첩 클래스는 자체 멤버를 가질 수 있습니다. 중첩 클래스는 다음을 가질 수 있습니다. 고유한 필드와 메서드를 사용하며 다른 클래스와 마찬가지로 사용할 수 있습니다.

4. 중첩 클래스는 최상위 클래스와 동일한 방식으로 사용할 수 있습니다. 중첩 클래스는 인스턴스화할 수 있으며 최상위 클래스와 동일한 방식으로 사용됩니다.

5. 중첩 클래스는 비공개일 수 있습니다. 중첩 클래스는 비공개로 선언되어 외부 클래스 내에서만 액세스 할 수 있습니다. 6. 중첩 수준 : 중첩 클래스는 다른 중첩 클래스 내에 중첩되어 여러 수준의 중첩을 생성할 수 있습니다.

7. 중첩은 코드 구성을 향상합니다. 중첩 클래스는 코드를 관련 그룹으로 구성하고 가독성을 높이는 데 도움이 됩니다.

 

다음은 중첩 클래스의 단점입니다.

1. 복잡성 증가: 중첩 클래스는 코드를 더 복잡하고 이해하기 어렵게 만들 수 있습니다.

2. 테스트의 불편함 : 중첩된 클래스는 외부 클래스에 대한 종속성이 있으므로 테스트하기가 더 어려울 수 있습니다.

3. 메모리 사용량 증가 : 중첩 클래스는 외부 클래스 개체의 일부로 저장되므로 메모리 사용량이 증가합니다.

4. 결합 증가 : 중첩 클래스는 외부 클래스와 내부 클래스 간의 결합을 증가시킵니다. 다른 것에 영향을 주지 않고 하나를 변경하거나 리팩터링 하기가 더 어렵습니다.

4. 이름 충돌 : 중첩된 클래스가 동일한 패키지의 다른 클래스와 이름이 같은 경우 이름 충돌이 발생할 수 있습니다. 또는 동일한 외부 클래스 내의 다른 중첩된 클래스입니다.

 

//중첩 클래스 예시
class OuterClass {
    private val outerProperty: String = "I am in outer class"
    
    class NestedClass {
        fun printMessage() {
            println("I am in nested class")
        }
    }
}

 

이 예에서 NestedClass는 OuterClass 내부의 중첩 클래스입니다. NestedClass는 OuterClass의 멤버에 액세스 할 수 있지만 OuterClass는 NestedClass의 멤버에 액세스 할 수 없습니다.

 

다음 구문을 사용하여 OuterClass 외부에 NestedClass 인스턴스를 만들 수 있습니다.

val nestedInstance = OuterClass.NestedClass()
nestedInstance.printMessage() // Output: I am in nested class

 

이너 클래스

이너클래스(inner class)는 다른 class 내부에 정의된 class입니다. 도우미 class를 구현하거나 외부 class의 콘텍스트 내에서만 사용되는 사용자 지정 유형을 정의하는 데 사용됩니다.

 

이너클래스는 전용 멤버를 포함하여 외부 class의 속성 및 기능에 액세스 할 수 있습니다. 또한 외부 class의 속성과 함수를 재정의할 수 있습니다. Kotlin에서 이너클래스를 선언하려면 class 정의 앞에 "inner" 키워드를 사용하면 됩니다.

 

다음은 Kotlin 이너클래스의 주요 기능입니다.

1. 외부 class 멤버에 대한 액세스 : 이너클래스는 비공개 멤버를 포함하여 외부 class의 속성 및 기능에 액세스 할 수 있습니다.

2. 중첩 class 또는 이너클래스: 이너클래스는 중첩 class 또는 이너클래스일 수 있습니다. 중첩 class는 기본적으로 정적이며 이너클래스에는 외부 class의 인스턴스에 대한 암시적 참조가 있습니다.

3. 익명 이너클래스 : 익명 이너클래스는 정의되고 이름 없이 동시에 인스턴스화됩니다.

4. 외부 class 멤버 재정의 : 이너클래스는 외부 class의 속성과 기능을 재정의할 수 있습니다.

5. 가시성 수정자 : 이너클래스는 최상위 class와 마찬가지로 고유한 가시성 수정자를 가질 수 있습니다.

6. 제한 : 이너클래스는 자체 정적 멤버를 가질 수 없으며 외부 class 외부에서 선언할 수 없습니다.

 

다음은 Kotlin 내부 클래스 사용의 단점입니다.

1. 복잡성 증가: 특히 내부 클래스 수가 많은 경우 내부 클래스가 코드를 더 복잡하게 만들 수 있습니다. 이는 클래스 간의 관계를 이해하기 어렵게 만들 수 있습니다.

2. 메모리 사용량 증가: 내부 클래스는 각각 부모 클래스에 대한 참조를 보유하므로 메모리 사용량이 증가합니다. 이는 내부 클래스가 많거나 내부 클래스에 많은 양의 데이터가 있는 경우 특히 문제가 될 수 있습니다.

3. 접근성 : 내부 클래스는 상위 클래스보다 액세스 하기 어려울 수 있습니다. 이로 인해 코드의 다른 부분에서 내부 클래스를 재사용하기 어려울 수 있습니다.

4. Java와의 제한된 상호 운용성: 내부 클래스는 Kotlin 전용 기능이며 Java에서 지원되지 않습니다. 

 

class OuterClass {
    private val outerProperty: String = "I am in outer class"
    
    inner class InnerClass {
        fun printMessage() {
            println("I am in inner class")
            println("Outer property: $outerProperty")
        }
    }
}

이 예에서 InnerClass는 OuterClass 내부의 내부 클래스입니다. InnerClass는 개인 구성원을 포함하여 OuterClass의 구성원에 액세스할 수 있으며 필요한 경우 이들을 재정의할 수도 있습니다.

 

다음 구문을 사용하여 OuterClass 외부에 InnerClass 인스턴스를 만들 수 있습니다.

 
 
val outerInstance = OuterClass()
val innerInstance = outerInstance.InnerClass()
innerInstance.printMessage() // Output: I am in inner class \n Outer property: I am in outer class
 
 
반응형

댓글