개발 언어/코틀린
코틀린(Kotlin) | 클래스 - 가시성 제한자
jjiiiinn
2019. 6. 22. 14:50
728x90
가시성 제한자
- 클래스, 오브젝트, 인터페이스, 생성자, 함수, 프로퍼티(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
728x90