티스토리 뷰

프로젝트 구조 내에서 변수, 함수, 클래스의 '공용 범위'를 제어하는 단위인 스코프와 스코프 외부에서 내부로의 접근을 제어하는 접근 제한자가 무엇인지 알아보자.

😶‍🌫️ 코틀린에서의 스코프

scope: 범위

  • 하나의 패키지에서 변수, 함수, 클래스가 존재하면 같은 스코프이지만, 함수, 클래스 내에 또 변수가 존재한다면, 이는 패키지의 스코프와는 다르다.

스코프의 규칙

  1. 스코프 외부에서는 스코프 내부의 맴버를 참조 연산자로만 참조가 가능하다.
    • 이는 .으로 우리가 클래스의 속성과 함수에 접근했던 것과 같은 의미이다.
    • 서로 다른 이름의 패키지를 참조하려고 할 때 import를 사용하는 것 또한 같은 의미이다.
  2. 동일 스코프 내에서는 맴버를 공유할 수 있다.
    • 예를 들어서 패키지 명을 명시하지 않으면 kotlin에서는 default 패키지로 지정하는데, 이때 같은 패키지 스코프 내에 포함된다. 아래의 예제를 보자.
    var a: String = "스코프"
    
    class Scope{
        fun print() {
            println(a)
        }
    }
    
    fun main(args: Array<String>) {
        println(a)
        val s = Scope()
        s.print()
    }
    
    • 출력 값은 모두 "스코프"가 나온다.
    • 변수 a는 실제로 클래스 B나 main함수에 속해있지 않으나 동일한 스코프 내에서 변수를 공유하여 사용할 수 있는 것을 볼 수 있다.
  3. 하위 스코프에서는 상위 스코프의 멤버를 재정의 할 수 있다.
    • 원래 스코프의 같은 레벨에서는 같은 이름의 맴버를 만들어서는 안 된다.
    • 하지만 하위 스코프 내에서는 같은 이름을 만들어 사용할 수 있다.
    var a: String = "패키지 스코프"
    
    class Scope{
        val a = "클래스 스코프"
        fun print() {
            println(a)
        }
    }
    
    fun main(args: Array<String>) {
        val a = "함수 스코프"
        println(a)
        val s = Scope()
        s.print()
    }
    
    • 출력 값은 "함수 스코프" 와 "클래스 스코프"로 패키지 스코프를 참조하지 않고 각각의 스코프 내에 있는 변수를 참조한 것을 확인할 수 있다.
    • 만약에 Scope class안의 print()라는 함수 안에 var a = "함수 스코프"를 작성하면 "함수 스코프가"가 출력된다. 즉 변수 출력에 있어 패키지 스코프 < 클래스 스코프 < 함수 스코프를 확인할 수 있다.

😶‍🌫️ 참조 연산자

스코프 외부에서 스코프 내부에 접근할 때 사용

📦 패키지 스코프에서

public : 기본값, 어떤 패키지에서도 접근이 가능함

internal : 같은 모듈 내에서만 접근이 가능함

private : 같은 파일 내에서만 접근이 가능

protected : 패키지 스코프에서는 사용하지 않음

📿 클래스 스코프에서

public : 기본값, class 외부에서 항상 접근 가능

private : class 내에서만 접근 가능

protected : class 자신과 상속받은 sub class에서만 접근 가능

internal은 class scope에서는사용하지 않음

'Android > Kotlin' 카테고리의 다른 글

[Kotlin] Generic  (0) 2021.12.07
[Kotlin] 클래스의 다형성  (0) 2021.12.07
[Kotlin] Kotlin의 기본 프로젝트 구조  (0) 2021.12.06
[Kotlin] 오버라이딩과 추상화  (0) 2021.12.06
[Kotlin] 상속  (0) 2021.12.05