Kotlin에는 다음과 같은 가시성 수정자가 있습니다:
public (기본값): 요소는 어디서나 볼 수 있습니다.internal: 요소는 하나의 모듈(예: jar/gradle 모듈 등) 내에서만 볼 수 있습니다.protected: 클래스 및 그 자식 클래스 내에서만 볼 수 있습니다.private: 파일 또는 클래스 내에서만 볼 수 있습니다.특징:
private는 파일 범위 내에서 접근을 제한하고, internal은 모듈에 제한하며, public/protected는 클래스 밖에서는 의미가 없습니다.private는 해당 클래스 내에서만, protected는 자식 클래스 포함, internal 및 public은 위에서 설명한 대로입니다.class MyClass { private val secret = "hidden" protected val id = 42 internal fun foo() {} public fun bar() {} } internal fun moduleFunc() {} private fun fileOnlyFunc() {}
"top-level 함수가 protected일 수 있나요? 가능하다면 어떻게 작동하나요? 불가능하다면 왜 그런가요?"
답변: 아니요, top-level 함수는 protected일 수 없습니다. 그 이유는 이 접근 레벨에 속하는 클래스가 없기 때문입니다. 컴파일러가 이를 처리하며, 컴파일 오류가 발생합니다.
protected fun magic() {} // 오류: top-level 함수에 대한 protected 수정자는 허용되지 않음
이야기
핀테크 애플리케이션에서 internal 수정자는 모듈 내 모든 요소에 접근할 수 있다는 것을 잊었습니다. 결과적으로 리팩토링 중 일부 로직을 다른 gradle 모듈로 옮기고 나서 데이터 접근이 중단되었지만, 개발자들은 이전 테스트에서 컴파일 오류가 발생하지 않았기 때문에 이를 즉시 인식하지 못했습니다.
이야기
멀티 플랫폼 프로젝트에서 비밀 데이터를 동반 객체의 private 속성으로 정의했습니다. 이 데이터가 직렬화되어 반사를 통해 접근할 수 있다는 것이 밝혀졌습니다. 이는 val로 선언되었지만, 내보내기를 제한하는 주석이 사용되지 않았기 때문입니다.
이야기
모바일 프로젝트 초기에 private를 top-level 함수에 적용하여 파트너 클래스의 접근을 제한할 것이라고 믿었습니다. 그러나 전체 유틸리티 파일 내에서 이 함수들이 모두에게 보이게 되어 정보 유출 및 비즈니스 로직에서의 예기치 않은 사용 문제로 이어졌습니다.