본문 바로가기
Programming/Kotlin

[Kotlin] 코틀린 뽀개기 - 중첩 클래스 (Nested Class) 사용하기

by 코딩의성지 2019. 12. 7.

안녕~~!! 여러분

 

오늘은 코틀린에서 중첩 클래스를 사용하는 방법에 대해 공부해 볼거다!!

 

중첩 클래스 (Nested Class)

 

중첩 클래스는 클래스 안에 클래스가 있는 것을 의미한다.

밖에 있는 클래스를 OuterClass 라고 하고 안에 있는 클래스를 InnerClass라고하자. 

 

아래 예제를 보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
fun main (args : Array<String>) {
 
    var temp1 = OuterClass();
    var temp2 = temp1.InnerClass();
 
    println("OuterClass.outerVar : ${temp1.outerVar}")
    // OuterClass 객체에서 InnerClass 변수 사용 불가
    //println("OuterClass.innerVar : ${temp1.innerVar}")
 
    println("InnerClass.innerVar : ${temp2.innerVar}")
    // InnerClass 객체에서 OuterClass 변수 사용 불가
    //println("InnerClass.outerVar : ${temp2.outerVar}")
 
}
 
class OuterClass {
    var outerVar = "아우터 변수"
 
    inner class InnerClass {
        var innerVar = "이너 변수"
 
        fun innerMethod() {
            println("innerVar : ${innerVar}")
            // outer 에 선언된 메서드에서 innerClass의 변수 사용 가능
            println("outerVar : ${outerVar}")
        }
    }
 
    fun outerMethod() {
        // outer 에 선언된 메서드에서 innerClass의 변수 사용 불가
        //println("innerVar : ${innerVar}")
        println("outerVar : ${outerVar}")
    }
}
 

사용법은 굉장히 쉽다.

 

그런데 어떤 위치에 있느냐에 따라 메서드나 변수를 사용할 수 있는게 달라진다.

 

main 함수를 보면 볼 수 있듯이 OuterClass 객체에서 InnerClass 의 변수를 사용할 수 없다.

그리고 InnerClass 객체에서 OuterClass 변수 역시 사용할 수 없다.

 

OuterClass 내부를 보자.

내부에 outerMethod() 라는 메서드를 만들어 놨는데 여기서 InnerClass에 있는 변수에 접근하려 하면 에러가 난다. 왜냐면 InnerClass에 있는 변수에 값이 할당되었는지 전~~혀 알 수 없기 때문이다.

 

반면에 InnerClass에 있는 innerMethod 에서는 InnerClass의 변수도 사용 가능하고 ( 당연한 얘기!!) OuterClass의 변수 역시 사용가능하다 !! ㅎㅎ

 

내용 그렇게 어렵지 않쥬~~?? ㅎㅎ 자 이 개념을 이해했다면 더!! 더!! 더!! 많이 쓰이는 익명 중첩 클래스를 공부해보자.

 

익명 중첩 클래스 (Anonymous Nested Class)

 

이건 정말 많이 쓴다. 자바에서도 중첩클래스 개념이 있는데 , 처음에 자바에서 배울 때는 도대체 왜 이걸 쓰는거지 생각많이 했다. 그런데 ㅎㅎ 안드로이드 개발을 시작하고 부터 '아 진짜 많이쓰구나' 하는 생각을 확실히 하게 됐다.

 

일단 익명 중첩 클래스를 사용하면  추상클래스나 인터페이스에 정의된 메서드를 오버라이딩 해서 사용하려고 할때 상속받은 클래스를 따로 안 만들고 사용할 수 있다. 주로 메서드에 들어가는 파라미터로 객체를 넘길 때 자주 사용한다.

 

무슨말인지 모르겠다고? 예제를 보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
fun main(args :Array<String>) {
    method1(object : AbstractClass() {
        override fun abstractMethod() {
            println("abstractMethod 구현")
        }
    })
 
    method2(object  : Interface {
        override fun interfaceMethod() {
            println("interfaceMethod 구현")
        }
    })
}
 
abstract class AbstractClass {
    abstract fun abstractMethod()
}
 
interface Interface {
    fun interfaceMethod()
}
 
fun method1(obj : AbstractClass) {
    obj.abstractMethod()
}
 
fun method2(obj : Interface) {
    obj.interfaceMethod()
}
 

 

예제를 보면 추상클래스인 AbstractClass 와 인터페이스인 Interface를 만들어 놨다. 내부에는 추상메서드가 있는걸 볼수 있다.

 

원래 우리가 사용할 때는 해당 추상클래스를 상속받거나 인터페이스를 구현하는 클래스를 만들어 사용했었다 ㅎㅎ

혹시 기억안나면 ,,!

 

다시 공부하고 오자.

https://devkingdom.tistory.com/56

 

[Kotlin] 코틀린 뽀개기 - 추상클래스 & 인터페이스

하이 ~~ 여러분 우리 어서 코틀린 기본 공부 끝내고 같이 앱을 만들어보자 ..! 일단 여기까지 글을 읽고 있는 자신에게 크게 박수한번 쳐주자!! 의지가 대단한 것 같다 ㅎㅎㅎ 자 오늘은 추상클래스와 인터페이스..

devkingdom.tistory.com

하지만 익명 중첩 클래스를 이용해서 메서드를 사용한다면 !! 위처럼 정말 간단하게 사용할 수 있다.  ㅎㅎㅎ 나중에 안드로이드 개발 관련 포스팅도 진행할건데 ㅎㅎ 나중에 이 클래스의 진면목을 보여주겠다 !! ㅎㅎ 그럼 오늘 포스팅은 여기 까지만 해야겠다 ㅎㅎ 그럼 모두 즐코하자 !!

반응형

댓글