내용 보기

작성자

관리자 (IP : 172.17.0.1)

날짜

2020-07-09 06:34

제목

[Kotlin] 코틀린 기초 07 - Nested 클래스


  • Nested 클래스 inner

클래스 내부에 다른 클래스를 정의할 때 다른 언어에서는 inner클래스라 부르지만코틀린에서는 별도 inner라는 예약어를 사용해서 내부 클래스를
정의할 수 있기 때문에 Nested클래스라고 부른다.

// Nested 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Outer {
    var no: Int = 10;
    fun outerFun() {
        println("Outer -> outerFun()");
    }
 
    class Nested {
        val name: String = "test";
        fun MyFun() {
            println("Nested -> MyFun()");
 
            no = 20;        <- 오류
            outerFun();     <- 오류
        }
    }
}
cs

Outer클래스 내부 클래스인 Nested클래스에서
바깥쪽 클래스인 Outer클래스의 프로퍼티와 메서드 호출은 허용되지 않는다.

내부 클래스에서 바깥쪽 클래스의 맴버에 접근하려면 내부 클래스 선언시 inner라는
예약어를 추가해야 한다.

// inner사용 Nested 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Outer {
    var no: Int = 10;
    fun outerFun() {
        println("Outer -> outerFun()");
    }
 
    inner class Nested {
        val name: String = "test";
 
        fun MyFun() {
            println("Nested -> MyFun()");
            no = 20;
            outerFun();
        }
    }
}
cs
  • 클래스 인스턴스 생성 방법

inner키워드가 붙이 않는 내부 클래스 인스턴스를 생성하고 사용하는 경우 다음과 같이 생성하고 접근할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Outer {
    var no: Int = 10;
    fun outerFun() {
        println("Outer -> outerFun()");
    }
 
    class Nested {
        val name: String = "test";
        fun MyFun() {
            println("Nested -> MyFun()");
            //no = 20;
            //outerFun();
        }
    }
}
 
val obj: Outer.Nested = Outer.Nested();
obj.MyFun();
cs

실행결과

Nested -> MyFun()

inner키워드가 붙은 내부 클래스 인스턴스는 다음과 같이 생성한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Outer {
    var no: Int = 10;
    fun outerFun() {
        println("Outer -> outerFun()");
    }
 
    inner class Nested {
        val name: String = "test";
        fun MyFun() {
            println("Nested -> MyFun()");
 
            //no = 20;
            //outerFun();
        }
    }
}
 
 
val obj: Outer.Nested = Outer().Nested();
obj.MyFun();
cs

위 처럼 inner키워드가 붙은 내부 클래스는 부모 클래스의 생성자를 통해 생성할 수 있다.


출처1

출처2