kotlin 문법: "접근제한자"

SHY(code poet)·2024년 2월 26일

✨Kotlin에 관하여✨ 

목록 보기
25/36

접근 제한자: 클래스의 맴버에 지정된 접근 제한자에 따라 외부에서 사용 여부가 결정
: Kotlin에서 정의되는 클래스, 인터페이스, 메서드, 프로퍼티는 모두 접근 제한자(Visibility Modifiers)를 가질 수 있다.
함수형 언어라는 특성 때문에 코틀린은 기존 객체지향에서 접근 제한자의 기준으로 삼았던 패키지(디렉토리) 대신에 모듈 개념이 도입되었다.
internal 접근 제한자로 모듈 간에 접근을 제한할 수 있다.
Q. 그럼 Kotlin은 패키지,디렉토리 단위로는 접근 제한을 못하고, 모듈 단위로만 가능한 건가?
Q. 기본적으로 아무런 접근 제한자도 지정하지 않으면 어떻게 동작하나?

※ 모듈
Kotlin에서 모듈이란 한 번에 같이 컴파일되는 모든 파일을 말한다.
안드로이드를 예로 든다면 하나의 앱이 하나의 모듈이 될 수 있다.
또한 라이브러리도 하나의 모듈이다.

a. 접근 제한자의 종류

ⅰ. private: 다른 파일에서 접근할 수 없다.
ⅱ. protected: private와 같으나 상속 관계에서 자식 클래스가 접근할 수 있다.
ⅲ. internal: 같은 모듈에 있는 파일만 접근할 수 있다.
ⅳ. public: 제한 없이 모든 파일에서 접근할 수 있다.

b. 접근 제한자의 적용

  • 접근 제한자를 붙이면 해당 클래스, 멤버 프로퍼티 또는 메서드에 대한 사용이 제한된다.
    다음 코드를 통해서 접근 제한자가 어떻게 작용하는지 알아보자.
    우선, 다양한 접근 제한자를 갖는 부모 클래스를 하나 생성한다.

open class Parent { // 디폴트 생성자
private val privateVal = 1
protected open val protectedVal = 2
internal val internalVal = 3
val defaultVal = 4
}

자식 클래스에서 부모 클래스를 상속받고 테스트한다.

class Child: Parent() {
fun callVariables() {
// privateVal은 호출이 안 됩니다. (1)
Log.d("Modifier", "protected 변수의 값은 ${protectedVal}"). // (2)
Log.d("Modifier", "internal 변수의 값은 ${internalVal}"). // (3)
Log.d("Modifier", "기본 제한자 변수 defaultVal의 값은 ${defaultVal}"). // (4)
}
}

(1) privateVal은 private 멤버이기 때문에 접근할 수 없습니다.
(2) protected 멤버 protectedVal은 상속 관계이므로 접근할 수 있습니다.
(3) internal 멤버 internalVal은 동일한 모듈이므로 접근할 수 있습니다.
(4) 접근 제한자가 없는 멤버 defaultVal에는 public이 적용되어 접근할 수 있습니다.

  • 이번에는 상속 관계가 아닌 외부 클래스에서 Parent 클래스를 생성하고 사용해 보자. 상속 관계가 아니기 때문에 public과 internal에만 접근할 수 있다.

class Stranger {
fun callVariables() {
val parent = Parent() // 생성자 호출
Log.d("Modifier", "internal 변수의 값은 ${parent.internalVal}입니다.") // 클래스 사용
Log.d("Modifier", "public 변수의 값은 ${parent.defaultVal}입니다.")
}
}

profile
진정한 개발자는 코드를 두려워하지 않는다. 오히려 코드가 그를 두려워한다.

0개의 댓글