가시성 수식어는 보이는 범위를 명시해주는 수식어이다. 이름만 다를 뿐 자바의 접근제어자와 같다.
클래스, 오브젝트, 인터페이스, 생성자, 함수, 프로퍼티 및 프로퍼티와 setter는 가시성 수식어를 가질 수 있다.
종류
코틀린은 자바와 마찬가지로 4개의 가시성 수식어가 있다.
- private
- protected
- internal
- public
클래스와 인터페이스를 기준으로 자바와 비교할 수 있다.
패키지
함수(Function), 속성(Property), 클래스(Classes), 객체(Object) 및 인터페이스(Interface)는 패키지 내부의 "최상위 수준"에서 직접 선언할 수 있다.
- private : private선언이 포함된 파일 안에서만 접근 가능
- internal : 같은 모듈에서 접근 가능
- public : 어디서든 접근 가능
//파일이름 example.kt
package foo
private fun foo(){} //파일 안에서만 접근 가능
public var bar: Int = 5
private set //setter는 example.kt에서만 접근 가능
internal val baz = 6 // 같은 모듈에서 접근 가능
클래스와 인터페이스
kotlin vs java
- private vs private
둘 다 클래스 범위 안에서만 접근 가능하다.
- protected vs protected
코틀린에서 protected는 동일한 클래스(private) + 하위 클래스에서 접근가능하지만,
자바의 protected는 같은 패키지 + 하위 클래스에서 접근 가능하다. 차이는 동일한 클래스냐, 같은 패키지냐이다.
- public vs public
두 언어 동일하게 어디에서든지 접근 가능할 수 있다.
- internal vs default
internal은 처음 보고 default는 잘 볼일 없을 것이다. default는 같은 패키지 내에서만 접근 가능한 접근제어자로 접근 제어자를 명시하지 않을경우 기본으로 부여되는 접근제어 자이고 생략 가능하다. 이와 별개로 internal은 선언한 클래스를 볼 수 있는 모듈안의 모든 클라이언트가 internal멤버에 접근할 수 있다. 즉, 같은 모듈안에서만 볼 수 있다는 것이다.
여기서 질문! 자바에서 접근제어자를 명시하지 않으면 default접근제어자가 부여되는데 코틀린은 뭐가 부여될까?
코틀린에선 명시하지 않을 경우 public이 부여된다.
open class Outer {
private val a = 1
protected open val b = 2
internal open 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(상속관계)
override val c = 7 // 'c' 는 internal(같은 모듈)
}
class Unrelated(o: Outer) {
// o.a, o.b 에 접근할 수 없다.
// o.c, o.d 는 같은 모듈에 있기 때문에 접근 가능
// Outer.Nested는 상속관계가 아니기 때문에 접근 불가, Nested::e 마찬가지로 불가능
}
생성자
기본적으로 생성자는 public이며 싱글톤을 만들 경우 private를 사용한다.
class C private constructor(a: Int, val b: Int){ ... }
로컬 선언
로컬 변수, 로컬 함수, 로컬 클래스에는 가시성 수식어를 지정할 수 없다.
모듈
모듈은 함께 컴파일된 코틀린 파일의 집합이다. 쉽게 말하면 프로젝트와 유사하다고 볼 수 있다.
- intelliJ IDEA 모듈
- 메이븐 프로젝트
- 그래들 소스 집합
- <kotlinc> Ant 태스크를 한 번 호출할 때 컴파일되는 파일 집합
'코틀린' 카테고리의 다른 글
데이터 클래스(Data Class) (0) | 2023.03.20 |
---|---|
확장(Extensions) (0) | 2023.03.07 |
Functional (Single Abstract Method) Interface (1) | 2023.02.02 |
인터페이스 (0) | 2023.02.01 |
프로퍼티와 필드 (0) | 2023.01.31 |