개발 - 기초/Kotlin

Package와 Import

Joyakdol (조약돌) 2022. 2. 14. 23:15

Java에서 소스 파일(*.java)의 첫 줄은 보통 package라는 단어로 시작한다. (사실 소스 파일의 첫 줄은 주석이어야 한다)

 

Kotlin도 Java와 동일하게 첫 줄은 보통 package로 시작한다. 사용법도 동일해 보인다. 그렇다면 Package 정의 방법은 Java와 동일하다고 언급하고 다음으로 넘어가면 되겠다.

 

하지만, 다행스럽게도 Java와 다르다. Package가 다르면 얼마나 다르겠냐 싶지만 생각보다 꽤 많이 다르다. 아니 사실 다른 점이 그리 크지는 않다. 하지만, 그 크지 않은 차이점이 생각보다 많은 차이를 만들어낸다.

 

기본적인 정의 방법은 Java와 완전히 동일하다. ‘org.momo’라는 package를 선언해보자.

package org.momo

 

숙련된 Java 개발자라면 이 짧은 package 선언문을 보고도 많이 허전해야 한다. 부자연스러움을 느끼지 못했다면 반성해야 한다.

문장 끝에 세미콜론(’;’)이 없다. Kotlin은 세미콜론을 붙여도 되고 안 붙여도 된다. 이것을 좀 더 있어 보이는 말로 바꿔보면 ‘kotlin에서는 세미콜론을 생략 가능하다’ 정도가 된다.

 

Package 선언에서 Java와 Kotlin이 다른 점은 바로 무엇을 담을 수 있는가이다. Java는 Pakcage에 Class를 담을 수 있다. 물론 Package 속에 Package를 담을 수도 있으며, Class 외에 Interface도 담을 수 있다. 하지만, 결국 Class를 담는 꾸러미가 Package이다.

 

하지만, Kotlin은 Package에 함수도 담을 수 있다. Java나 C 언어 등에 익숙한 사람은 Package에 함수를 담는다는 것이 도대체 무슨 소리냐고 반문할 수도 있을 것이다.

하지만 Package에 함수를 담다는 다는 것은 사실 매우 단순하다. 빈 소스파일에 Class 정의 같은 것은 필요 없이 그냥 달랑 함수 하나만 작성해도 된다. 다르게 말하면 Kotlin에서는 Class 없는 함수가 존재할 수 있다고 말할 수 있다. ‘이게 왜 필요할까? 굳이 Class 없는 함수를 만들어야 할 이유가 있을까?’라고 머리 속에 물음표 몇 개를 떠올리고 있을 것이다.

 

Class를 사용하려면 import 해야 한다. 물론 import 하지 않고 전체 Package를 친절하게 모두 적어주면 사용할 수 있지만, 그런 친절함은 당연히 사양해주자. 예를 들어 StringUtil 이라는 Class가 'org.momo.util' 이라는 package에 숨어있다고 가정해보자. 이 녀석을 사용하려면

import org.momo.util.StringUtil

이라고 적어주면 된다. 이렇게 적어주면 우리는 StringUtil 이라는 클래스가 품고 있는 함수를 사용할 수 있다. 만약 ‘org.momo.util’ Package에 여러 개의 아주 자주 사용하는 유틸리티 Class가 담겨 있다면 우리는 보통

import org.momo.util.*

과 같이 한 번에 import 하여 사용할 수 있다.

 

StringUtil에 'convertA()'라는 함수가 있다면 StringUtil.convertA() 와 같은 형태로 사용 가능하다. 그런데, convertA()라는 함수가 매우 심하게 빈번하게 사용되는 녀석이라면 우리는

import static org.momo.util.StringUtil

과 같이 static import 하여 println() 사용하듯이 (= ‘StringUtil’ 이라는 Class 없이) convertA() 함수를 사용할 수 있다.

 

그런데, 만약 이와 같은 유틸리티 함수를 Class 속에 집이 넣는 것이 아니고 소스 파일에 그냥 작성할 수 있다면 사용성이 매우 개선된다.

package org.momo.util
fun convert(A) { ... }

와 같이 작성된 Kotlin 소스 파일이 있다면 우리는

import org.momo.util.convertA

하고, Class 없이 convertA() 라고 직접 함수를 호출할 수 있다. 심지어

import org.momo.util.*

와 같이 사용한다면 convertA() 함수와 동일한 소스 파일이 있는 모든 함수를 Class 없이 println() 사용하듯이 사용할 수 있다.

 

게다가 kotlin은 import할 때 별명을 붙여줄 수도 있다.

import org.momo.util.StringUtil as SU

라고 선언하면 SU.convertA() 와 같이 축약된 형태로 사용할 수 있다.

 

Kotlin에서는 Class와 함수 외에도 properties, object, enum 상수를 import 할 수 있다. 여기서 주의할 것은 object가 Class로 만든 object가 아니고 object 선언한 것을 지칭한다는 점이다. (좀 헷갈릴 수도 있지만 object도 class의 일종이다. 해당 내용은 추 후 언젠가 다룰 예정이다)

'개발 - 기초 > Kotlin' 카테고리의 다른 글

숫자형 Data Type. 그리고 변수와 상수  (1) 2022.02.20
Java 따위는 버리고 Kotlin  (0) 2022.01.05