Kotlin - Nested, Inner Class

이동수·2024년 9월 25일

Kotlin

목록 보기
26/33
post-thumbnail

nested class (중첩 클래스)

쓰이는 이유

  • 어떤 클래스 행위가 해당 객체에 종속적이면서, method로 표현하기에는 class적 성격을 많이 나타낼 때

사용하는 곳

  • 안드로이드에서 많이 쓰임
    • 리사이클러뷰
    • 리스트 adapter
    • dialog

특징

  • 하나의 클래스가 다른클래스와 강하게 연관되어 있다는 의미
  • 형태만 내부에 있고 실제 내용을 공유할수는 없음(다른 클래스라는 뜻)
  • inner 키워드를 사용하지 않으면 외부클래스의 속성, 함수를 포함된 클래스에서는사용하지 못한다
    • 바깥쪽 멤버에 접근 x
    • 바깥클래스 생성자 상관x
    • 바깥 클래스 객체 필요x
  • 바깥, 안쪽 class 객체가 따로 생성됨

사용법

  • 중첩 클래스 사용시 a.b()로 사용가능
    • 속성 or 함수 사용 : a.b().intro()

    • 바깥클래스.내부클래스()로 표현

      class a{
             class b{
      	       fun intro(){
      		       print()
      		       }
             }
      }
      // 사용시 -  a.b()로 사용

inner class (내부 클래스)

쓰이는 이유

사용하는 곳

특징

  • outer 멤버들을 마음대로 사용 가능
    • 외부클래스의 속성, 함수 사용가능
    • 바깥 멤버에 접근 o
    • 바깥 클래스 생성자 상관 o
  • 혼자서는 객체를 만들수는 없고 외부 클래스의 객체가 있어야 생성과 사용이 가능
  • 바깥, 안쪽 class 객체가 붙어서 생성됨

사용법

  • class안에 inner class{} 생성해서 사용
  • 바깥 속성, 함수를 사용할때 inner class안에 없는 속성이면 그냥 사용가능
    • inner에도 있는 속성, 함수 사용하려면 this@Outer.(속성 or 함수) 써야함
  • 사용시 바깥클래스().내부클래스()로 표현
class a{
	var text = "a"
           inner class b{
	           var text = "b"
           }
}
  • 사용법도 중첩클래스랑 거의 같음. (속성 함수 사용법만 위에처럼 다르다)

전체 예시

class Outer{
    var text = "outer class"
    class Nested{
        fun intro(){
            var text = "nested text"
            println("nested class")
        }
    }

    inner class Inner{
        var text = "inner class"

        fun introin(){
            println(text) //or this.text도 상관없음
        }
        fun introout(){
            println(this@Outer.text)        //outer text쓰려면
                                            //this@바깥 클래스.변수
        }
    }
}

fun main(){
    Outer.Nested().intro() //nested class

    val outer = Outer()
    val a = outer.Inner()

    a.introin()         //inner class
    a.introout()        //outer class
}

Nested, Inner 차이

nested

  • 바깥 클래스 객체 필요x
    • 바깥클래스.내부클래스()로 표현
  • 바깥쪽 멤버에 접근 x
  • 바깥클래스 생성자 상관x

inner

  • 바깥 클래스 객체 필요o
    • 바깥클래스().내부클래스()로 표현
  • 바깥 멤버에 접근 o
  • 바깥 클래스 생성자 상관 o

0개의 댓글