Kotlin 시작하기
이 글은 코틀린을 전~~~혀 모르는 개발자가 공식홈페이지를 보며 따라해보며 배워가는 글 입니다.
해당 글은 https://kotlinlang.org/docs/reference/basic-syntax.html에서 보면서 처음부터 따라해보는것을 목표로 합니다.
언어를 새로 돌려볼땐 국룰 Hello World를 찍어보려합니다. 우선https://kotlinlang.org/docs/tutorials/getting-started.html 해당 공식 페이지의 문서대로 설정하였습니다. (너무 잘나와있기에..)
fun main() {
println("Hello world")
}
계속 자바를 메인으로 써서 그런진 모르겟지만, 별도 클레스 선언없이 바로 메인을 실행하는건 조금 어색합니다.
뜬금없지만 코틀린을 갑자기 살펴보게 된 이유는, 먼저 개인적인 클라이언트 공부를 위하여! 그리고 java로 개발된 서버프로젝트를 개선할 수 있을까를 찾던 도중 여러 레퍼런스를 보면서 괜찮은 예시가 많아 한번 배워보려 합니다.
얼마 보지않았지만 조금 눈에띄는 특징이 있다면
1. Optional 강제화 ( Null Safety)
코틀린에서는 변수 선언시 반드시 값에 대해 추가를 해야합니다. 물론 null을 넣을 수 있지만 null이 가능한 경우, 반드시 null 체크가 되도록 강제화 되고 있습니다. ( Runtime에서 nullpointException 가 아닌 컴파일 타임에 잡아줍니다.
fun parseInt(str: String): Int? {
return str.toIntOrNull()
}
fun printProduct(arg1: String, arg2: String) {
val x = parseInt(arg1)
val y = parseInt(arg2)
// ...
if (x == null) {
println("Wrong number format in arg1: '$arg1'")
return
}
if (y == null) {
println("Wrong number format in arg2: '$arg2'")
return
}
// x and y are automatically cast to non-nullable after null check
println(x * y)
}
2. Java Type 호환
https://kotlinlang.org/docs/reference/java-interop.html
공식 페이지에 기존 자바 코드와 100% 호환 이라고 있었던 만큼, java에서 지원하는 타입을 그대로 지원해줍니다.
단 코틀린에서는 단일 타입으로 자바의 non-primitive, primitive를 구분하지 않고 받게됩니다.
물론 내부선언에 따라 타입을 유추하여 타입을 정하게 됩니다.
ex)
var a0 = 30 -> kotlin : Int, java : int
var a1 : Int? = 50 Kotlin : Int? , java : java.lang.Integer
Intellij에선 Tool -> Kotlin -> Show Kotlin ByteCode를 보면 어떻게 변환되었는지 확인할 수 있습니다.
기존 자바코드와 쓰임도 비슷하고, 언어끼리 혼용하여 사용할 수도 있서 꽤 좋은 시도가 될 것 같앗습니다.
3. 코드의 간소화
해당 내용으로 작성할 내용은 매우 많지만 홈페이지에서 본 몇가지 예시를 본다면..
https://kotlinlang.org/docs/reference/returns.html1.
1). labels
fun main() {
loop@ for (i in 1..100) {
for (j in 1..100) {
if( j == 3) break@loop
println("$i ,$j")
}
}
}
만약 2중 루프가 아니라 다중 루프일때... 만약 최하위 루프에서 break를 통해 모든 for문을 끝내려면 각 for문의 마지막마다 해당 체크값을 추가해야하는 불상사가 생깁니다.( 그렇게 짜는일이 없기를 바라지만)
kotlin에서는 label 기능을 이용해서 최상위 loop로 jumps 하여 구문을 종료시킵니다.
2). Smart Cast
if (x !is String) return
print(x.length) // x is automatically cast to String
다른 언어에서도 사용중이긴 하지만, 캐스팅 부분이 간소화 되었고, 사용성이 편리해진것 같습니다.
3) data 타입 간소화
java 였다면 기본적으로 getter, setter 등 여러 메스드를 선언하고 dto객체, domain객체등을 생성할 것입니다.
kotlin은 매우 간단하게 해당 부분에 대한 코드를 줄여 사용 가능한것으로 보입니다.
data class Host{
val name : String,
val pwd : Int
}
이건 추후에 좀더 자세히..
기존 프로젝트, 레거시 프로젝트를 보면서 드는 생각으로 간단한 기능이지만 너무 길고, 그 가독성 안좋게 구현되어있는 코드들을 많이 보고 있습니다.
물론 자바언어만으로도 충분히 개선할 수 있고, 개선해 나가고 있지만, kotlin을 공부하면서 한번씩 프로젝트의 부분부분을 기웃거리면서 한번 비교해보려합니다.
-- 공부를 위해 책을 사야겠습니다.