캡슐화

Anna·2024년 6월 12일
0

코틀린

목록 보기
22/28
post-thumbnail

캡술화

클래스를 작성할 때 외부에서 숨겨야 하는 속성이나 기능

가시성 지시자(visibility modifiers)

  • private 외부에서 접근할 수 없다, 클래스 내에서만 접근 가능하다.
  • public 어디서든 접근이 가능하다. (기본값)
  • protected 외부에서 접근할 수 없으나 하위 상속 요소에서는 가능
  • internal 같은 정의의 모듈 내부에서는 접근이 가능.

지시자는 변수명, 메서드, 클래스 앞에서 선언한다.
주 생성자에 가시성 지시자가 사용되면 constructor키워드는 생략할 수 없다.

private

fun main()
{
    PrivateClass().access() //공개 메서드 사용 가능
}

private class PrivateClass
{
    private var i = 1
    private fun privateFunc()
    {
        i += 1
    }

    fun access()  //public 메서드 안에 private 함수 호출
    {
        privateFunc()
    }
}

class OtherClass
{
    //val pc = PrivateClass() //불가
    //pc.i //불가
    //pc.privateFunc() //불가

    fun test()
    {
        val pc = PrivateClass() //동일 파일내에 있는 메서드 안에서는 접근 가능.
        pc.access() //공개 메서드 사용 가능
    }
}

protected

fun main()
{
    val base = Base()
//    base.i   //호출 불가
//    base.protectedFunc()  //호출 불가

    //공개 메서드는 호출 가능, 
    //공개 메서드 안에 있는 protected메서드도 함께 호출, 안 보이는 것 뿐
    base.access() 

    val derived = Derived()
    derived.j = 3 // 상속 받은 클래스 호출 및 수정 가능
    derived.derivedFunc()
}

open class Base
{
    protected var i = 1
    protected fun protectedFunc()
    {
        i += 1
        println(i)
    }
    fun access()
    {
        protectedFunc()
    }
}

class Derived : Base()
{
    var j = 1 + i   //protected여서 가능 private는 불가
    fun derivedFunc() : Int
    {
        protectedFunc()  //protected여서 가능 private는 불가
        return i
    }
}

class Other
{
    fun other()
    {
        val base = Base()
//        base.i = 3    //protected var i = 1 호출 불가능, Base에 상속되어 있는 클래스가 아니기 때문이다.
    }
}

0개의 댓글