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

1. 스코프(Scope) - 범위

  • 언어차원에서 변수, 함수, 클래스같은 멤버들을 서로 공유할 수 있는 범위를 지정해둔 단위
  • 스코프가 지정되는 범위는 [패키지 내부], [클래스 내부], [함수 내부]가 존재


패키지 스코프 내 변수, 함수, 클래스


패키지 스코프 내에 있는 하위 스코프

1-1. 스코프 세가지 규칙

1. 스코프 외부에서는 스코프 내부의 멤버를 '참조연산자(.)'로만 참조가 가능하다.

  • 클래스의 멤버를 참조할 때, 클래스 외부에서 인스턴스 명에 참조연산자를 사용해서 접근한다.
  • 패키지에서도 하나의 패키지에서 다른 패키지 내의 멤버를 참조할 때 import 연산자를 사용하거나 참조연사자로 풀네임을 명시하여 참조한다.

예시.

참조연산자? 점(.)을 말한다.

fun main() {
    var e = Eater()
    e.eat()
}

class Eater() {
    fun eat() {
        println("와구와구")
    }
}

2. 동일 스코프 내에서는 멤버들을 '공유'할 수 있다.

  • 패키지 이름을 명시하지 않으면 default 패키지이다.
  • 이 상태에서 만드는 모든 멤버는 같은 패키지 스코프에 포함된다.
val a = "패키지 스코프"

class B {
    fun print() {
        println(a)
    }
}

fun main() {
    println(a)
    B().print() // 인스턴스를 변수에 담지않고 바로 사용할 수 있다.
}

// 결과
패키지 스코프
패키지 스코프
  • 변수 a는 클래스 B나 main 함수에 속하지는 않지만 동일한 스코프 내에서 변수를 공유하여 사용할 수 있다.

3. 하위 스코프에서는 상위 스코프의 멤버를 재정의할 수 있다.

  • 원래 같은 레벨의 스코프에서는 같은 이름의 멤버를 만들면 안된다.
fun main() {
    var a = "나는 말이야"
    var a = "나는 소야"
}

conflicting declarations(선언부가 서로 충돌한다.) 에러가 발생한다.

  • 하위 스코프에서는 같은 이름의 멤버를 만들어 사용할 수 있다.
val a = "패키지 스코프"

class B {
    val a = "클래스 스코프"
    fun print() {
        println(a)
    }
}

fun main() {
    val a = "함수 스코프"
    println(a)
    B().print()
}

// 결과
함수 스코프
클래스 스코프
  • 상위 스코프(패키지 스코프)에 있는 a를 참조하지 않고 각각의 스코프에 있는 값을 참조하는 것을 볼 수 있다.

2. 접근 제한자

  • 스코프 외부에서 스코프 내부로 접근할려면 참조연산자(.)를 사용한다.
  • 스코프 외부에서 스코프 내부에 접근할 때 그 권한을 '개발자가 제어'할 수 있는 기능이다.

2-1. 종류

  • public
  • internal
  • private
  • protected

선언시 앞에 붙여 사용한다.

2-2. 패키지 스코프

  • public(기본값) : 어떤 패키지에서도 접근 가능
  • internal : 같은 모듈 내에서만 접근 가능
  • private : 같은 파일 내에서만 접근 가능
  • protected는 패키지 스코프에서 사용하지 않는다.

2-3. 클래스 스코프

  • public(기본값) : 클래스 외부에서 접근 가능
  • private : 클래스 내부에서만 접근 가능
  • protected : 클래스 자신과 상속받은 클래스에서 접근 가능
  • internal은 클래스 스코프에서 사용하지 않는다.

정리

스코프는 멤버들의 가용범위를 지정해 둔 단위로 개발자는 의도에 따라 스코프 안에 변수나 함수, 클래스를 배치할 수 있다.

접근제한자는 이러한 스코프의 외부와 내부에서 사용할 멤버를 분리하여 스코프 외부에서 건드리지 말아야할 기능이나 값들을 안전하게 제한하는 용도를 가지고 있다.

profile
잘 먹고 잘살기

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN