스코프
정의
- 프로젝트 구조 내에서 변수나 함수, 클래스의 ‘공용 범위’를 제어하는 단위
- 언어차원에서 변수나 함수, 클래스 같은 ‘멤버’들을 서로 공유하여 사용할 수 있는 범위를 지정해 둔 단위
- 멤버들의 가용 범위를 지정한다.
- 의도에 따라 스코프 내부에 변수, 함수, 클래스 배치 가능하다.
지정 범위
- 패키지 내부, 클래스 내부, 함수 내부에서 스코프가 지정된다.
![]()
규칙
- 스코프 외부에서는 스코프 내부의 멤버를 ‘참조연산자’로만 참조 가능하다.
- 클래스: a.eat()처럼 ‘.’으로 참조해서 클래스 내부 함수 사용
- 패키지: import 사용하거나, 패키지명.멤버이름으로 참조
- 동일 스코프 내에서는 멤버들을 ‘공유’할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
| val a = "package scope"
class B{
fun print(){
println(a)
}
}
fun main(){
B().print() // B()를 변수에 담지 않고 바로 사용 가능
}
|
class B와 main 함수는 동일한 package scope 내에 존재하므로 변수 a를 사용할 수 있다.
- 하위 스코프에서는 상위 스코프의 멤버를 재정의 할 수 있다.
- 상속 개념에서 배운 override가 가능한 이유이다. (서브 클래스는 하위 스코프, 수퍼 클래스는 상위 스코프)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| val a = "package scope"
class B{
val a = "class scope"
fun print(){
println(a)
}
}
fun main(){
val a = "function scope"
println(a)
B().print()
}
}
|
class B와 main 함수에서 a를 각각 재정의 하였다. 위를 실행해보면 function scope과 class scope이 출력됨을 확인할 수 있다.
접근제한자
정의
- 스코프 외부에서 스코프 내부에 접근할 때 그 권한을 ‘개발자가 제어’할 수 있는 기능
- 스코프 외부에서 건드리지 말아야 할 값들을 안전하게 재한
2가지 경우
- 패키지 스코프 (*protected는 사용하지 않음)
- public(기본값): 어떤 패키지에서도 접근 가능
- internal: 같은 모듈 내에서만 접근 가능
- private: 같은 파일 내에서만 접근 가능
- 클래스 스코프 (*internal은 사용하지 않음)
- public(기본값): 클래스 외부에서 늘 접근 가능
- private: 클래스 내부에서만 접근 가능
- protected: 클래스 자신과 상속받은 클래스에서 접근 가능
![]()
참고사항
- 프로젝트: 코틀린으로 어플리케이션을 짤 때 관련한 모든 내용을 담는 큰 틀
- 모듈: 하나의 프로젝트는 여러개의 모듈로 구성되고, 하나의 모듈에는 다수의 폴더와 파일이 들어간다.
- 안드로이드 스튜디오 프로젝트의 기본 app 모듈에 더해서 스마트폰용, TV용, 냉장고용 등의 안드로이드 앱을 만든다면 하나의 프로젝트에 모듈을 3개 생성하는 것.
- 패키지
- 프로젝트, 모듈, 폴더 및 파일이 실제 파일 시스템에 기반한 물리적인 구조를 담당한다면, 패키지는 논리적인 구조이다.
- 개발 시 소스코드의 소속을 지정하기 위한 논리적인 단위이다.