코틀린과 자바의 차이점

패스트 캠퍼스 실무 프로젝트로 배우는 Kotlin & Spring 강의 정리

코틀린과 자바의 차이

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

  • Checked Exception
    • 자바의 예외 계층
      • Throwable: 예외 계층의 최상위 클래스
      • Error: 시스템에 비정상적인 상황 발생. 예측이 어렵고 기본적으로 복구 불가능 (ex. OutOfMemorryError, StackOverflowError)
      • Exception: 시스템에서 포착 가능하여(try-catch) 복구 가능. 예외 처리 강제
        • IOException, FileNotFoundException 등
        • @Transactional 에서 예외가 발생하면 기본적으로 롤백이 동작하지 않음
      • RuntimeException: 런타임시에 발생하는 예외. 예외 처리를 강제하지 않음 (ex. NullPointerException, ArrayIndexOutOfBoundException)
    • 자바에서 checked exception은 컴파일 에러가 발생하므로 무조건 try-catch로 감싸거나 throws로 예외를 전파해야 함
    • 대부분 checked exception 처리가 반복됨
    • Catch 안에서 에러를 해결하는 일은 흔하지 않고 생산성을 감소시킴
    • 코틀린은 checked exception을 강제하지 않으며 원하는 경우 try-catch 사용 가능
  • 기본 자료형
    • 자바는 원시 자료형과 레퍼런스 타입 지원
    • 코틀린은 레퍼런스 타입만 지원하며 최적화된 방식으로 컴파일됨
  • 정적 멤버
    • 자바는 static 키워드로 정적 멤버 선언
        public class Test {
        static int i = 0;
              
        public static void sample() {
            // ...
        }
        }
      
    • 코틀린은 companion object로 대체
        class Test {
        companion object {
            val i: Int = 0
                  
            fun sample() {
                // ...
            }
        }
        }
      
  • 삼항 연산자
    • 자바는 삼항 연산자 존재
    • 코틀린은 if-else 사용
  • 세미콜론
    • 자바에서는 라인의 끝은 무조건 세미클론으로 끝나야 함
    • 코틀린에서는 세미콜론이 필수가 아님

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

  • 확장
    • 개발자가 임의로 객체의 함수나 프로퍼티를 확장해서 사용 가능
      fun String.first(): Char {
          return this[0]
      }
        
      fun String.addFirst(char: Char): String {
          return char + this.substring(0)
      }
        
      fun main() {
          println("ABCD".first())			// A
          println("ABCD".addFirst('Z'))	// ZABCD
      }
    
  • 데이터 클래스
    • 데이터를 보관하거나 전달하는 목적을 가진 불변 객체로 사용 (ex. DTO)
    • hashCode(), equals(), toString() 자동 생성
    • copy(), componentN() 제공
        data class Person(val name: String, val age: Int)
      
    • 기존 자바에서는 주로 Lombok 사용하며 JDK 15에서 record 추가
      @Data
      public class Person {
          private final String name;
          private final int age;
      }
        
      // JDK 15
      public record Person(String name, int age) {
            
      }
    
  • 문자열 템플릿
    • 문자열에 변수를 사용하거나 여러 행으로 된 텍스트 블록 생성 가능
      val text = "World"
      val greeting = "Hello, ${text}"
        
      println(greeting)	// Hello, World
        
      // 문자열 템플릿을 이용한 다이나믹 쿼리
      fun sql(nameIncluded: Boolean) =
      	"""
      		SELECT id, name, email, age
      		FROM users
      		WHERE id = :id
      		${
      			if (nameIncluded) {
      				"""
      				AND name = "name"
      				"""
      			} else ""
      		}
      	"""
    
    • 자바는 21년 9월 초안이 만들어졌고 현재 프리뷰 상태
  • Null safety
    • 자바에서 가장 많이 발생하는 예외는 NullPointerException
    • 자바의 Optional은 값을 wrapping 하므로 객체 생성에 따른 오버헤드 발생, 컴파일 단계에서 Null 가능성 검사 X
    • 코틀린은 언어적 차원에서 NPE의 발생 가능성 제거
      val a: String = null	// 컴파일 오류
        
      var b: String = "aabbcc"
      b = null // 컴파일 오류
    
    • Nullable 참조는 컴파일 단계에서 null 안정성 제공
      var a: String ? = null
      a.length // 컴파일 오류
      a?.length // safe-call 정상∂
      a!!.length // null이 아니라고 확신하는 경우
    
  • 기타
    • 스마트 캐스트
    • 실드 클래스 (JDK 15 추가)
    • 위임
    • 중위 표현식
    • 연산자 오버로딩
    • 코루틴