코틀린

(Kotlin에서 넘어옴)


[1]

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], 추후에 수정될 듯하다.

4 바깥 링크

  1. 정식 1.0 버전의 출시와 함께 바뀐 로고이다. 이전 로고는 알아서 찾아보길.
  2. JetBrain 홈페이지의 내용
  3. JVM 환경에서도 돌아간다.
  4. 실제로는 새 infix 함수를 생성하는 것으로 작동한다. 사칙연산 또한 infix 함수로 구현되어 'a * 3'으로도, 'a.times(3)'으로도 쓸 수 있다. 연산자와 연산자 오버로딩도 요 infix 힘수로 돌아간다.
  5. [1]