코틀린에서 지원하는 클래스 유형중에 클래스 안에 클래스가 중첩되는 두 가지 유형의 클래스를 알아보자.
중첩클래스(Nested Class)
코틀린에서는 기본적으로 클래스 안에 클래스를 하나 더 넣을 수 있는 중첩클래스는 하나의 클래스가 다른 클래스의 기능과 강하게 연관되어 있다는 의미를 전달하기 위해 만들어진 형식으로 사용할때는 외부클래스 dot 내부 클래스이름으로 사용하게 된다.
Outer.Nested( ) // 중첩클래스 생성자 호출방법
class Outer{
class Nested{...}
}
*중첩 클래스는 형태만 내부에 존재할 뿐 실질적으로는 서로 내용을 직접 공유할 수 없는 별개의 클래스이다.
내부클래스(inner)
이 때 중첩클래스 대신 내부클래스라는 것을 사용할 수도 있다.
중첩 클래스에 "inner"라는 키워드를 붙힌 내부클래스는 혼자서 객체를 만들 수 는 없고 외부 클래스의 객체가 있어야만 생성과 사용이 가능한 클래스이다.
*내부클래스는 외부클래스 객체 안에서 사용되는 클래스 이므로 외부 클래스 객체의 속성이나 함수를 사용할 수 있다.
fun main(){
Outer.Nested().introduce()
val outer = Outer()
val inner = outer.Inner()
inner.introduceInner()
inner.introduceOuter()
outer.text = "change Outer class"
inner.introduceOuter()
}
class Outer{
var text = "Outer Class"
class Nested{ // 중첩클래스
fun introduce(){
println("Nested Class")
}
}
inner class Inner{ // 내부클래스
var text = "Inner Class"
fun introduceInner(){
println(text) // Inner Class가 출력된다!
}
fun introduceOuter(){
println(this@Outer.text) // Outer Class가 출력된다!
//Outer 클래스와 inner 클래스에 같은 이름의 속성이나 함수가 있다면 this@바깥클래스이름 으로 참조하면 된다.
}
}
}
*출력결과
Nested Class
Inner Class
Outer Class
change Outer class
중첩 클래스와 내부 클래스는 클래스간의 연계성을 표현하여 코드의 가독성 및 작성 편의성이 올라갈 수 있으므로 적절한 상황에서 사용하는 것이 좋다.
'코틀린' 카테고리의 다른 글
코틀린(22) - Data 클래스, Enum 클래스 (0) | 2022.03.23 |
---|---|
코틀린(20) - 오버로딩, arguments, infix 함수 (0) | 2022.03.23 |
코틀린(19) - null 처리와 동일성의 확인 (0) | 2022.03.23 |
코틀린(18) - 문자열 관련 함수 (0) | 2022.03.23 |
코틀린(17) - 컬렉션 객체, 리스트 (0) | 2022.03.23 |
댓글