2021년도에 정리했던 내용을 포스팅함.
서버 사이드 진영의 코틀린 사용 현황
Kotlin은 많은 플랫폼에 호환되는 언어이고, 특히 Android 와 Server-side에서 많이 사용되고 있다.
작년에 비해서 10% 감소했지만, Kotlin에서 가장 많이 사용되는 JDK 버전은 여전히 JDK 8 이다. (64%)
Kotlin은 최신 JDK 버전을 모두 지원하며 Kotlin은 Java, JVM과 100% 호환된다.
신규 프로젝트에서 많이 사용되는 모습기존 프로젝트에 마이그레이션하면서 도입하는 경우도 있긴 하지만, 신규 프로젝트에 코틀린을 많이 도입하려 하는 추세다.
코틀린을 사용하기 전 언어다양한 언어에서 Kotlin으로 전환한 케이스도 많지만 역시나 Java가 압도적이다.
Kotlin은 서버측 애플리케이션을 개발하는 데 적합한 프로그래밍 언어
기존 Java 기반 기술과 완전한 호환성을 유지하고 보다 간결하고 표현적인 코드를 작성할 수 있다.
또한, Java를 알고 있다면 러닝 커브도 낮다고 한다.
기본 컴파일 순서는 Kotlin 컴파일 > Java 컴파일 이지만 빌드 순서는 조정 가능하다.
Kotlin 파일에서 Java 파일의 Interface를 상속 받아 코드를 구현 가능
단, Lombok과의 호환성 등 실제 혼용하여 운용할때에는 아래 문서에 나와있는 이슈를 고려해야함.
코틀린은 원시 타입(primitive type)과 래퍼 타입(wrapper type)을 따로 구분하지 않음
자바처럼 Integer와 int로 구분하지 않고 Int 하나만 존재 !
Collection 데이터 타입이 2개로 분리되었는데 차이점은 List는 불변, MutableList은 가변
@AllArgsConstructor
@ToString
@EqualsAndHashCode
class Host {
@Getter
@NonNull
private final String name;
@Setter
@Getter
private final int port;
@Setter
private final int weight;
}
data class Host {
val name: String,
val port: Int?,
val weight: Int?
}
컴파일 시점에 NPE를 방지 가능
// str 인자에 Nullable type 을 지정하고 함수 안에서 str 내부 접근 하려하면 컴파일 에러 발생
fun size(str: String?) = str.length
// str인자에 Not-null type을 지정!
fun size(str: String) = str.length
fun main() {
size(null) //컴파일 에러 발생
}
자료의 변경을 막는 불변 컬렉션 제공 (List, MutableList, ...)
val listData = listOf<Int>(1,2,3) // List 생성
listData.add(4) // 불변이기 때문에 오류
val mutableListData = mutableListOf<Int>(1,2,3) // MutableList 생성
mutableListData.add(4) // 정상
불변 변수 val 제공하여 보다 안전한 코딩 가능 (상속 제한)
// java
if (version.equals(minVersion)){}
// kotlin
if (version == minVersion) {}
// java
if (version.compareTo(minVersion) < 0) {}
// kotlin
if (version < minVersion) {}
// java
System.out.println("[" + index + "] " + request.length)
// kotlin
println("[$index] ${request.length}")
// java
if (StringUtils.isEmpty(str)) return
// kotlin
if (str.isNullOrEmpty()) return
// java
list.stream().map(~).filter().collect();
// kotlin
list
.map{}
.filter{}
fun channelRead(msg: Any) {
if (msg is HttpRequest){
HttpRequest req = (HttpRequest) msg;
if (req.method().equals(HttpMethod.GET)){
// ...
}
}
}
fun channelRead(msg: Any) {
if (msg is HttpRequest){
if (msg.method().equals(HttpMethod.GET)){
// ...
}
}
}
val cached = async { messageService.recent(chatRoomId, maxCachedCount) }
val fetched = async { requestChatLogs(chatRoomId) }
return (cached.await() + fetched.await())