budtree
나를 조금만 더 완성해보는 날
budtree
전체 방문자
오늘
어제
  • 분류 전체보기 (77)
    • 💝 Computer Science (5)
      • OS (1)
      • Network (1)
      • Database (3)
    • 🐤 study (21)
      • kubernetes🕸️ (0)
      • Spring Boot🍃 (1)
      • JPA (2)
      • Infra (2)
      • HTML | CSS (3)
      • Java (6)
      • Kotlin (3)
      • etc (4)
    • 💻 Project (3)
      • memoir & diary 📚 (1)
      • class (0)
      • project (2)
    • 🔥 Problem Solving (38)
      • programmers (30)
      • SQL (8)
      • BOJ (0)
    • ✨ daily (10)
      • diary (5)
      • exercise (5)
      • travel (0)
      • review (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • pt
  • 코린이
  • 헬린이
  • 피티
  • java
  • 카카오코딩테스트
  • 일기
  • 월간코드챌린지
  • css
  • 코딩테스트
  • 개린이
  • 블랙멀티짐
  • 헬스장
  • 코틀린
  • 코테
  • Summer/Winter Coding
  • 프린이
  • HashMap
  • kotlin
  • 프로그래머스
  • ArrayList
  • 카카오
  • programmers
  • 취업준비
  • 2018 KAKAO BLIND RECRUITMENT
  • 취업
  • 카카오코테
  • 월간 코드 챌린지
  • 서울대입구 헬스장
  • 자바

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
budtree

나를 조금만 더 완성해보는 날

🐤 study/Kotlin

[Kotlin] 코틀린 이해하기 | 코틀린을 배워야 하는 이유 | 자바와 코틀린의 차이점 | 코틀린의 기능✏️[1]

2022. 12. 20. 20:25

1. 코틀린 이해하기

1. 코틀린의 현재와 미래


코틀린을 배워야 하는 이유

  • Jetbrains에서 만든 언어
  • → 자동완성, 코틀린 변환, 코루틴등 관련 편의 기능을 지원한다.
  • 자바는 발표된지 20년이 넘었지만 코틀린, 스위프트와 같은 현대언어에 비해 기능이 부족하다.
  • 자바에서 best-practice로 불리는 기법들을 언어적 차원에서 기본적으로 제공한다.
    • ex) 이펙티브 자바, 디자인패턴 등
  • 자바에 비해 문법이 간결 → 가독성, 생산성이 높고 오류 가능성이 적다.
  // equals(), hashCode(), toString() 자동으로 생성
  data class Person(
     val name: String,
     val age: Int,
     val email: String
  ) 

  // 간단하게 싱글턴 객체를 생성
  object MyCompany {
     const val name: String = "MyCompany"
  }

  // 탑레벨 함수로 클래스 외부에서 함수를 작성한다.
  fun main() {
      //new 키워드 없이 객체를 생성한다
      val person = Person(" ", 35, "a@gmail.com")
      println(person)
  }

data class를 사용하면 equals, hashCode, toString 함수를 자동으로 생성한다.

 

object 키워드는 싱글턴 객체를 자동으로 생성한다.

 

fun을 이용해 함수를 탑레벨에 위치시켜 별도의 클래스 없이 함수를 작성할 수 있다. 또한 new 키워드 없이 객체를 생성할 수 있다.

 

  • 자바와 상호 운용이 가능하기 때문에 기존 자바프로젝트에 쉽게 적용할 수 있다.
  • 코틀린은 기본적으로 멀티 플랫폼 언어로써, 모바일앱(안드로이드, ios), 프론트(js)등 모든 분야에서 사용이 가능하다.



2. 코틀린 타임라인


  • 2016년 코틀린 1.0 릴리즈
  • 2017년 스프링 프레임워크 5.0부터 코틀린 공식 지원
  • 2017년 구글 io에서 안드로이드 공식 지원 언어로 발표
  • 2019년 구글 io에서 안드로이드 개발시 최우선 언어로 코틀린 발표
  • 스택 오버플로우 트렌드에서 코틀린 인기가 계속 상승하고, 자바는 감소하는것을 확인할 수 있음.
  • 유명 오픈소스 프로젝트의 코틀린 지원 현황
    • 스프링 프레임워크
      • 공식 문서 예제에 자바와 코틀린 2가지 탭이 나뉘어있음
      • gradle은 기존엔 groovy문법만 지원했었는데, 요즘은 kotlin dsl을 지원하기 때문에 자동완성, 컴파일 검사를 받을 수 있음.



3. 자바와 코틀린의 차이점


✅ 자바에는 있지만 코틀린에는 없는 기능

  • 체크드 익셉션(Checked Exception)
    • 자바는 익셉션 계층으로 구성

    • Error : 시스템에서 에러가 발생해서 복구가 어려운 상황(OOM, StackOverFlow Error)
    • Exception
      • CheckedException : 시스템에서 포착 가능하여 복구 가능, 예외처리를 강제한다. (IOException, FileNotFoundException)
        • RuntimeException : 런타임시에 발생, 예외처리 강제하지 않음(NullPointerException, ArrayIndexOutOf`BoundsException, Unchecked Exception)
    • 자바에서 checked exception은 컴파일 에러가 발생하기 때문에 무조건 try-catch로 감싸거나 throws로 에러를 전파해야 한다.
    • → 의미없는 처리의 반복이 일어난다.
      try {
          File file = FileUtils.get(filename);

       } catch (FileNotFoundExcepition e) { //checked exception이 발생했지만 의미있는 작업처리가 없음
           //처리?
       }
  • 코틀린은 checked exception을 강제하지 않는다. try-catch문을 생략해도 컴파일 에러가 발생하지 않는다.
  • 기본 자료형
    • 자바는 원시 자료형과 레퍼런스 타입 모두 지원한다.
      int i = 0; // primitive type
      Integer ii = 0; //reference type
  • 코틀린은 레퍼런스 타입만 지원한다.
      val i : Int = 0
      val str : String = i.toString()
레퍼런스 타입을 컴파일 할 때 **최적화된 방식으로 컴파일**한다.

위의 예제에서 컴파일될때에는 원시타입인 int로, str은 String이 된다.
    //위의 코드가 컴파일 될때 해석되는 내용 -> 최적화된 성능 보장
    int i = 0;
    String str = String.valueOf(i);

 

  • 정적 멤버
    • 자바는 static 키워드로 정적 멤버를 선언하지만, 코틀린은 static이 존재하지 않고 companion object로 대체한다.
        class Kotlin {
            companion object { //static과 유사한 키워드, companion object
                val i: Int = 0
                fun function() {
                }
            }
        }

 

  • 삼항 연산자
    • 자바에는 삼항연산자가 존재하지만, 코틀린은 if-else로 대신한다.
      val animalSound: String = if("호랑이" == animal) "어흥" else "야옹"
kotlin은 if-else가 **식**이 될 수 있다.(== 값을 리턴할 수 있다)

 

  • 세미콜론(;)
    • 코틀린은 세미콜론이 필수가 아니다.

 

✅ 코틀린에는 있지만 자바에는 없는 기능

  • 확장
    • 개발자가 임의로 객체의 함수나 프로퍼티를 확장해서 사용할 수 있다.
      //String 함수에 first라는 확장함수를 사용
      fun String.first(): Char {
          return this[0]
      }

      //String 함수에 addFirst라는 확장함수를 사용
      fun String.addFirst(char: Char): String {
          return char + this.substring(0)
      }

      fun main() {
          println("ABCD".first()) //출력 : A

          println("ABCD".addFirst('Z')) // 출력 : ZABCD
      }

 

  • 데이터 클래스
    • 데이터를 보관하거나 전달하는 목적을 가진 불변객체로 사용
    • DTO로 주로 유용하게 사용한다.
      // data키워드로 사용, hashCode(), equals(), toString(), copy(), componentN() 자동생성
      data class Person(val name: String, val age: Int)
  • 기존 자바에서는 주로 lombok 플러그인을 이용해 자동으로 생성한다. 코틀린은 플러그인이 아닌 언어레벨에서 지원을 해주기 때문에 유용하다.
  • +) jdk 15에서 record라는 이름으로 추가됨 → Data 클래스와 동일한 목적으로 사용

 

  • 문자열 템플릿
    • 코틀린은 문자열에 변수를 사용할 수 있다.
      val text = "World"
      val greeting = "Hello, **${text}**"
  • 코틀린은 여러 행으로 된 텍스트 블록을 만들 수 있다.
      fun sql(nameIncluded: Boolean) = 
          """
              SELECT id, name, email, age
              FROM users
              WHERE id = :id
              ${
                  if(nameIncluded) {
                      """
                          AND name = :name
                      """
                  } else ""
              }
          """
  3개의 쌍따옴표를 사용해 문자열 템플릿을 만들 수 있다. 다이나믹 쿼리를 만들 때 코틀린으로 string을 만들고, 안에서 변수를 사용할 수 있다.

 

  • 널(Null) 안정성
    • 자바에서 가장 많이 발생하는 예외는 NPE (NullPointerException) 이다.
      null에 대한 문제를 해결하도록 Optional을 제공하고는 있지만, optional 객체 생성에 따른 오버헤드가 발생하고, 컴파일 단계에서는 Null 가능성을 검사하진 않는다.

    • 코틀린은 언어차원에서 NPE가 발생할 가능성을 제거한다.
      val a: String = null //컴파일오류(nullable이 아니기 때문)

      var b : String = "aabbcc" 
      b = null //지연초기화로 null을 넣었을 경우 컴파일 오류 발생
      var a: String? = null

      a.length //컴파일 오류 발생
      a?.length //?참조를 이용해 safe-call, null이 아닌경우에만 동작
      a!!.length //!!을 이용해 null이 절대 안들어감을 확신한다.
코틀린에서는 NPE를 자연스럽게 방지할 수 있는 기법들을 제공한다.

 

  • smart cast, sealed class, coroutine



4. 스프링의 코틀린 지원


Spring initializr

  • 기본 언어로 코틀린을 선택할 수 있고, 코틀린의 경우 gradle project를 선택하면 빌드 설정을 kotlin DSL 기반으로 생성해준다.
  • ide의 도움을 받을 수 있기 때문에 쉽게 설정파일을 세팅할 수 있다.

 

스프링 부트

  • 별다른 변경사항 없이 스프링부트 어플리케이션을 실행할 수 있다.
    @SpringBootApplication
    class DemoApplication // 클래스가 있긴 하지만 중괄호로 메인을 감싸고 있지 않음

    //탑-레벨 함수로 클래스 바깥에서 호출한다.
    fun main(args: Array<String>){
        runApplication<DemoApplication>(args) 
    }

 

@ConfigurationProperties

  • 스프링에서 지정한 설정을 기반으로 설정클래스를 만들 때, @ConstructorBinding을 사용하면 setter가 아닌 생성자를 통해 바인딩하므로 불변객체를 쉽게 생성할 수 있다.
    @ConstructorBinding
    @ConfigurationProperties("example.kotlin")
    data class KotlinExampleProperties(
            val name: String,
            val description: String,
            val myService: MyService) {
        data class MyService(
            val apiToken: String,
        val uri: URI
        ) 
    }

 

테스트 지원

  • SpringMockK라는 코틀린 라이브러리를 이용해 @MockkBean, @SpykBean을 사용한다.
    @ExtendWith(SpringExtension::class)
    @WebMvcTest
    class GreetingControllerTest {
        @MockkBean
        private lateinit var greetingService: GreetingService
        @Autowired
        private lateinit var controller: GreetingController

        @Test
        fun `should greet by delegating to the greeting service`() { // 함수명에 띄어쓰기, 예약어 모두 가능

            // Mockk에서 제공하는 기능
            every { greetingService.greet("John") } returns "Hi John"
            // When
            assertThat(controller.greet("John")).isEqualTo("Hi John")
            // Then
            verify { greetingService.greet("John") }
        }
    }

 

확장 함수

  • 코틀린 api의 대부분은 확장기능을 사용해 기존 api를 건드리지 않고 쉽게 코틀린 api를 추가한다.
    // CrudRepositoryExtensions.kt
    package org.springframework.data.repository
    fun <T, ID> CrudRepository<T, ID>.findByIdOrNull(id: ID): T? {
        return findById(id).orElse(null)
    }
    //MyService.kt
    class MyService(
        private val myRepository: MyRepository, ){
          fun findById(id: Long): My? = myRepository.findByIdOrNull(id)
    }

 

코루틴

  • 코틀린에서 비동기-논블로킹 방식을 선언형으로 구현한다.
  • 스프링 mvc, webflux 모두 코루틴을 지원 → 의존성만 추가하면 바로 사용 가능하다.
  • 비동기-논블로킹 스타일의 구현을 쉽게 할 수 있다. (suspend 키워드, async, await)




참고

  • 패스트캠퍼스 - Kotlin & Spring : 리팩토링부터 서비스 구현까지

 

정확한 정보를 전달하고자 최선을 다하지만, 틀린 부분이 있을 수 있습니다! 
틀린 부분이 있을 시 지적해주시면 감사히 반영하겠습니다😀

'🐤 study > Kotlin' 카테고리의 다른 글

[Kotlin] 코틀린 기초문법(변수, 함수, 흐름제어, 널 안정성, 예외처리, 클래스, 프로퍼티, 상속, 인터페이스, 열거형 클래스)  (3) 2022.12.28
[당근테크 밋업 요약] 코프링 | 코틀린의 철학 | 코틀린의 장점 | 코틀린 특징(#살아있다 #자프링외길12년차 #코프링2개월생존기) -1편  (0) 2022.11.17
    '🐤 study/Kotlin' 카테고리의 다른 글
    • [Kotlin] 코틀린 기초문법(변수, 함수, 흐름제어, 널 안정성, 예외처리, 클래스, 프로퍼티, 상속, 인터페이스, 열거형 클래스)
    • [당근테크 밋업 요약] 코프링 | 코틀린의 철학 | 코틀린의 장점 | 코틀린 특징(#살아있다 #자프링외길12년차 #코프링2개월생존기) -1편
    budtree
    budtree
    개발, 운동, 일상등의 글을 올립니다.

    티스토리툴바