쉽게 다가가는 최신 프로그래밍: 코틀린 - 1.2.2 라이브러리에서 import문에 대한 보충 설명입니다. 패키지(package)의 영어 단어 뜻은 꾸러미(parcel), 상자(box)이지만, 프로그래밍 언어에서 패키지의 뜻은 여러 함수를 하나의 박스(box)에 담았다는 뜻입니다. 패키지에는 함수 외에 클래스(class)나 프로퍼티(property)를 포함할 수도 있습니다. 패키지를 만드는 목적은 API(application program interface)를 제공하기 위해서입니다. API가 곧 라이브러리(library)입니다. 자주 사용하는 함수들을 패키지에 담아 놓고, 필요할 때 또 만들지 않고 import문을 사용해 불러 쓰면 됩니다. 마치 도서관에 있는 책을 빌려보는 것처럼 말이죠.
10진수 숫자를 8진수 문자열로 변환하는 진법 변환 함수(decimalToOctal)을 구현했습니다. 여기서는 10진수를 2진수로 변환하는 함수 decimalToBinary()와 2진수를 10진수로 변환하는 함수 binaryToDecimal() 을 패키지 numberutil에 저장하고, 이 패키지에 정의한 함수를 import해서 사용하는 예제를 다뤄 볼 것입니다.
■ 패키지 만들기
먼저 패키지를 정의합니다. 프로젝트 창에서 src > 마우스 오른쪽 버튼 > 새로 만들기 > 패키지 에서 패키지 이름 "numberutil"을 입력합니다. 패키지 이름은 소문자를 사용합니다. 이어서 numberutil > 마우스 오른쪽 버튼 > 새로 만들기 > Kotlin 클래스/파일 을 선택하고 파일 이름 "NumberUtil"을 입력합니다.
이제 NumberUtil.kt에 2개의 함수를 추가합니다. 2개의 라이브러리 함수를 만드는 셈입니다.
package numberutil
fun binaryToDecimal(s: String): Int { ... }
fun decimalToBinary(number: Int): String { ... }
■ NumberUtil.kt: 진법 변환 함수 구현
이제 하나씩 구현해볼까요. 함수 binaryToDecimal()에서 중요한 코드는 문자열의 길이가 Int.SIZE_BITS(=32)보다 크면 안된다는 겁니다. Int 타입의 bit수가 32이기 때문입니다. 2진수이기 때문에 10진수로 변환하는 과정에서 자릿수에 대해 2를 곱합니다.
fun binaryToDecimal(s: String): Int {
val errorNum = -1
var num = 0
if (s.length > Int.SIZE_BITS) return errorNum
for (c in s) {
if (c !in '0'.. '1') return errorNum
num = num * 2 + (c - '0')
}
return num
}
decimalToBinary() 함수는 이미 앞에서 구현했죠. decimalToOctal()은 10진수 문자열을 8진수로 변환하였지만, 여기서는 2진수로 변환하기 때문에 2곳의 코드를 8에서 2로 바꾸면 됩니다.
fun decimalToBinary(number: Int): String {
var tmp: Int = number
val sb = StringBuffer()
while (tmp > 0) {
sb.insert(0, tmp % 2) // 맨 앞에 삽입
tmp /= 2
}
return if (sb.isEmpty()) "0" else sb.toString()
}
■ Main.kt: package 문 선언 및 함수 호출
Main.kt에서 이 라이브러리 함수를 사용해 볼까요. 첫 줄에 package 문을 선언합니다. 같은 패키지에 속해 있다면, 다른 파일에서 정의된 함수도 자유롭게 호출할 수 있습니다. 진법 변환 함수는 NumberUtil.kt에서 정의했지만, Main.kt는 NumberUtil.kt와 같은 패키지 numberutil에 속해있기 때문에, 이 함수들을 아무 문제없이 사용할 수 있습니다.
package numberutil
fun main() {
val x = 123
val y = decimalToBinary(x)
val z = binaryToDecimal(y)
println("x=$x, y=$y, z=$z") // x=123, y=1111011, z=123
}
■ Main.kt가 다른 패키지 문으로 선언되어 있으면?
사실 우리가 만드는 응용 프로그램(Main.kt)은 라이브러리 함수가 포함된 패키지와 다른 패키지에 속해 있을 경우가 대부분입니다. 아래 코드에서 Main.kt의 패키지 이름이 myOwn입니다. 패키지 numberuitl에 속한 함수를 불러올 때 매번 numberutil.decimalToBinary() 와 같이 함수 이름 앞에 패키지 이름을 붙여서 호출해야 합니다.
package myOwn
fun main() {
val x = 123
val y = numberutil.decimalToBinary(x)
val z = numberutil.binaryToDecimal(y)
println("x=$x, y=$y, z=$z")
}
많이 불편하죠.. 그래서 import 문이 필요합니다.
package myOwn
import numberutil.binaryToDecimal
import numberutil.decimalToBinary
fun main() {
val x = 123
val y = decimalToBinary(x)
val z = binaryToDecimal(y)
println("x=$x, y=$y, z=$z")
}
2개의 import 문은 아래처럼 간략히 쓸 수 있습니다.
iimport numberutil.* |
".*"가 편리하긴 하지만, 패키지 안에 있는 모든 것(함수, 클래스, 속성 등)을 통째로 불러옵니다. 실전 응용에서는 꼭 필요한 함수나 클래스 등을 꼭집어서 가져오는 import 문을 사용하는 게 좋습니다.
'코틀린' 카테고리의 다른 글
코틀린: 1장 테스트에 도전해 보세요 (0) | 2024.09.08 |
---|---|
코틀린: 널 타입과 안전 호출, 스마트 타입 변환(updated) (0) | 2024.09.04 |
코틀린: String과 CharArray (0) | 2024.09.03 |
코틀린: String의 원소 참조 - 인덱싱 (0) | 2024.09.03 |
코틀린: 진법 변환 구현 (0) | 2024.08.04 |