class, object, interface, constructors, function, properties, getter/setter 등에 적용 가능함

open class Base() {
  //  기본적으로 접근제어는 public으로 지정된다. 
  var a = 1
  
  //  Base class 내부에서만 접근이 가능한 private
  private var b = 2
  
  //  Base class와 Base를 상속받은 객체에서 접근가능
  protected open val c = 3
  
  //  동일한 모듈 내에서만 접근가능 
  internal val d = 4

  //  Base 와 상속받은 객체에서 접근이 가능하다. 
  protected fun e() {}
  
}

class Derived: Base {
  //  a, c, d, e() 는 접근이 가능하다. 
  //  b는 접근이 불가능하다. 

  //  c는 protected를 그대로 상속받는다. 
  override val c = 9
}

fun main(args: Array<String>) {
  val base = Base()

  //  base.a 와 base.d 는 접근이 가능하다. 
  //  base.b 와 base.c, base.e() 는 접근이 불가능하다. 

  val derived = Derived()
  //  derived.c 는 접근이 불가능하다. 
}