Kotlin 미리 보기

wwlee94·2022년 10월 26일
0
post-thumbnail

2021년도에 정리했던 내용을 포스팅함.

2021 Kotlin 생태계

서버 사이드 진영의 코틀린 사용 현황

Kotlin은 많은 플랫폼에 호환되는 언어이고, 특히 Android 와 Server-side에서 많이 사용되고 있다.

  • Android는 Google에서 Kotlin을 표준 언어로 선정

작년에 비해서 10% 감소했지만, Kotlin에서 가장 많이 사용되는 JDK 버전은 여전히 JDK 8 이다. (64%)

Kotlin은 최신 JDK 버전을 모두 지원하며 Kotlin은 Java, JVM과 100% 호환된다.

신규 프로젝트에서 많이 사용되는 모습

기존 프로젝트에 마이그레이션하면서 도입하는 경우도 있긴 하지만, 신규 프로젝트에 코틀린을 많이 도입하려 하는 추세다.

코틀린을 사용하기 전 언어

다양한 언어에서 Kotlin으로 전환한 케이스도 많지만 역시나 Java가 압도적이다.

Kotlin 미리 보기

Kotlin for server-side

Kotlin은 서버측 애플리케이션을 개발하는 데 적합한 프로그래밍 언어

기존 Java 기반 기술과 완전한 호환성을 유지하고 보다 간결하고 표현적인 코드를 작성할 수 있다.

  • kotlin의 Type-safe builders, Delegated properties 등등

또한, Java를 알고 있다면 러닝 커브도 낮다고 한다.

Java & Kotlin 프로젝트 컴파일 과정

컴파일 과정
  1. Kotlin 컴파일러가 Kotlin 코드를 컴파일해 .class 파일을 생성
    • 이 과정에서 Kotlin 코드가 참조하는 Java 코드가 함께 로딩되어 사용됨
  2. Java 컴파일러가 Java 코드를 컴파일해 .class 파일을 생성
    • 이때 이미 Kotlin이 컴파일한 .class 파일의 경로를 클래스 패스에 추가해 컴파일

기본 컴파일 순서는 Kotlin 컴파일 > Java 컴파일 이지만 빌드 순서는 조정 가능하다.

클래스, 인터페이스, 함수의 호환성

서로의 인터페이스, 클래스를 상속 받는 모습

Kotlin 파일에서 Java 파일의 Interface를 상속 받아 코드를 구현 가능

단, Lombok과의 호환성 등 실제 혼용하여 운용할때에는 아래 문서에 나와있는 이슈를 고려해야함.

기본 데이터 타입

기본 데이터 타입

코틀린은 원시 타입(primitive type)과 래퍼 타입(wrapper type)을 따로 구분하지 않음

자바처럼 Integer와 int로 구분하지 않고 Int 하나만 존재 !

  • 컴파일 시에 자바의 primitive 또는 wrapper 타입으로 자동 변환됨

Collection 데이터 타입이 2개로 분리되었는데 차이점은 List는 불변, MutableList은 가변

그 밖에 다양한 장점

중복 최소화 가능

  • Java단에서 사용되는 방대한 Lombok 어노테이션들을 사용하지 않고 중복 방지
  • Lombok 사용한 경우
    @AllArgsConstructor
    @ToString
    @EqualsAndHashCode
    class Host {
    	@Getter
    	@NonNull
    	private final String name;
    	@Setter
    	@Getter
    	private final int port;
    	@Setter
    	private final int weight;
    }
  • Kotlin 사용한 경우, data class라는 기능 제공
    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) //컴파일 에러 발생
    }
    • if 문으로 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 제공하여 보다 안전한 코딩 가능 (상속 제한)

보다 간결하게 코딩 가능

  • == 는 equals()
    // 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}")
  • 코틀린의 확장 함수 기능
    • 확장 함수 덕에 자바의 StringUtils나 CollectionUtils 또는 Stream의 기능을 쓰지 않아도 됨
    • String, Collection, Iterable의 확장 함수로 내장되어 있어서 아래 처럼 사용 가능
      // 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)){
    		 // ...
    		}
    	}
    }
  • 코틀린에서는 스마트 캐스트라는 기능으로 if 조건에 맞았으면, 캐스팅을 자동으로 해주어 아래처럼 사용 가능
    fun channelRead(msg: Any) {
    	if (msg is HttpRequest){
    		if (msg.method().equals(HttpMethod.GET)){
    		 // ...
    		}
    	}
    }

코루틴 기능

  • 비동기 프로그래밍을 가독성이 높은 동기식 프로그래밍 코드로 작성
  • 기본적으로 context-switching 없이 동작하여 성능이 좋다 !
    val cached = async { messageService.recent(chatRoomId, maxCachedCount) }
    val fetched = async { requestChatLogs(chatRoomId) }
    
    return (cached.await() + fetched.await())

Kotlin의 다양한 서버 사이드 프레임워크

서버 사이드 프레임워크

레퍼런스

카카오톡의 서버사이드 코틀린 도입

JetBrain 2021년도 코틀린 생태계

코틀린 공식 문서

profile
우엉이의 개발 블로그 📝

0개의 댓글