"코틀린"의 두 판 사이의 차이

위키원
이동: 둘러보기, 검색
(새 문서: == 소개 == 코틀린(Kotlin)이란 IntelliJ IDEA의 개발사 JetBrains에서 2011년에 공개한 프로그래밍 언어이다. 간결한 문법을 가지고 있고,...)
 
잔글
1번째 줄: 1번째 줄:
 
== 소개 ==
 
== 소개 ==
  
코틀린(Kotlin)이란 [[IntelliJ IDEA]]의 개발사 [[JetBrains]]에서 2011년에 공개한 [[프로그래밍 언어]]이다. 간결한 문법을 가지고 있고, 세미콜론은 옵션이다. [[JVM]] 기반의 언어이며, [[Java]]와의 상호 운용이 100% 지원된다. JVM [[바이트코드]]가 기본이지만, Kotlin/Native [[컴파일러]]를 사용하여 기계어로 최종컴파일이 가능하다. [[안드로이드]], [[스프링 프레임워크]], [[톰캣]], [[JavaScript]], [[Java EE]], [[HTML5]], [[iOS]], [[라즈베리 파이]] 등을 개발할 때 사용할 수 있다.
+
코틀린(Kotlin)이란 [[IntelliJ IDEA]]의 개발사 [[JetBrains]]에서 2011년에 공개한 [[프로그래밍 언어]]이다. 간결한 문법을 가지고 있고, 세미콜론은 옵션이다. [[JVM]] 기반의 언어이며, [[Java]]와의 상호 운용이 100% 지원된다. JVM [[바이트코드]]가 기본이지만, Kotlin/Native [[컴파일러]]를 사용하여 기계어로 최종컴파일이 된다. [[안드로이드]], [[스프링 프레임워크]], [[톰캣]], [[JavaScript]], [[Java EE]], [[HTML5]], [[iOS]], [[라즈베리 파이]] 등을 개발할 때 사용 가능하다.
  
현재 최신 버전은 1.3.31.
+
현재 최신 버전은 1.3.31
  
2017년에 [[구글]]이 [[안드로이드]]의 공식 언어로 코틀린을 추가하였다. 이는 [[오라클]]과의 Java API 저작권 분쟁의 여파로 보는 시각이 많다. 2018년 [[카카오]]가 [[카카오톡]] 메시징 서버에 코틀린을 사용해 본 결과, 코드량이 비약적으로 감소하고 생산성이 대폭 향상되었다고 한다. 2019년 1월부터는 구글 내부의 안드로이드 프로젝트에서도 Java 대신 코틀린을 사용한다.
+
2017년에 [[구글]]이 [[안드로이드]]의 공식 언어로 코틀린을 추가하였다. 이는 [[오라클]]과의 Java API 저작권 분쟁의 여파로 보는 시각이 많다. 2018년 [[카카오]]가 [[카카오톡]] 메시징 서버에 코틀린을 사용해 본 결과, 코드량이 비약적으로 감소하고 생산성이 대폭 상승했다고 한다. 2019년 1월부터는 구글 내부의 안드로이드 프로젝트에서도 Java 대신 코틀린을 사용 가능하다.
  
 
== 특징 ==
 
== 특징 ==
  
 
* java와 비교하면 확연히 차이나는 간결한 문법을 제공한다.간결한 문법을 제공하면서도 런타임 오버헤드가 거의 없다.
 
* java와 비교하면 확연히 차이나는 간결한 문법을 제공한다.간결한 문법을 제공하면서도 런타임 오버헤드가 거의 없다.
* 오버헤드 없는 널 안전성을 제공한다. Kotlin의 변수는 Nullable(널 값 사용 가능)과 NotNull(널 값 사용 불가)로 나뉘는데, 변수 선언 시 '?'를 붙여 Nullable로 만들 수 있다. Swift에서도 유사한 기능을 쓰는데 Kotlin 쪽이 제약이 좀 덜해서 사용하기 편하다.
+
* 오버헤드 없는 널 안전성을 제공한다. Kotlin의 변수는 Nullable(널 값 사용 가능)과 NotNull(널 값 사용 불가)로 나뉘는데, 변수 선언 시 '?'를 붙여 Nullable로 만든다. Swift에서도 유사한 기능을 쓰는데 Kotlin 쪽이 제약이 좀 덜해서 사용하기 편하다.
 
* 예외처리를 강제하지 않는다.
 
* 예외처리를 강제하지 않는다.
 
* 모든 함수가 리턴값을 가진다.
 
* 모든 함수가 리턴값을 가진다.
* Java의 'Integer'나 'Double'처럼 primitive type을 위한 별도의 wrapper class가 존재하지 않는다. 모든 primitive type은 객체 취급을 받는다. 따라서 Int 따위의 변수는 객체에 할당된 toString 함수 등을 바로바로 이용할 수 있다.
+
* Java의 'Integer'나 'Double'처럼 primitive type을 위한 별도의 wrapper class가 존재하지 않는다. 모든 primitive type은 객체 취급을 받는다. 따라서 Int 따위의 변수는 객체에 할당된 toString 함수 등을 바로바로 이용 가능하다.
* 확장함수, 연산자 오버로딩을 지원한다.
+
* 확장함수, 연산자 오버로딩을 지원 가능하다.
예를 들어 int형을 확장해 'i = 3 power 4' 같은 식으로 새 연산자를 만들 수 있다.
+
예를 들어 int형을 확장해 'i = 3 power 4' 같은 식으로 새 연산자를 만든다.
* API 문서에 Java의 HTML 대신 Markdown을 사용한다.
+
* API 문서에 Java의 HTML 대신 Markdown을 사용 가능하다.
* 연산자가 생각하는 대로 작동한다.
+
* 연산자가 생각하는 대로 작동 가능하다.
* static 메서드가 없다. companion object를 사용해 감싸야 한다. Java 코드에서 접근하려면 '클래스명.Companion.메서드_혹은_get변수명()' 또는 @JvmStatic annotation을 쓰면 된다.
+
* static 메서드가 없다. companion object를 사용해 감싸야 한다. Java 코드에서 접근하려면 '클래스명.Companion.메서드_혹은_get변수명()' 또는 @JvmStatic annotation을 쓰면 가능하다.
* Java 6에 호환된다.
+
* Java 6에 호환 가능하다.
* Java와의 상호 운용이 100% 지원된다.
+
* Java와의 상호 운용이 100% 지원 가능하다.
  
 
=== 간결한 문법 ===
 
=== 간결한 문법 ===
  
* 클래스의 getters, setters, equals(), hashCode(), toString()과 copy()를 한 줄로 선언이 가능하다. 변수(var) 및 상수(val)로 지정된 생성자 패러미터는 클래스의 멤버 변수/상수로 동작한다.
+
* 클래스의 getters, setters, equals(), hashCode(), toString()과 copy()를 한 줄로 선언이 된다. 변수(var) 및 상수(val)로 지정된 생성자 패러미터는 클래스의 멤버 변수/상수로 동작한다.
 
     data class Customer(var name: String, var email: String, var company: String)
 
     data class Customer(var name: String, var email: String, var company: String)
 
* 람다 식을 지원한다.
 
* 람다 식을 지원한다.
* 싱글톤 방식의 개체를 object로 만들 수 있다.
+
* 싱글톤 방식의 개체를 object로 만든다.
 
     object ThisIsASingleton {
 
     object ThisIsASingleton {
 
     val companyName: String = "JetBrains"
 
     val companyName: String = "JetBrains"
35번째 줄: 35번째 줄:
 
       println(i)
 
       println(i)
 
   }
 
   }
* for문에도 쓸 수 있다!
+
* for문에도 된다.
 
   for (i in 0..12 step 3) print("$i ") // 0 3 6 9 12 출력
 
   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 출력
 
   for (i in 12 downTo 0 step 2) print("$i ") // 12 10 8 6 4 2 0 출력
46번째 줄: 46번째 줄:
 
       else -> print("otherwise")
 
       else -> print("otherwise")
 
   }
 
   }
* is 연산자가 있다. 타입 체크, 자동 형변환 등이 가능하다.
+
* is 연산자가 있다. 타입 체크, 자동 형변환 등이 된다.
 
   npcContainer.forEach { npc ->
 
   npcContainer.forEach { npc ->
 
       if (npc is Visible) npc.drawBody(gc, g) // npc가 Visible형으로 자동 변환되었다.
 
       if (npc is Visible) npc.drawBody(gc, g) // npc가 Visible형으로 자동 변환되었다.
 
       if (npc is Glowing) npc.drawGlow(gc, g) // npc가 Glowing형으로 자동 변환되었다.
 
       if (npc is Glowing) npc.drawGlow(gc, g) // npc가 Glowing형으로 자동 변환되었다.
 
   }
 
   }
* when문에도 쓸 수 있다.
+
* when문에도 써진다.
 
   when (expr) {
 
   when (expr) {
       is Num -> expr.value // expr이 Num형으로 자동 변환되었다.
+
       is Num -> expr.value // expr이 Num형으로 변환되었다.
       is Sum -> eval(expr.left) + eval(expr.right) // expr이 Sum형으로 자동 변환되었다.
+
       is Sum -> eval(expr.left) + eval(expr.right) // expr이 Sum형으로 변환되었다.
 
       else -> throw IllegalArgumentException("퉤에엣")
 
       else -> throw IllegalArgumentException("퉤에엣")
 
   }
 
   }
* if문이 표현식으로 동작한다.
+
* if문 동작이 표현식이다.
 
   val max = if (a > b) {  
 
   val max = if (a > b) {  
 
       print("Choose a")  
 
       print("Choose a")  
67번째 줄: 67번째 줄:
 
       }
 
       }
 
* 세미콜론이 필요없다.
 
* 세미콜론이 필요없다.
* System.out.println/printf -> println/printf 등으로 줄었다.
+
* System.out.println/printf -> println/printf 등으로 줄였다.
  
 
== 관련문서 ==
 
== 관련문서 ==

2019년 6월 25일 (화) 15:16 판

소개

코틀린(Kotlin)이란 IntelliJ IDEA의 개발사 JetBrains에서 2011년에 공개한 프로그래밍 언어이다. 간결한 문법을 가지고 있고, 세미콜론은 옵션이다. JVM 기반의 언어이며, Java와의 상호 운용이 100% 지원된다. JVM 바이트코드가 기본이지만, Kotlin/Native 컴파일러를 사용하여 기계어로 최종컴파일이 된다. 안드로이드, 스프링 프레임워크, 톰캣, JavaScript, Java EE, HTML5, iOS, 라즈베리 파이 등을 개발할 때 사용 가능하다.

현재 최신 버전은 1.3.31

2017년에 구글안드로이드의 공식 언어로 코틀린을 추가하였다. 이는 오라클과의 Java API 저작권 분쟁의 여파로 보는 시각이 많다. 2018년 카카오카카오톡 메시징 서버에 코틀린을 사용해 본 결과, 코드량이 비약적으로 감소하고 생산성이 대폭 상승했다고 한다. 2019년 1월부터는 구글 내부의 안드로이드 프로젝트에서도 Java 대신 코틀린을 사용 가능하다.

특징

  • java와 비교하면 확연히 차이나는 간결한 문법을 제공한다.간결한 문법을 제공하면서도 런타임 오버헤드가 거의 없다.
  • 오버헤드 없는 널 안전성을 제공한다. Kotlin의 변수는 Nullable(널 값 사용 가능)과 NotNull(널 값 사용 불가)로 나뉘는데, 변수 선언 시 '?'를 붙여 Nullable로 만든다. Swift에서도 유사한 기능을 쓰는데 Kotlin 쪽이 제약이 좀 덜해서 사용하기 편하다.
  • 예외처리를 강제하지 않는다.
  • 모든 함수가 리턴값을 가진다.
  • Java의 'Integer'나 'Double'처럼 primitive type을 위한 별도의 wrapper class가 존재하지 않는다. 모든 primitive type은 객체 취급을 받는다. 따라서 Int 따위의 변수는 객체에 할당된 toString 함수 등을 바로바로 이용 가능하다.
  • 확장함수, 연산자 오버로딩을 지원 가능하다.

예를 들어 int형을 확장해 'i = 3 power 4' 같은 식으로 새 연산자를 만든다.

  • API 문서에 Java의 HTML 대신 Markdown을 사용 가능하다.
  • 연산자가 생각하는 대로 작동 가능하다.
  • static 메서드가 없다. companion object를 사용해 감싸야 한다. Java 코드에서 접근하려면 '클래스명.Companion.메서드_혹은_get변수명()' 또는 @JvmStatic annotation을 쓰면 가능하다.
  • Java 6에 호환 가능하다.
  • Java와의 상호 운용이 100% 지원 가능하다.

간결한 문법

  • 클래스의 getters, setters, equals(), hashCode(), toString()과 copy()를 한 줄로 선언이 된다. 변수(var) 및 상수(val)로 지정된 생성자 패러미터는 클래스의 멤버 변수/상수로 동작한다.
   data class Customer(var name: String, var email: String, var company: String)
  • 람다 식을 지원한다.
  • 싱글톤 방식의 개체를 object로 만든다.
   object ThisIsASingleton {
   val companyName: String = "JetBrains"
   }
  • in과 Range문이 있다.
  if (i in 1..10) { // equivalent of 1 
      println(i)
  }
  • 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 
      }
  • 세미콜론이 필요없다.
  • System.out.println/printf -> println/printf 등으로 줄였다.

관련문서