Kotlin - Access Control

2023. 4. 22. 00:53·📘 Backend/Kotlin

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

목차

  • 가시성 제어
  • 코틀린 파일의 접근 제어
  • 다양한 구성요소의 접근 제어
  • 자바와 코틀린을 함께 사용할 경우 주의점
  • 정리

💡 가시성 제어

자바의 기본 접근 지시어는 Default 이지만, 코틀린은 public인걸 조심하자.


public

  • 모든곳에서 접근 가능

protected

  • 선언된 클래스 또는 하위 클래스에서만 접근 가능

internal

  • 같은 모듈에서만 접근 가능

private

  • 선언된 클래스 내에서만 접근 가능

💡 파일 접근 제어

코틀린은 .kt 파일에 변수, 함수, 클래스 여러개를 바로 만들 수 있다.


public

  • 기본값, 어디서든 접근 가능

protected

  • 파일(최상단)에는 사용 불가능

internal

  • 같은 모듈에서만 접근 가능

private

  • 같은 파일 내에서만 접근 가능

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

클래스, 생성자, 프로퍼티에 대한 접근 제어


클래스 안의 멤버 접근 제어 범위

public

  • 모든 곳에서 접근 가능

protected

  • 선언된 클래스 또는 하위 클래스에서만 접근 가능

internal

  • 같은 모듈에서만 접근 가능

private

  • 선언된 클래스 내에서만 접근 가능

생성자

생성자도 가시성 범위는 동일하다 하지만,

생성자에 접근지시어를 붙이려면 'constructor' 키워드를 붙여야 한다.

class Bus internal constructor(
    val price: Int
)

자바에서 유틸성 코드를 작성할때 abstract class + private constructor를 이용해 인스턴스화를 막는데 자주 사용했다.

코틀린에서도 비슷하게 가능하지만, 파일 최상단에 바로 유틸 함수를 작성하면 더 편하다.

// Java
public abstract class StringUtils {
    private StringUtile() {}

    public boolean isDirectoryPath(String path) {
        return path.endsWith("/");
    }
}
// Kotlin
fun isDirectoryPath(path: String): Boolean {
    return path.endsWith("/")
}

프로퍼티

getter, setter 한번에 접근 지시어를 정하거나, setter에만 추가로 가시성을 부여할 수 있다.

class Car(
    internal val name: String,
    _price: Int
) {
    var price = _price
    private set
}

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

internal은 바이트코드 상 public이 되므로 Java에서 Kotlin 모듈의 internal 코드를 가져올 수 있다.

Kotlin과 Java의 protectec는 다르다, Java는 같은 패키지의 Kotlin protected 멤버에 접근이 가능하다.


💡 정리

  • kotlin에서 패키지는 namespace 관리용이기 때문에 protected는 의미가 달라졌다.
  • kotlin에서는 default가 사라지고 모듈 간 접근을 통제하는 internal이 새로 생겼다.
  • 생성자에 접근 지시어를 붙일때는 constructor를 명시적으로 써주어야 한다.
  • 유틸성 함수를 작성할 때 파일 최상단을 이용하면 편리하다.
  • 프로퍼티의 custom setter에 접근 지시어를 붙일 수 있다.
  • 자바에서 코틀린 코드를 사용할 때 internal과 protected는 주의해야 한다.
저작자표시 (새창열림)

'📘 Backend > Kotlin' 카테고리의 다른 글

Kotlin - Object  (0) 2023.04.23
Kotlin - Extension Function  (0) 2023.04.23
Kotlin - Inheritance  (0) 2023.04.21
Kotlin - Class  (0) 2023.04.17
Kotlin - Function  (0) 2023.04.17
'📘 Backend/Kotlin' 카테고리의 다른 글
  • Kotlin - Object
  • Kotlin - Extension Function
  • Kotlin - Inheritance
  • Kotlin - Class
신건우
신건우
조용한 개발자
  • 신건우
    우주먼지
    신건우
  • 전체
    오늘
    어제
    • 분류 전체보기 (422)
      • 📘 Frontend (71)
        • Markup (1)
        • Style Sheet (2)
        • Dart (8)
        • Javascript (12)
        • TypeScript (1)
        • Vue (36)
        • React (2)
        • Flutter (9)
      • 📘 Backend (143)
        • Java (34)
        • Concurrency (19)
        • Reflection (1)
        • Kotlin (29)
        • Python (1)
        • Spring (42)
        • Spring Cloud (5)
        • Message Broker (5)
        • Streaming (2)
        • 기능 개발 (5)
      • 💻 Server (6)
        • Linux (6)
      • ❌ Error Handling (11)
      • 📦 Database (62)
        • SQL (31)
        • NoSQL (2)
        • JPQL (9)
        • QueryDSL (12)
        • Basic (4)
        • Firebase (4)
      • ⚙️ Ops (57)
        • CS (6)
        • AWS (9)
        • Docker (8)
        • Kubernetes (13)
        • MSA (1)
        • CI & CD (20)
      • 📚 Data Architect (48)
        • Data Structure (10)
        • Algorithm (8)
        • Programmers (17)
        • BaekJoon (5)
        • CodeUp (4)
        • Design Pattern (4)
        • AI (0)
      • ⚒️ Management & Tool (8)
        • Git (7)
        • IntelliJ (1)
      • 📄 Document (10)
        • Project 설계 (6)
        • Server Migration (3)
      • 📄 책읽기 (2)
        • 시작하세요! 도커 & 쿠버네티스 (2)
      • 🎮 Game (4)
        • Stardew Vally (1)
        • Path of Exile (3)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

      Lock #Thread #Concurrency
      React #Markdown
      GStreamer #Pipeline
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.0
    신건우
    Kotlin - Access Control
    상단으로

    티스토리툴바