본문 바로가기
코틀린 문법

16. 중첩클래스와 내부클래스

by 농농씨 2023. 5. 14.

참조:유튜브 디모의 코틀린

코드테스트사이트:play.kotlinlang.org

맥북 바로 클립보드에 스크린샷하기 단축키:control+command+shift+4

맥북 탭끼리 이동 단축키:command+shift+{/}

 

//클래스 안에 클래스가 중첩되는 두가지 유형의 클래스 알아보자
//코틀린에서는 기본적으로 클래스 안에 클래스를 하나 더 넣을 수 있는
//중첩클래스(Nested Class)를 지원함
//ex. class Outer{
//      class Nested{
//        
//      }
//   }
//중첩클래스는 하나의 클래스가 다른 클래스의 기능과 '강하게 연관'되어 있다는
//의미를 전달하기 위해 만들어진 형식으로,
//사용할 때는 외부클래스이름.중첩클래스이름 형태로 사용하게 된다
//ex. Outer.Nested()
//이때, 중첩 클래스 대신 내부 클래스라는 것을 사용할수도 있다.
//중첩 클래스에 inner라는 키워드를 붙인 내부 클래스는
//ex. class Outer{
//      inner class Inner{
//    
//      }
//    }
// 혼자서 객체를 만들 수는 없고 외부 클래스의 객체가 있어야만 생성과 사용 가능
//
//중첩 클래스는 형태만 내부에 존재할 뿐, 실질적으로는 서로 내용을 공유할
//수 없는 별개의 클래스
//내부 클래스는 외부 클래스 객체 안에서 생성되는 클래스이므로
// 외부 클래스 객체의 속성이나 함수를 사용할 수 있다.

 



fun main(){
    
    Outer.Nested().introduce()
    //Outer.Nested클래스 객체만들고 함수 호출
    //흠... 객체 이름이...?Outer인건가?
    //객체만드는법 복습필요
    //-->Nested Class 라고 출력됨
    
    val outer=Outer()
    //Outer 객체 만들어 outer라는 변수에 담은 후 
    val inner=outer.Inner()
    //이 변수에서 Inner의 객체 생성하여 inner라는 변수에 담기
    
    //이 객체에서 함수 호출해보기
    inner.introduceInner()//-->Inner Class 라고 출력됨
    inner.introduceOuter()//-->Outer Class 라고 출력됨
    //따라서 inner클래스의 객체도 outer클래스의 속성을 사용할 수
    // 있음을 확인.
    
    outer.text="Changed Outer Class"
    inner.introduceOuter()
    //outer 객체의 text 속성을 "Changed Outer Class"로 변경하고
    //다시 introduceOuter() 함수 호출해보기
    //-->Changed Outer Class 라고 출력됨
    //outer클래스의 속성이 변경되면 inner클래스가 그 속성을 쓸 때도
    // 변경된 걸로 반영이 되는 것을 확인.
    
    
}

class Outer {
    var text="Outer Class"
    //클래스 만들고 문자열을 text라는 속성에 넣음
    
    class Nested {//내부에 클래스 또 만들고
        fun introduce(){//함수만들고
            println("Nested Class")//문자열 출력
        }
    }
    
    inner class Inner{//inner클래스 만들고
        var text = "Inner Class"//속성 만듦
        
        fun introduceInner(){//함수만들고
            println(text)//이너클래스속성출력
        }
        
        fun introduceOuter(){//함수 또 만들고
            println(this@Outer.text)//아우터클래스 속성 출력
            //이때, 이너클래스와 아우터클래스에
            //같은 이름의 속성이나 함수가 있다면 
            //this@(at)OuterClass이름 으로 참조한다.
            
        }
    }
}

//중첩 클래스와 내부 클래스는 클래스간의 연계성을 표현하여 
//코드의 가독성 및 작성 편의성이 올라갈 수 있으므로
//적절한 상황에서 사용하는것이 좋다~