티스토리 뷰

가시성 제한자

  • 클래스, 오브젝트, 인터페이스, 생성자, 함수, 프로퍼티(setter)는 가시성 제한자를 가질수 있다.
    • getter의 경우 항상 프로퍼티와 같은 가시성 제한자를 가진다.
  • private, protected, internal, public 네개의 제한자가 존재하며 기본적으로 public 가시성을 가진다.

패키지

  • 함수, 프로퍼티, 클래스, 오브젝트, 인터페이스최상위 레벨로 선언 가능하다.
제한자 범위
public 제한자 설정 안할시 기본적으로 적용됨.
protected 최상위 레벨 선언에서는 사용 못함.
internal 같은 모듈 내부에서 접근 사능함.
private 같은 패일 내에서만 접근 가능함.
package person

private fun walk() { // 같은 파일 내에서만 접근 가능
    println("walking")
}

var age: Int = 10 // 기본 public 적용됨
    private set // setter는 같은 파일 내에서만 가능

fun main() {
    walk() // walking

    age = 11
    println("age is $age") // age is 11

클래스와 인터페이스

제한자 범위
public 모든 클라이언트가 접근 가능함.
internal 선언한 클래스에 접근할 수 있는 모듈에 속한 모든 클라이언트가 접근 가능
protected private 범위 + 하위 클래스 접근가능.
private 클래스 내에서만 접근 가능
open class Base {
    private val privateMember: String = "private"
    protected open var protectedMember: String = "protected"
    internal val internalMember: String = "internal"
    val pubilcMember: String = "public"

    protected class InnerClass {
        val innerClassMember: String = "inner class member"
    }
}

class SubClass: Base() {
    fun main() {
        // super.privateMember // private 접근 불가
        println(super.protectedMember) // protected
        println(super.internalMember) // internal
        println(super.pubilcMember) // public

        val innerClass = InnerClass()
        println(innerClass.innerClassMember) // inner class member
    }
}

class ThirdPartClass(val base: Base) {
    fun main() {
        // base.privateMember // private 접근 불가
        // base.proectedMember // protected 접근 불가
        println(base.internalMember) // internal
        println(base.pubilcMember) // public

        // val innerClass = InnerClass() // 접근 불가
    }
}

fun main() {
    val subClass = SubClass()
    subClass.main()

    val thirdPartClass = ThirdPartClass(Base())
    thirdPartClass.main()
}

 

자바와 다르게 코틀린에서는 외부 클래스자신 내부클래스의 private멤버에 접근하지 못한다.
Java
public class PersonJava {
    public Integer getInnerClassAge() {
        return new InnerClass().age; // 내부 클래스의 private멤버에 접근 가능.
    }

    private class InnerClass {
        private Integer age = 31;
    }

    public static void main(String[] args) {
        PersonJava personJava = new PersonJava();
        System.out.println("inner class private member :: " + personJava.getInnerClassAge());
    }
}
Kotlin
class PersonKotlin {
    fun main() {
        val innerClass = InnerClass()
        innerClass.age // error!! 접근하지 못함.
    }
    class InnerClass {
        private val age: Int = 31
    }
}

 


출처

https://javacan.tistory.com/entry/kotlin-11-12-ko-reference

 

코틀린 1.1 / 1.2 한글 레퍼런스 PDF 문서

코틀린 1.2 한글 레퍼런스 문서. 일부 내용(자바스크립트 관련 등)을 생략했고, 내용에 오류가 존재할 수 있음. 코틀린 1.1 한글 레퍼런스 문서. 일부 내용(자바스크립트 관련 등)을 생략했고, 내용에 오류가 존..

javacan.tistory.com

 

댓글