가시성 제한자
- 가시성 제한자를 가질 수 있음 : 클래스, 오브젝트, 인터페이스, 생성자, 함수, 프로퍼티, Setter- Getter는 항상 프로퍼티와 같은 가시성을 가짐
 
- private,- protected,- internal,- public(기본)
패키지
- 함수, 프로퍼티, 클래스, 오브젝트, 인터페이스는 "최상위 레벨", 즉 패키지 내부에 직접 선언 가능
// file name: example.kt
package foo
fun baz() {}
class Bar {}
- public: 모든 곳에서 접근 가능
- private: 해당 선언이 포함된 파일에서만 접근 가능
- internal: 같은 모듈 안에서 접근 가능
- protected: 최상위 레벨 선언은 불가능
클래스와 인터페이스
클래스 내부에 선언된 멤버의 경우
- private: 클래스 내부에서만 접근 가능
- protected: private 와 동일하며 하위 클래스에서만 접근 가능
- internal: 선언한 클래스에 접근할 수 있는 모듈내의 클라이언트에서 internal 멤버 접근 가능
- public: 선언한 클래스에 접근할 수 있는 클라이언트에서 public 멤버 접근 가능
Java 유저 주의사항 : 외부 클래스는 Kotlin 내부 클래스의 private 멤버를 볼 수 없다
protected멤버를 오버라이딩할 경우 명시적으로 가시성 제한자를 지정하지 않는 경우,protected가시성을 가진다
open class Outer {
    private val a = 1
    protected open val b = 2
    internal val c = 3
    val d = 4  // 기본으로 public
    protected class Nested {
        public val e: Int = 5
    }
}
class Subclass : Outer() {
    // a 접근 불가능
    // b, c 와 d 접근 가능
    // Nested 와 e 접근 가
    override val b = 5   // 'b' 는 protected
}
class Unrelated(o: Outer) {
    // o.a, o.b 접근 불가능
    // o.c (같은 모듈일 경우)와 o.d 접근 가능 
    // Outer.Nested 접근 불가능, Nested::e 접근 불가능 
}
생성자
- 생성자에 가시성을 지정할 경우, 명시적으로 constructor 키워드를 추가해야한다
class C private constructor(a: Int) { ... }
로컬 선언
로컬 변수, 함수, 클래스에는 가시성 제한자를 지정할 수 없다
모듈
멤버가 동일한 모듈에서 접근 가능하다는 의미. 즉, 모듈은 같이 컴파일된 Kotlin 파일의 세트이다
- Intellij IDEA 모듈
- Maven 혹은 Gradle 프로젝트
- 1번의 호출로 컴파일된 일련의 파일 Ant Task