Coding Log

015. Class - 가시성

2018.02.06 11:49 - NamhoonKim NE_Leader


Kotlin

본 카테고리는 2017년 Android 공식 언어로 채택된 Kotlin에 관하여 다룬다.

Kotlin을 이용해 개발하는 Android는 추후 따로 다루기로 하고 언어 자체에만 집중한다.

참고 kotlin 공식 사이트

Class - 가시성

Kotlin의 클래스, object, 인터페이스, 생성자, 함수, 프로퍼티와 프로퍼티의 setter는 가시성 수식어를 가질 수 있다.

참고 getter는 항상 프로퍼티와 동일한 가시성을 가진다.

Kotlin은 크게 네 가지의 수식어를 가지고 있으며 가시성의 종류는 아래와 같다.

  1. private
  2. protected
  3. internal
  4. public

만약 수식어를 지정하지 않으면 기본적으로 public으로 지정된다.

패키지(Packages)

함수, 프로퍼티, 클래스, object, 인터페이스는 패키지와 같은 최상위에 선언할 수 있다.

// file name: example.kt
package foo
fun baz() {}
class Bar {}
  • 만약 수식어를 지정하지 않으면 기본적으로 public으로 지정된다.
  • private로 지정할 경우 해당 선언을 포함한 파일에서만 접근할 수 있다.
  • internal로 지정할 경우 같은 모듈 안에서 접근할 수 있다.
  • protected로 지정할 경우 최상위 선언에 사용할 수 없다.

참고 다른 패키지에서 최상위 선언에 접근하는 경우엔 접근 대상을 import시켜주어야 한다.

아래의 예제를 보자.

// file name: example.kt
package foo

private fun foo() {} // visible inside example.kt

public var bar: Int = 5 // property is visible everywhere
    private set         // setter is visible only in example.kt

internal val baz = 6    // visible inside the same module

클래스와 인터페이스(Classes and Interfaces)

클래스내에 선언된 멤버변수나 멤버함수들은 아래와 같은 가시성을 가진다.

  • private으로 지정하면 클래스의 모든 멤버와 클래스 안에서만 접근 가능하다.
  • protected으로 지정하면 private + 하위 클래스까지 접근 가능 범위를 확장한다.
  • internal로 지정하면 선언한 클래스를 볼 수 있는 모든 모듈안의 클라이언트가 접근 가능하다.
  • public으로 지정하면 선언한 클래스를 볼 수 있는 모든 클라이언트가 접근 가능하다.

참고 Java와는 달리 외부의 클래스는 내부 클래스의 private 멤버를 접근할 수 없다.

아래 예제 코드를 보자.

open class Outer {
    private val a = 1
    protected open val b = 2
    internal val c = 3
    val d = 4  // public by default

    protected class Nested {
        public val e: Int = 5
    }
}

class Subclass : Outer() {
    // a is not visible
    // b, c and d are visible
    // Nested and e are visible

    override val b = 5   // 'b' is protected
}

class Unrelated(o: Outer) {
    // o.a, o.b are not visible
    // o.c and o.d are visible (same module)
    // Outer.Nested is not visible, and Nested::e is not visible either
}

생성자와 가시성(Constructors)

클래스의 기본 생성자에서 가시성을 지정하려면 아래와 같이 명시적인 constructor 키워드를 사용하여야 한다.

class C private constructor(a: Int) { ... }

위와 같인 선언하면 생성자는 private으로 지정된다.

기본적으로 모든 생성자는 public으로 지정되며, 클래스를 접근할 수 있는 모든 곳에서 생성자를 접근할 수 있다.

만약 internal로 생성자를 지정하면 같은 모듈안에서만 생성자를 접근할 수 있을 것이다.

지역 선언과 가시성(Local declarations)

지역 변수와 지역 함수 그리고 클래스를 가시성을 가진 수식어를 가질 수 없다.

모듈(Modules)

위에서 두 번 언급한 것처럼 internal을 사용하면 해당 선언과 같은 모듈안에서만 접근이 가능하다.

좀 더 상세히 말하면 모듈은 함께 컴파일되는 Kotlin 파일들의 집합이라 볼 수 있다.

아래의 모듈의 예시다.


  • IntelliJ IDEA 모듈
  • Maven project
  • Gradle source set
  • Ant task를 호출할 때 컴파일되는 파일들의 집합


DISQUS 로드 중…
댓글 로드 중…

트랙백을 확인할 수 있습니다

URL을 배껴둬서 트랙백을 보낼 수 있습니다