접근제한자

황승현·2023년 12월 7일
0

코틀린 강의 정리

목록 보기
21/36

접근제한자 (access modifier)

특정한 변수나 메서드의 접근을 막을 수 있다.

  • 접근: 객체를 이용해 변수나 메서드를 호출할 수 있는지의 여부

접근제한자 종류

  • public : 명시하지 않으면 기본적으론 public (어디서나 접근 가능)
  • private : 동일한 클래스 내부에서만 접근 가능
  • internal : 같은 모듈 내부에서만 접근 가능 (모듈: 패키지, 클래스 포함)
  • protected : 기본적으로 private, 상속을 받은 경우 상속 받은 클래스 내부에서만 접근 가능

접근제한자가 필요한 이유

  • 접근 권한을 이용해 데이터에 대한 무분별한 접근을 막을 수 있다.
    • 적절한 접근제한자를 사용하지 않으면 에러 발생!
  • 클래스 간에 접근하면 안 되는 상황을 구분하기 때문에 유지보수 용이.

예제

(1) 접근제한자 테스트

  • AccessTestClass.kt 클래스 파일
class AccessTestClass {
    public var a:Int = 1 //어디서나 접근 가능
    var b = 2 // public, 어디서나 접근 가능
    private var c = 3 //동일한 클래스 내부에서만 접근 가능
    internal var d = 4 //같은 모듈 내부에서만 접근 가능
    protected var e = 5 //기본적으론 동일한 클래스 내부에서만 접근가능, 상속받으면 다른 모듈에서 접근 가능

	// 언제 어디서나 접근 가능
    public fun publicTest() {
        println("public 입니다")
    }

	// 언제 어디서나 접근 가능
    fun publicTest2() {
        println("public 입니다")
    }
	
    // 동일한 클래스 내에서만 접근 가능
    private fun privateTest() {
        println("private 입니다")
    }

	// 같은 모듈 내에서만 접근 가능
    internal fun internalTest() {
        println("internal 입니다")
    }

	// 기본적으로 동일한 클래스에서만 접근 가능, 상속 받은 경우 다른 모듈에서 접근 가능
    protected fun protectedTest() {
        println("protected 입니다")
    }
}
  • test.kt 파일
fun main() {
    var access = AccessTestClass()
    println(access.a)
    println(access.b) // 에러 발생 (private, 외부에서 접근 불가)
    println(access.c)
    println(access.d)
    println(access.e) // 에러 발생 (protected, 외부에서 접근 불가)
}

(2) 접근제한자 테스트 2

  • AccessTestClass.kt 클래스 파일
open class AccessTestClass {
    public var a:Int = 1 //어디서나 접근 가능
    var b = 2 // public, 어디서나 접근 가능
    private var c = 3 //동일한 클래스 내부에서만 접근 가능
    internal var d = 4 //같은 모듈 내부에서만 접근 가능
    protected var e = 5 //기본적으론 동일한 클래스 내부에서만 접근가능, 상속받으면 다른 모듈에서 접근 가능

	// 언제 어디서나 접근 가능
    public fun publicTest() {
        println("public 입니다")
    }

	// 언제 어디서나 접근 가능
    fun publicTest2() {
        println("public 입니다")
    }
	
    // 동일한 클래스 내에서만 접근 가능
    private fun privateTest() {
        println("private 입니다")
    }

	// 같은 모듈 내에서만 접근 가능
    internal fun internalTest() {
        println("internal 입니다")
    }

	// 기본적으로 동일한 클래스에서만 접근 가능, 상속 받은 경우 다른 모듈에서 접근 가능
    protected fun protectedTest() {
        println("protected 입니다")
    }
}
  • AccessTestChildClass.kt 파일
// 부모 클래스 AccessTestClass를 상속받음
class AccessTestChildClass: AccessTestClass() {

    fun protectedTest1() {
        println("e의 값은 ${e}") //AccessTestChildClass는 AccessTestClass를 상속받았기 때문에 변수 e에 접근이 가능
    }

}
  • test.kt 파일
fun main() {
    var access = AccessTestChildClass()
    println(access.a)
    println(access.b) // 에러 발생 (private, 외부에서 접근 불가)
    println(access.c)
    println(access.d)
    println(access.e) // 에러 발생 (protected, 외부에서 접근 불가)
    // 상속받은 클래스 '내부'에서만 접근 가능함
    
    access.protectedTest1() // e값을 출력해줌
}

참고자료

https://www.geeksforgeeks.org/kotlin-visibility-modifiers/

0개의 댓글