Android/Android 더하기

내부(innter)클래스 중첩(nested)클래스 그리고 메모리 누수

728x90
반응형

java에서는 A클래스 안에 B클래스를 정의하면 안에 정의된 B클래스는 자동으로 내부클래스가 됩니다. 

 

java에서 객체가 삭제되는 시점은 객체가 더 이상 사용되지 않을때입니다.

내부클래스에서는 외부클래스를 항상 참조하고있습니다. 따라서 A클래스가 삭제되더라도 내부클래스인 B 클래스는 삭제되지않고 살아있게되어 (원하는 시점에 적절하게 객체가 삭제되지 못함) 메모리 누수가 발생하기됩니다. 

(그래서 실제 프로젝트에서 내부클래스로 개발되었던 코드들을 모두 수정했습니다.)

 

더보기

 Inner Class Reference 관련 해결방법

1. 내부 클래스의 정적 변수를 만들지 말자

2. 클래스를 정적으로 설정해야 한다. 익명 클래스의 인스턴스는 "static"인 경우 외부 클래스에 대한 암시 적 참조를 보유하지 않습니다.

3. view/activity대해 weakReference를 사용해라.  GC(Garbage collector)는 weak references  만 개체를 가리키는 경우 object를 수집 할 수 있습니다.

 

참고 : medium.com/android-news/9-ways-to-avoid-memory-leaks-in-android-b6d81648e35e

 

 

 

반면 kotlin에서는 클래스 안에 클래스를 정의하면 안에 정의된 클래스는 자동으로 중첩클래스가 됩니다. 중첩클래스의 경우 외부클래스를 참조하지 않기때문에 실제 프로젝트에서 특별한 경우가 아니면 내부 클래스 사용을 지양하고 중첩클래스를 사용하도록 권장합니다. 

 

 

 

내부클래스 예시 : inner를 써줌

class myClassA {
    private val value: Int = 1
	
    // myClassB : inner내부(inner) 클래스
    inner class myClassB {
        fun myFunction() = value
    }
}

val demo = myClassA().myClassB().myFunction() // == 1

 

중첩 클래스 예시 : 디폴트

class myClassA {
    private val value: Int = 1
    
    // myClassB: 중첩(nested) 클래스
    class myClassB {
        fun myfunction() = 2
    }
}

val demo = myClassA.myClassB().myfunction() // == 2

 

 


내부클래스 종류

 

1. 정적 클래스(static class)

외부 클래스 영역에 선언된 클래스 중에서 static 키워드를 가지는 클래스를 정적 클래스(static class)라고 합니다.
이러한 정적 클래스는 주로 외부 클래스(outer class)의 클래스 메소드에 사용될 목적으로 선언됩니다.


2. 인스턴스 클래스(instance class)
외부 클래스 영역에 선언된 클래스 중에서 static 키워드를 가지지 않는 클래스를 인스턴스 클래스(instance class)라고 합니다.
이러한 인스턴스 클래스는 주로 외부 클래스(outer class)의 인스턴스 변수나 인스턴스 메소드에 사용될 목적으로 선언됩니다.


3. 지역 클래스(local class)
지역 클래스(local class)란 외부 클래스의 메소드나 초기화 블록에 선언된 클래스를 의미합니다.
이러한 지역 클래스는 선언된 블록 내에서만 사용할 수 있습니다.

 


4. 익명 클래스(anonymous class)
익명 클래스(anonymous class)란 다른 내부 클래스와는 달리 이름을 가지지 않는 클래스를 의미합니다.
익명 클래스는 클래스의 선언과 동시에 객체를 생성하므로, 단 하나의 객체만을 생성하는 일회용 클래스입니다.
따라서 생성자를 선언할 수도 없으며, 오로지 단 하나의 클래스나 단 하나의 인터페이스를 상속받거나 구현할 수 있을 뿐입니다.
이러한 익명 클래스는 매우 제한적인 용도에 사용되며, 구현해야 하는 메소드가 매우 적은 클래스를 구현할 때 사용됩니다.

 

 

 

 

 

 

 

위 클래스들과 관련하여 메모리 릭 발생 관련 참고

medium.com/android-news/9-ways-to-avoid-memory-leaks-in-android-b6d81648e35e

 

 

 

728x90
반응형