Language/kotlin

접근 제어 다루기

kimjingyu 2023. 5. 22. 15:36
728x90

자바와 코틀린의 가시성 제어

  • 코틀린에서는 패키지를 namespace를 관리하기 위한 용도로만 사용하고, 가시성 제어에는 사용되지 않는다.
  • 모듈: 한 번에 컴파일되는 코틀린 코드
  • 자바의 기본 접근 제시어는 default이고, 코틀린의 기본 접근 제시어는 public이다.
    • public: 모든 곳에서 접근 가능
    • protected: 선언된 클래스 또는 하위 클래스에서만 접근 가능
    • internal: 같은 모듈에서만 접근 가능
    • private: 선언된 클래스 내에서만 접근 가능

코틀린 파일의 접근 제어

  • 코틀린은 .kt 파일에 변수, 함수, 클래스 여러개를 바로 만들 수 있다.
    • public: 기본값
    • protected: 파일(최상단)에는 사용 불가능 -> 클래스 접근
    • internal: 같은 모듈에서만 접근 가능
    • private: 같은 파일 내에서만 접근 가능

다양한 구성 요소의 접근 제어

  • 클래스 안의 멤버
    • protected: 선언된 클래스 또는 하위 클래스에서만 접근 가능
  • 생성자
    • 가시성 범위는 동일하나, 생성자에 접근 지시어를 붙이려면 constructor를 써줘야한다.
    • 자바에서 유틸성 코드를 만들때, abstract class + private constructor를 사용해서 인스턴스화를 막았다.
    • 이를 코틀린에서는 파일 최상단에 바로 유틸 함수를 작성함으로써 만들 수 있다.
public abstract class StringUtils {

  private StringUtils() {}

  public boolean isDirectoryPath(String path) {
    return path.endsWith("/");
  }

}
fun isDirectoryPath(path: String): Boolean {
    return path.endsWith("/")
}
 

☕ 익명 클래스(Anonymous Class) 사용법 총정리

익명 클래스 (Anonymous Class) 익명 클래스는 내부 클래스(Inner class) 일종으로 단어 그대로 이름이 없는 클래스를 말한다. 익명, 이름이 없다는 것은 별로 기억되지 않아도 된다는 것이며, 나중에 다

inpa.tistory.com

  • property
    • 프로퍼티의 가시성 범위도 동일하다. 하지만 프로퍼티의 가시성을 제어하는 방법에 차이가 있다.
    • 프로퍼티의 custome setter에 접근 지시어를 붙일 수 있다.
  • 생성자에서 getter, setter 한 번에 접근 지시어를 설정
class Car(
    internal val name: String,
    _price: Int
){
    • setter에만 추가로 가시성을 부여
var _price = _price
    private set

자바와 코틀린을 함께 사용할 경우 주의할 점

  • Intertal 접근 지시어는 바이트 코드상 public이 된다. 따라서 자바 코드에서는 코틀린 모듈의 internal 코드를 가져올 수 있다.
  • 코틀린의 protected와 자바의 protected는 다르다.
    • 코틀린에서 패키지는 namespace 관리용이기 때문에 protected는 의미가 달라졌다.
  • 따라서 자바에서 코틀린 코드를 사용할 때, internal과 protected는 주의해야 한다.
728x90