코틀린과 자바의 차이점
22 Sep 2022패스트 캠퍼스 실무 프로젝트로 배우는 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() { // ... } } }
- 자바는 static 키워드로 정적 멤버 선언
- 삼항 연산자
- 자바는 삼항 연산자 존재
- 코틀린은 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 추가)
- 위임
- 중위 표현식
- 연산자 오버로딩
- 코루틴