package hello fun main(args: Array) { println("Hello World!") }
1 개요
JetBrains에서 개발한 언어이다. 간결한 문법을 가지고 있으며, 세미콜론이 옵션이다. JVM 기반의 언어이며, Java간의 상호 운용이 100% 지원된다.[2] 안드로이드, Tomcat[3] , 자바스크립트, Java EE, HTML 5 등을 개발할때 사용할 수 있다고 한다. 현재 공식 1.0.3 버전이 나와 있다.
2 특징
- 장황했던 자바와 비교하면 눈물날 정도로 간결한 문법을 제공한다. 간결한 문법을 제공하면서도 런타임 오버헤드가 거의 없다.
- 오버헤드 없는 널 안전성을 제공한다. 코틀린의 변수는 Nullable(널 값 사용 가능)과 NotNull(널 값 사용 불가)로 나뉘는데, 변수 선언 시 '?'를 붙여 Nullable로 만들 수 있다.
- 예외를 검사하지 않는다.
- 확장함수, 연산자 오버로딩을 지원한다.
- 예를 들어 Int형을 확장해 'i = 3 power 4' 식으로 새 연산자를 만들 수 있다.[4]
- API 문서에 자바의 HTML대신 Markdown을 사용한다.
- == 연산자가 생각하는 대로 작동한다.
- 자바에서는 String i와 String j가 같은 문자열을 담고 있어도 가리키는 객체가 다르므로 i == j는 false이다. 코틀린에서 ==는 equals()와 똑같이 작동한다. 따라서 i == j는 true다. 자바의 ==를 쓰려면 ===를 쓰면 된다. !=는 !==
- Static 메서드가 없다. companion object를 사용하자. 자바 코드에서 접근하려면 '클래스명.Companion.메서드_혹은_get변수명()'을 쓰면 된다.
- 자바6에 호환된다.
- 자바와의 상호 운용이 100% 지원된다.
2.1 간결한 문법
- 클래스의 getters, setters, equals(), hashCode(), toString() 과 copy()를 한 줄로 선언할 수 있다!
data class Customer(val name: String, val email: String, val company: String)
- 람다 식을 지원한다.
- 싱글톤 방식의 객체를 object로 만들 수 있다.
object ThisIsASingleton { val companyName: String = "JetBrains" }
- in과 Range문이 있다.
if (i in 1..10) { // equivalent of 1
- for문에도 쓸 수 있다!
for (i in 0..12 step 3) print("$i ") // 0 3 6 9 12 출력 for (i in 12 downTo 0 step 2) print("$i ") // 12 10 8 6 4 2 0 출력
- switch/case가 when ->으로 대체되었다. 위의 in과 Range도 쓸 수 있다.
when (x) { 0, 1 -> print("boolean") 2 -> print("콩\n콩") !in 1..9 step 2 -> print("홀수 아님") in 0..9 -> print("한자릿수") else -> print("otherwise") }
- is 연산자가 있다. 타입 체크, 자동 형변환 등이 가능하다.
npcContainer.forEach { npc -> if (npc is Visible) npc.drawBody(gc, g) // npc가 Visible형으로 자동 변환되었다. if (npc is Glowing) npc.drawGlow(gc, g) // npc가 Glowing형으로 자동 변환되었다. }
- when문에도 쓸 수 있다.
when (expr) { is Num -> expr.value // expr이 Num형으로 자동 변환되었다. is Sum -> eval(expr.left) + eval(expr.right) // expr이 Sum형으로 자동 변환되었다. else -> throw IllegalArgumentException("퉤에엣") }
- 변수 선언시 값에 if문을 사용할 수 있다.
val max = if (a > b) { print("Choose a") a } else { print("Choose b") b }
2.2 안전성
- Null 객체를 호출하는 경우를 알아서 보호해준다 한다. 자바에서 가져온 클래스 등도 가능하다.
- 변수명?를 사용하는 경우 변수 안의 메소드 (ex. length)를 실행할때 변수가 null이면 null을 반환한다.
b?.length() //b가 null이면 null 리턴
- 오류 방지로 null-safe 연산자를 쓸 수 있다. (ex. s as String?)
- 안전한 형변환 키워드인 as? 가 존재한다. (ex. s as? String)
2.3 그 외
- new 키워드는 선택이다.
- ;가 필요없다.
- System.out.println/printf등이 println/printf 등으로 줄었다.
- String에서 변수의 값을 쉽게 표현할 수 있는 interpolation($)을 지원한다.
val name: String = "Wikineet" val greet_en: String = "Hello, $name!" val greet_ko: String = "${name}님 안녕하세요!" println(greet_en) // 출력: Hello, Wikineet! println(greet_ko) // 출력: Wikineet님 안녕하세요!
- Nullable이 아닌 변수에서 null 사용시 오류를 뱉어낸다.
var a: String = "abc" a = null // 컴파일 에러
- ?을 사용해 Nullable로 만들어주면 쓸 수 있다.
var b: String? = "abc"
b = null // ok
- Elvis 연산자(?:)가 존재한다.
val testee_hometown: String? = null // 여기에 적절한 값을 넣으면 '' 대신 넣은 값이 표시된다. val hometown_display = testee_hometown ?: "" // testee_hometown이 null인지 검사한다. null이면 연산자의 우변에 있는 값이 대신 대입된다. println("이 장치는 ${hometown_display}에 사는 모든 사람의 신체 장기 가격과 소득 금액을 합친 것보다 더 비쌉니다.")
3 기타
- 간결한 언어라는 명성에 무색하게 다차원 배열의 선언은 전혀 간결하지 않다. 언어 개발자들도 이를 인지하고 있으며[5], 추후에 수정될 듯하다.