intellij를 만든 jetbrain사에서 만든 언어다. 자바에 비해서 문법이 간결해 가독성과 생산성이 높고 오류 가능성이 낮다.
자바에서 복잡하게 구현해야되는 것들을 코틀린에서는 쉽게 제공한다.
data class Person(
val name: String,
val age: Int,
val email: String
) // equals(), hashCode(), toString()등 유용한 함수를 자동 생성
object MyCompany { // 싱글턴 객체
const val name: String = "MyCompany"
}
// 탑-레벨 함수로 클래스 외부에서 함수 작성 가능
fun main() {
// `new` 키워드 없이 객체 생성
val person = Person("이상훈", 35, "digimon1740@gmail.com")
println(person)
}
자바를 몰라도 학습가능하며 자바와 상호 운용이 가능해 기존 자바 프로젝트에 쉽게 적용이 가능하고 자바로 작성된 오픈소스를 그대로 사용할 수 있다.
// 자바로 작성된 스프링 부트를 코틀린에서 사용
@SpringBootApplicatoin
class MyApplication
fun main(args: Array<String>) {
runApplication<MyApplication>(*args)
}
@RestController
class MyController {
@GetMapping("/hello")
fun sayHello() = "Hello"
}
멀티 플랫폼 언어여서 서버, IOS, Android와같은 모바일앱, 프론트(JS) 등 모든 분야에서 사용 가능
// 아래 코틀린으로 작성된 코드는 자바스크립트로 컴파일되어 브라우저에서 작동한다.
import kotlinx.browser.window
fun main() {
fun main() {
val body = window.document.body
body?.innerHTML = "<b>Hello, <i>Kotlin</i></b>"
window.setInterval({
body?.innerHTML += "!
}, 1000)
}
}
구글 홈팀은 코틀린을 도입하고 제일 많은 비정상 종료를 일으킨 NullPointerException을 33%나 절감시켰다.
코틀린은 자바처럼 체크드 익셉션을 강제하지 않는다. 하지만 원하면 try-catch를 사용할 수 있다.
자바는 원시 자료형을 지원하고 객체로된 래퍼런스 타입도 지원하지만. 코틀린은 래퍼런스 타입만 지원한다.
자바는 static 키워드로 정적 멤버를 선언할 수 있지만. 코틀린은 companion object로 선언한다.
자바는 삼항연산자가 있지만 코틀린은 if-else 구문으로 대신한다.
val animalSound: String = if ("호랑이" == animal) "어흥" else "야옹"
자바에서는 라인을 마칠때 무조건 세미콜론으로 끝내야하지만. 코틀린은 필수가 아니다.
- 코틀린에서는 객체의 함수나 프로퍼티를 확장해서 사용할 수 있다.
MyStringExtentions.kt
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
}
- 데이터 클래스: 데이터를 보관하거나 전달하는 목적을 가진 불편 객체로 사용한다.(eg. DTO)
기본 자바에서는 주로 Lombok을 사용했다. JDK 15에서는 record로 추가되었다.
// kotlin
data class Person(val name: String, val: age: Int)
// hashCode(), equals(), toString() 자동 생성 됨
// 이 외에도 copy(), componentN()도 유용함
// JAVA
@Data
public class Person {
private final String name;
private final int age;
}
// JDK 15
public record Person(String name, int age) {
}