Lined Notebook

[자바 개발자를 위한 코틀린 입문] 접근 제어 다루기

by dev.hardy

코틀린에서 접근 제어를 다루는 방법

인프런에서 최태현 지식 공유자님의
자바 개발자를 위한 코틀린 입문을 수강하며 정리한 내용 입니다.
하단에 강의 링크 있습니다.

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

자바

  • public : 모든 곳에서 접근 가능
  • protected: 같은 패키지 또는 하위 클래스
  • default: 같은 패키지
  • private: 선언된 클래스내에서만

코틀린

  • public: 모든 곳에서 접근 가능
  • protected: 선언된 클래스 또는 하위 클래스에서만 접근 가능
  • internal : 같은 모듈에서만 접근 가능
    • 모듈: 한 번에 컴파일 되는 코틀린 코드
      • IDEA Module
      • Maven Project
      • Gradle Source Set
      • Ant Task 의 호출로 컴파일 파일의 집합
  • private: 선언된 클래스내에서만

😎 코틀린에서는 패키지를 namespace를 관리하기위한 용도이지 가시성 제어에는 사용되지 않음

자바 vs 코틀린

자바의 기본 접근 지시어: default

코틀린의 기본 접근 지시어: public

코틀린 파일의 접근 제어

코틀린 파일에는 여러개의 변수, 함수, 클래스등이 정의될 수 있다.

Kotlin 파일의 접근 제어

  • public: 어디서든 접근할 수 있다.
  • protected: 파일에는 사용 불가능
  • internal: 같은 모듈에서만 접근 가능
  • private: 같은 파일내에서만 접근 가능

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

  1. 클래스 안의 멤버
    1. public: 모든 곳에서 접근 가능
    2. protected: 선언된 클래스 또는 하위 클래스에서만 접근 가능
    3. internal: 같은 모듈에서만 접근 가능
    4. private: 선언된 클래스 내에서만 접근 가능
  2. 생성자도 가시성 범위는 동일하다.

단, 생성자에 접근 지시어를 붙이려면, constructor를 써주어야 한다.

class Hardy internal constructor(
    val name: String,
    var age: Int
)
  • 코틀린에서는 직접 파일에 유틸성 코드를 작성해서 사용하는게 편하다. (StringUtils.kt)
fun isDirectoryPath(path: String): Boolean {
    return path.endsWith("/")
}

→ 바이트코드를 확인해보면 StringUtilsKt 라는 클래스 안에 isDirectoryPath가 정적메소드로 돼있는 것을 확인할 수 있다. 이렇게 되면 자바에서 사용을 할때 마치 정적 메소드가 있는 것처럼 사용할 수 있다.

public class AppMain {
    public static void main(String[] args) {
        StringUtilsKt.isDirectoryPath("///");
    }
}
  1. 프로퍼티도 가시성 범위는 동일하다.

단, 프로퍼티의 가시성을 설정하는 방법은 두 가지가 있다.

internal val name: String // (1)

var age: Int? = 0
    private set // (2)

(1) getter, setter 한 번에 접근 지시어를 정하는 것

(2) setter에만 추가로 가시성을 부여할 수 있다.

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

  1. internal은 바이트 코드 상 public이 된다.
    • 자바 코드에서는 코틀린 모듈의 internal 코드를 가져올 수 있다.
  2. 코틀린과 자바의 protected는 다르다.
    • 자바는 같은 패키지의 코틀린 protected에 접근 가능하다.

Reference:
자바 개발자를 위한 코틀린 입문

블로그의 정보

개발자 하디 : 기록저장소

dev.hardy

활동하기