-
[Kotlin] 코틀린 패키지 / .kt파일과 .java파일 (feat. top-level선언)Kotlin/Types 2021. 7. 21. 21:50
Extension Function을 다시보다가 top-level 접근제한자를 보려고 들어왔는데
어찌이리 개판으로 정리해놨는지 다시 정리한다....
이미지 출처: Do it 코틀린 프로그래밍
패키지 선언은 자바처럼 소스파일의 첫줄에 한다.
It is not required to match directories and packages: source files can be placed arbitrarily in the file system.
코틀린의 경우 디렉토리(폴더)구조와 패키지구조의 일치는 필수가 아니다.
그러나 관습으로 일치시켜야 한다( 헷갈리게 다르게 하는 사람이 있을까?? )
이클립스의 경우 폴더와 패키지가 일치해야 했다.
일반적으로 안드로이드 스튜디오에서 파일이나 패키지를 만들때 디렉토리와 패키지 위치를 일치하게 알아서 잘 만들어준다.
패키지명에서 글자를 지워도 문제가 없다.
이런식으로 패키지명과 실제 디렉토리 구조가 일치하지 않더라도 에러가 나지 않는다.
물결로 밑줄쳐 있는 곳을 클릭해 IDE의 제안을 보면 패키지와 디렉토리 구조를 일치하라고 제안해준다.
파일명.kt 파일
코틀린은 static 키워드가 없다. 코틀린에서는 top level이라는 개념이 static키워드를 어느정도 대체한다.
top-level에서 선언한 것들(확장함수, 확장프로퍼티, const val, var, val 프로퍼티 등등)은
파일명.kt -> 자바의 파일명Kt 클래스의 멤버로 포함된다
일반적으로 선언된 클래스의 경우 top-level이 아니다.
디컴파일된 코드
top level에서 선언가능한 것들을 몇개 선언했다.
top-level에서 선언된 것들은 현재 파일이 Hello.kt이므로 HelloKt클래스 내부의 클래스 멤버로 포함된다.
디컴파일된 코드를 확인하면 Test.java, Test2.java는 생략하였고
추가적으로 생성된 것만 옮겨왔다.
top-level에 선언되었던 것들이 클래스멤버나 클래스메서드로 들어가 있는 것을 볼 수 있다.
(코틀린의 프로퍼티 내용에 해당되지만 추가적으로 설명하면 자바의 getter,setter가 생성되는데, 프로퍼티 정의문법에 getter,setter를 커스텀 하지 않았으므로 자바의 field도 생성되었다. const val은 필드만 생성되고 getter,setter 생성되지 x
패키지 내에 선언된 파일들은 같은 패키지에 속한다.
선언된 파일들의 top-level선언내용들은 각 파일의 파일명Kt 클래스에 포함되고
각 파일의 파일명Kt 클래스들이 모두 합쳐져 하나의 클래스가 되는 것 같다.
https://blog.jetbrains.com/kotlin/2015/06/improving-java-interop-top-level-functions-and-properties/
kt파일 안의 일반 클래스는 따로 따로 생성된다.
-> class와 top-level 선언들은 모두 kotlinpractice 패키지에 소속된다.
자바에서는 한 java파일에 최대 한개의 public 클래스를 가질 수 있었다.
코틀린 .kt파일은 여러개의 java파일로 만들어져 한개의 public 클래스의 제한이 없어진다.
(코틀린에서는 접근제한자를 생략한 것이 public)
top level이면 static이고
프로퍼티가 backing field(자바 필드)가 생성되도록 정의한 경우
backing field - var일경우 final이 안붙고 val, const val이면 final붙는다.
val은 getter가 만들어지고 , const val은 getter가 생성안됨
[Kotlin/Types] - [Kotlin] val / const val
( val vs const val 포스팅에서 다뤘던 내용이다)
class, objects, interfaces, constructors, functions, properties(getter,setter) 는 visiblity modifier를 가질 수 있다.
접근 제한자는 private, protected, internal, public이 존재하고 default는 public이다.
top level에서의 private visibility modifier가 일반적인 private와 조금 다르다.
명시하지 않으면 default로 public- 모든 곳에서 사용가능
private- 선언된 파일 내부에서만 사용가능(패키지 하위에 포함인데 왜 파일 내부서만 사용가능인지 신기하다)
internal- 같은 모듈내에서만 사용가능
protected- 상속관계에 있는 것만 사용가능 -> top-level선언에서는 protected제한자 사용 불가능
private일 때
top level에서 선언된 것 - 파일 내부에서만 사용가능
class 내부에서 선언된 멤버들 - 클래스 내부에서만 사용가능
Top-level 선언이 아닌 일반 클래스 선언은 패키지 하위에 여러 파일에서 중복되면 안되는데
위의 top level선언의 private modifier를 테스트하다 아리송한 결과가 나왔다.
top-level에 선언된 것이 패키지에 소속되어 파일마다 중복이 있으면 안되는 줄 알았는데 다음의 코드를 보면
top level에 선언된 것들의 접근 제한자에 따라서 중복 선언이 가능할 수도 있고 안될 수도 있다.
top level 도 사용하려면 import 필요
private 일 때 자신의 파일에서는 import없이 사용
private 라서 다른 파일에서는 사용불가
개개의 하나만 import시키는 것이므로 불편하면 import 패키지.* 하면된다. 그러면 패키지의 모든 top level의 것들을 사용할 수 있다.
'Kotlin > Types' 카테고리의 다른 글
[Kotlin] Array (0) 2021.12.16 [Kotlin] Nothing, Unit (0) 2021.08.16 [Kotlin] Type check and Type casts (0) 2021.08.13 [Kotlin] val / const val (0) 2021.07.21 [Kotlin] 변수/자료형 (0) 2021.07.07