클래스 내부에 다른 클래스를 정의할 때 다른 언어에서는 inner클래스라 부르지만, 코틀린에서는 별도 inner라는 예약어를 사용해서 내부 클래스를 정의할 수 있기 때문에 Nested클래스라고 부른다.
// Nested 클래스
| 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 클래스
| 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키워드가 붙은 내부 클래스는 부모 클래스의 생성자를 통해 생성할 수 있다. |
|