멀티 플랫폼 언어 - JVM, JS, Native 환경에서 모두 사용 가능
하나의 파일이 어떤 환경에서 컴파일되느냐에 따라 빌드된 파일이 달라진다! (개쩐당,,)
kotlin.random.Random
-> 자바에서처럼 Random
/ThreadLocalRandom
사이에서 고민할 필요가 없다.
JDK 환경에 따라 알아서 함수를 골라주기 때문에
@NotNull
, @Nullable
, final
을 사용할 필요 없다!
의식적으로 노력하지 않아도 안전한 코딩이 가능하다.
IntelliJ에서
Tools - Kotlin - Show Kotlin Bytecode -> decompile로 자바로 decompile해보기
annotation processor가 코틀린 컴파일 이후에 동작하기 때문에 lombok에서 생성된 자바 코드는 코틀린 코드에서 접근할 수 없다.
-> 최근 버전엔 플러그인 추가해서 해결 가능. 하지만 자바 코드에서 코틀린 코드를 호출할 수 없다.
equals()
, hashCode()
, toString()
, copy()
등 사용하기
코틀린 코드를 왜 자바 코드로 봐야하는지에 대한 가장 큰 이유!
코틀린은 기본적으로 final
을 붙임
자바에서 @SpringBootApplication
은 @Configuration
을 포함하고 이에 대한 프록시를 사용하는데 final을 붙이면 상속하거나 override 할 수 없으므로 에러 발생
모든 클래스를 open하게 되면 코틀린을 쓰는 의미가 없어짐
->All-open 컴파일러 플러그인 이용해서 해결
지정한 annotation이 있는 클래스와 모든 멤버에 open 변경자를 추가
IntelliJ에서
File - Project Structure - Project Settings - Modules - Kotlin - Compiler Plugins에서 확인 및 수정 가능
인스턴스화될 때 초기화되도록 설정
@Autowired
private lateinit var objectMapper: ObjectMapper
잭슨 코틀린 모듈
매개 변수가 없어도 직렬화, 역직렬화 지원
val mapper1 = jacksonObjectMapper()
val mapper2 = ObjectMapper().registerKotlinModule()
일단 val로 선언하고 필요할 때 var로 변경
@EnableConfigurationProperties
, @ConfigurationPropertiesScan
을 사용해서 읽기 전용으로 생성자 바인딩
클래스에 개념적으로 동일하지만 하나는 공개된 API의 일부, 하나는 구현 세부 사항일 경우 private property에 _
를 접두사로 사용
No-arg 컴파일러 플러그인
JPA에서 엔티티 클래스를 생성하려면 매개변수가 없는 생성자 필요
매개변수가 없는 생성자를 추가
리플렉션 이용해서 자바/코틀린에서 사용 가능
이때도 allOpen 이용해서 open을 붙이지 않으면 지연 로딩 불가능 (프록시로 인해서)
양방향 연관의 경우 toString()
, hashCode()
호출할 때 무한 순환 참조 발생
JPA에 의해 인스턴스화될 때 초기화 블록이 호출되지 않기때문에 getter 사용시 필드가 null인 경우 존재
null검사나 !! 연산자를 써야 한다. -> 굳이 자바 대신에 코틀린을 쓸 이유가 없다.
0 또는 빈 문자열로 초기화하는 편이 낫다.
optional 보다는 nullable 사용
every{
~~~~} returns ~~~
코틀린의 확장 함수를 적극 이용하자.
fun TermRepository.getById(id: Long): Term{
if (id == 0L) {
return Term.SINGLE
}
return findByIdOrNull(id) ?: throw NoSuchElementException()
}
interface TermRepository : JpaRepository<Term, Long>