huzit
___을 입력해주세요
huzit
전체 방문자
  • 분류 전체보기 (137)
    • 안드로이드(Compose) (10)
      • UI (4)
      • 개념 (6)
    • 안드로이드 (50)
      • 기본개념 (6)
      • 응용 (4)
      • Debug (18)
      • Binding (3)
      • RecyclerView (5)
      • Firebase (6)
      • Retrofit (1)
      • Activity & Fragment (4)
    • 코틀린 (22)
    • 코딩테스트 (38)
      • 백준 (10)
      • 프로그래머스 (28)
    • 일상 (6)
    • CS 지식 (4)
    • 라즈베리파이 (7)

블로그 메뉴

  • 홈
  • 태그
  • 글쓰기
  • 관리

공지사항

인기 글

태그

  • Kotlin
  • 공돌카돈
  • IFTTT
  • jetpack
  • firebase
  • FCM
  • RecyclerView
  • Retrofit
  • 라즈베리 파이
  • Android
  • compose
  • Debug
  • Java
  • gts4mini
  • 코틀린
  • docker
  • recyclerView ClickEvent
  • 프로그래머스
  • 브레빌 밤비노 플러스
  • 공돌이파파

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
huzit

___을 입력해주세요

가시성 수식어(Visibility modifiers)
코틀린

가시성 수식어(Visibility modifiers)

2023. 2. 2. 23:55
728x90

가시성 수식어는 보이는 범위를 명시해주는 수식어이다. 이름만 다를 뿐 자바의 접근제어자와 같다.

클래스, 오브젝트, 인터페이스, 생성자, 함수, 프로퍼티 및 프로퍼티와 setter는 가시성 수식어를 가질 수 있다.

종류

코틀린은 자바와 마찬가지로 4개의 가시성 수식어가 있다.

  • private
  • protected
  • internal
  • public

클래스와 인터페이스를 기준으로 자바와 비교할 수 있다.


패키지

함수(Function), 속성(Property), 클래스(Classes), 객체(Object) 및 인터페이스(Interface)는 패키지 내부의 "최상위 수준"에서 직접 선언할 수 있다. 

  1. private : private선언이 포함된 파일 안에서만 접근 가능
  2. internal : 같은 모듈에서 접근 가능
  3. 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

  1. private vs private

둘 다 클래스 범위 안에서만 접근 가능하다.

  1. protected vs protected

코틀린에서 protected는 동일한 클래스(private) + 하위 클래스에서 접근가능하지만,

자바의 protected는 같은 패키지 + 하위 클래스에서 접근 가능하다. 차이는 동일한 클래스냐, 같은 패키지냐이다. 

  1. public vs public

두 언어 동일하게 어디에서든지 접근 가능할 수 있다.

  1. 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 태스크를 한 번 호출할 때 컴파일되는 파일 집합
728x90
저작자표시 (새창열림)

'코틀린' 카테고리의 다른 글

데이터 클래스(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
    '코틀린' 카테고리의 다른 글
    • 데이터 클래스(Data Class)
    • 확장(Extensions)
    • Functional (Single Abstract Method) Interface
    • 인터페이스
    huzit
    huzit
    simple is best

    티스토리툴바