엔지니어 규의 IT 프로그래밍 다이어리

[Kotlin]12. 변수,함수, 클래스의 접근범위와 접근 제한자 본문

프로그래밍 언어/코틀린

[Kotlin]12. 변수,함수, 클래스의 접근범위와 접근 제한자

엔지니어 규 2022. 5. 14. 10:32
728x90

Scope

스코프는 언어 차원에서 변수나 함수, 클래스 같은 '멤버'들을 서로 공유하여 사용할 수 있는 범위를 지정해둔 단위이다.

 

스코프가 지정되는 범위는 패키지, 클래수, 함수 내부 등이 있다.

 

 

 

예를 들어 하나의 패키지안에 변수, 함수, 클래스가 있다면, 그것들은 모두 하나의 scope 안에 있는 멤버들이지만,

 

다시 그 안에 있는 함수나 클래스 안에 또다른 변수나 함수가 존재한다면, 패키지 스코프안에 또다른 하위 스코프로 동작한다.

 

 

 

 

스코프에는 세가지 규칙이 존재한다. 지금부터 이 규칙을 알아보도록 하자.

 

첫번째

 

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

 

이러한 개념은 그동안 자주 사용해 왔었다.

 

예를들면 클래스의 멤버를 참조할때 클래스 외부에서 인스턴스명에 참조연산자를 사용해 접근했다. (ex : a.eat() ,  도트 (.) 가 참조연산자)

 

패키지에서도 하나의 패키지에서 다른 패키지 내의 멤버를 참조 할 때도 import 를 사용하거나, 직접 참조 연산자를 사용해야 했다.

(ex : import com.google.engineer-gyu  ,  import com.google.engineer-gyu.A -> com.google.enginner-gyu의 A 를 참조)

 

두번째

 

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

 

지난 포스팅에서 파일에 package를 명시하지 않으면 default package 라고 했다. 

 

이상태에서 만드는 모든 멤버들은 같은 패키지 스코프에 포함된다고 생각하면 된다.

 

아래의 소스코드를 보자.

val a = "패키지 스코프"
 
class B {
    fun print(){
        println(a)
    }
 
}
 
fun main(){
    println(a)
    B().print()
}

패키지 스코프
패키지 스코프

cs

 

실행해보면 변수 a는 클래스 B나 main 함수에 속해 있지 않지만, 동일 스코프내에서 변수를 공유하고 있다.

 

세번째

 

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

 

원래 스코프의 같은 레벨에서는 같은 이름의 멤버를 만들어서는 안된다.

val a = "햄버거"
val a = "피자"


Kotlin: Conflicting declarations
cs

위의 소스 코드처럼 a라는 변수를 두번 선언하면 Conflicting declarations error가 나온다.

 

하지만 하위 스코프에서는 같은 이름의 멤버를 만들어 사용 할 수 있다.

 

val a = "패키지 스코프"
 
class B {
    val a = "클래스 스코프"
    fun print(){
        println(a)
    }
 
}
 
fun main(){
    val b = "함수 스코프"
    println(a)
    B().print()
}


패키지 스코프
클래스 스코프
cs

실행해 보면 상위 스코프에 있는 변수 a를 참조하지 않고, 각각의 스코프를 참조하는것을 알 수 있다.

 

접근제한자(Access Modifier)

 

접근제한자란 스코프 외부에서 스코프 내부에 접근 할 때 그 권한을 '개발자'가 제한할때 쓰는 키워드이다.

 

접근제한자에는 public, internal, private, protected 가 있다.

 

이 접근제한자들은 변수, 함수, 클래스 선언시 맨 앞에 붙여서 사용하게 된다.

 

이러한 접근제한자는 상황에 따라 두가지로 기능이 나뉘게된다.

 

 

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

 

또한 접근제한자는 이러한 스코프의 외부와 내부에서 사용할 멤버를 분리하여,

 

스코프 외부에서 건드리지 말아야 할 기능이나 값들을 안전하게 제한하는 용도를 가지고 있습니다.

 

 

 

  

 

 

728x90
Comments