Kotlin이란 무엇입니까? Java 대안 설명

Kotlin은 객체 지향 및 기능 프로그래밍 기능을 결합한 JVM (Java Virtual Machine) 및 Android 용으로 설계된 범용 무료 오픈 소스 정적으로 유형이 지정된 '실용적인'프로그래밍 언어입니다. 상호 운용성, 안전성, 명확성 및 도구 지원에 중점을 둡니다. JavaScript ES5.1을 대상으로하는 Kotlin 버전과 여러 프로세서에 대한 네이티브 코드 (LLVM 사용)도 프로덕션에 있습니다.

Kotlin은 2010 년 IntelliJ IDEA의 배후 회사 인 JetBrains에서 시작되었으며 2012 년부터 오픈 소스였습니다. Kotlin 팀은 현재 JetBrains의 정규직 구성원 90 명 이상을 보유하고 있으며 GitHub의 Kotlin 프로젝트에는 300 명 이상의 기여자가 있습니다. JetBrains는 주력 제품인 IntelliJ IDEA를 비롯한 많은 제품에 Kotlin을 사용합니다.

보다 간결한 자바 언어로서의 Kotlin

언뜻보기에 Kotlin은보다 간결하고 간소화 된 Java 버전처럼 보입니다. Java 코드 샘플 (왼쪽)을 Kotlin으로 자동으로 변환 한 위의 스크린 샷을 고려하십시오. Java 변수 인스턴스화에 내재 된 무의미한 반복이 사라졌습니다. 자바 관용구

StringBuilder sb = 새로운 StringBuilder ();

Kotlin이 됨

val sb = StringBuilder ()

함수가 fun키워드 로 정의되어 있고 개행 문자가있을 때 세미콜론이 이제 선택 사항임을 알 수 있습니다 . val키워드는 읽기 전용 속성 또는 로컬 변수를 선언합니다. 마찬가지로 var키워드는 변경 가능한 속성 또는 지역 변수를 선언합니다.

그럼에도 불구하고 Kotlin은 강력한 유형입니다. valvar유형을 유추 할 수있을 때 키워드는 사용할 수 있습니다. 그렇지 않으면 유형을 선언해야합니다. 유형 추론은 Kotlin이 출시 될 때마다 개선되는 것 같습니다.

두 창 위쪽에있는 함수 선언을 살펴보십시오. Java의 반환 유형은 프로토 타입보다 우선하지만 Kotlin에서는 Pascal 에서처럼 콜론으로 구분 된 프로토 타입을 이어받습니다.

이 예에서 완전히 명확하지는 않지만 Kotlin은 함수가 클래스 멤버라는 Java의 요구 사항을 완화했습니다. Kotlin에서 함수는 파일의 최상위 수준에서, 로컬로 다른 함수 내에서, 클래스 또는 객체 내의 멤버 함수로, 확장 함수로 선언 될 수 있습니다. 확장 함수는 클래스에서 상속하거나 Decorator와 같은 모든 유형의 디자인 패턴을 사용하지 않고도 새로운 기능으로 클래스를 확장 할 수있는 C #과 유사한 기능을 제공합니다.

Groovy 팬을 위해 Kotlin은 빌더를 구현합니다. 실제로 Kotlin 빌더는 유형을 확인할 수 있습니다. Kotlin은 지연 속성, 관찰 가능한 속성, 거부 가능한 속성, 매핑 된 속성을 구현하는 데 사용할 수있는 위임 된 속성을 지원합니다.

다른 언어로 제공되는 많은 비동기 메커니즘은 Kotlin 코 루틴을 사용하여 라이브러리로 구현할 수 있습니다. 여기에는 async/ awaitC #과 ECMAScript를, 채널에서하고 이동에서 선택하고 generators/ yieldC # 및 파이썬에서.

Kotlin의 함수형 프로그래밍

최상위 함수를 허용하는 것은 Kotlin의 함수형 프로그래밍 이야기의 시작에 불과합니다. 이 언어는 또한 고차 함수, 익명 함수, 람다, 인라인 함수, 클로저, 테일 재귀 및 제네릭을 지원합니다. 즉, Kotlin에는 기능적 언어의 모든 기능과 장점이 있습니다. 예를 들어 다음과 같은 기능적 Kotlin 관용구를 고려하십시오.

Kotlin에서 목록 필터링

val 긍정 = list.filter {x-> x> 0}

더 짧은 표현식의 it경우 람다 함수에 매개 변수가 하나만있을 때 사용 합니다.

val 긍정 = list.filter {it> 0}

Kotlin에서지도 / 쌍 목록 탐색

for ((k, v) in map) {println ( "$ k-> $ v")}

k그리고  v 아무것도 호출 할 수 있습니다.

Kotlin에서 범위 사용

for (i in  1..100) {...} // 닫힌 범위 : 100 포함

for (i in  1 ~ 100) {...} // 반 개방 범위 : 100을 포함하지 않음

for (  2..10 2 단계의 x ) {...}

for (x in  10 downTo 1) {...}

if (  1..10의 x ) {...}

위의 예는 for 키워드와 범위 사용을 보여줍니다  .

Kotlin은 완전한 기능적 프로그래밍 언어이지만 Java의 객체 지향 특성 대부분을 대체 프로그래밍 스타일로 유지하므로 기존 Java 코드를 변환 할 때 매우 편리합니다. 코 틀린는 중첩 된 내부 및 익명의 내부 클래스와 함께, 생성자와 클래스를 가지고 있으며, 자바 (8) 코 틀린는 않습니다처럼이 인터페이스가 없습니다new키워드를. 클래스 인스턴스를 만들려면 일반 함수처럼 생성자를 호출합니다. 위의 스크린 샷에서 확인했습니다.

Kotlin에는 이름이 지정된 슈퍼 클래스에서 단일 상속이 있으며 모든 Kotlin 클래스에는 기본 슈퍼 클래스가 Any있으며 이는 자바 기본 클래스와 동일 하지 않습니다java.lang.Object . Any세 개의 미리 정의 된 멤버 함수가 포함되어 있습니다 equals(), hashCode()하고 toString().

Kotlin 클래스는 open다른 클래스에서 상속 할 수 있도록 키워드 로 표시되어야 합니다. Java 클래스는 키워드 로 표시 되지 않는 한 상속 가능하기 때문에 반대 final입니다. 슈퍼 클래스 메서드를 재정의하려면 메서드 자체를으로 표시 open하고 하위 클래스 메서드를으로 표시해야합니다 override. 이것은 기본값에 의존하지 않고 사물을 명시 적으로 만드는 Kotlin의 철학을 담고있는 부분입니다. 이 특별한 경우에는 Kotlin의 기본 클래스 멤버를 상속을 위해 개방 된 것으로 명시 적으로 표시하고 파생 클래스 멤버를 재정의로 명시 적으로 표시하는 방법이 여러 종류의 일반적인 Java 오류를 피할 수 있음을 알 수 있습니다.

Kotlin의 안전 기능

일반적인 오류를 방지하기 위해 Kotlin은 null 포인터 참조의 위험을 제거하고 null 값 처리를 간소화하도록 설계되었습니다. null표준 유형에 대해 불법을 만들고 , nullable 유형을 추가하고, null 테스트를 처리하는 바로 가기 표기법을 구현하여이를 수행합니다.

예를 들어 유형의 일반 변수는  다음을 보유 할 수 없습니다  .String null

var a : String = "abc"

a = null // 컴파일 오류

예를 들어 SQL 쿼리 결과를 보관하기 위해 널을 허용해야하는 경우 유형에 물음표를 추가하여 널 허용 유형을 선언 할 수 있습니다 (예 : String?.

var  b : 문자열?

b = null  // 좋아요

보호는 조금 더 나아갑니다. nullable이 아닌 형식을 면책과 함께 사용할 수 있지만 사용하기 전에 null 값에 대해 nullable 형식을 테스트해야합니다.

null 테스트에 일반적으로 필요한 자세한 문법을 ​​피하기 위해 Kotlin은 작성된 안전한 호출을 도입합니다 ?.. 예를 들어, 반환 하면 되지 , 그리고 그렇지. 이 표현식의 유형은입니다 .b?.length b.lengthbnullnullInt?

즉, b?.lengthif (b != null) b.length else null. 이 구문은 멋지게 연결되어 많은 prolix 로직을 제거합니다. 특히 객체가 일련의 데이터베이스 쿼리에서 채워 졌을 때, 그중 하나라도 실패했을 수 있습니다. 예를 들어 bob?.department?.head?.nameBob, 부서 및 부서장이 모두 null이 아닌 경우 Bob의 부서장 이름을 반환합니다.

null이 아닌 값에 대해서만 특정 작업을 수행하려면 다음 ?.과 함께  안전한 호출 연산자를 사용할 수 있습니다 let.

val listWithNulls : List = listOf ( "A", null)

for (listWithNulls의 항목) {

      item? .let {println (it)} // A를 인쇄하고 null을 무시}

일반적으로 nullable이 아닌 형식에 저장할 수 있도록 nullable 식에서 유효하지만 특수한 값을 반환하려고합니다. Elvis 연산자라는 특수 구문이 ?:있습니다.

val l = b? .length? : -1

다음과 같습니다. 

val l : Int = if (b! = null) b.length else -1

같은 맥락에서 Kotlin은 포착 해야하는 throw 가능한 조건 인 자바의 확인 된 예외를 생략 합니다 . 예를 들어, JDK 서명

추가 가능한 append (CharSequence csq)가  IOException을 발생시킵니다.

메서드 IOException를 호출 할 때마다 잡아야 합니다 append.

{

  log.append (메시지)

}

catch (IOException e) {

  // 예외가있는 작업

}

자바 설계자들은 이것이 좋은 아이디어라고 생각했고, 프로그래머가 catch절 에서 합리적인 것을 구현하는 한 장난감 프로그램의 순이익이었다 . 그러나 큰 Java 프로그램에서는 너무 자주 필수 catch절에 주석 만 포함 된 코드가 표시 //todo: handle this됩니다.. 이것은 누구에게도 도움이되지 않으며 확인 된 예외는 대규모 프로그램의 순 손실로 판명되었습니다.

Kotlin 코 루틴

Kotlin의 코 루틴은 기본적으로 경량 스레드입니다. launch일부 컨텍스트에서 코 루틴 빌더로 시작합니다 CoroutineScope. 가장 유용한 코 루틴 범위 중 하나는 runBlocking{}코드 블록의 범위에 적용되는입니다.

import kotlinx.coroutines. *

fun main () = runBlocking {// this : CoroutineScope

    launch {// runBlocking 범위에서 새 코 루틴을 시작합니다.

        delay (1000L) // 1 초 동안 비 차단 지연

        println ( "세계!")

    }

    println ( "안녕하세요")

}

이 코드는 줄 사이에 1 초의 지연이있는 다음 출력을 생성합니다.

여보세요,

세계!

Android 용 Kotlin

2017 년 5 월까지 공식적으로 지원되는 Android 용 프로그래밍 언어는 Java와 C ++뿐이었습니다. Google은 Google I / O 2017에서 Android 용 Kotlin에 대한 공식 지원을 발표했으며 Android Studio 3.0부터 Kotlin이 Android 개발 도구 세트에 내장되어 있습니다. 플러그인을 사용하여 이전 버전의 Android 스튜디오에 Kotlin을 추가 할 수 있습니다.

Kotlin은 자바와 동일한 바이트 코드로 컴파일되고 자연스러운 방식으로 자바 클래스와 상호 운용되며 도구를 자바와 공유합니다. Kotlin과 Java간에 호출하는 데 오버 헤드가 없기 때문에 현재 Java로 된 Android 앱에 Kotlin을 점진적으로 추가하는 것이 좋습니다. Java set-only 속성과 같이 Kotlin과 Java 코드 간의 상호 운용성이 부족한 몇 가지 경우는 거의 발생하지 않으며 쉽게 수정할 수 있습니다.

Pinterest는 빠르면 2016 년 11 월에 Kotlin으로 작성된 Android 앱의 포스터 차일드였으며 Kotlin 발표의 일환으로 Google I / O 2017에서 눈에 띄게 언급되었습니다. 또한 Kotlin 팀은 Android 용 Evernote, Trello, Square 및 Coursera 앱을 인용하는 것을 좋아합니다.

Kotlin과 자바

새로운 개발을 위해 Kotlin 또는 Java를 선택할지 여부에 대한 질문은 Google I / O 발표 이후 Android 커뮤니티에서 많이 떠오르고 있지만 사람들은 Kotlin 1.0이 출시 된 2016 년 2 월에 이미 질문을하고있었습니다. 짧은 대답은 Kotlin 코드가 자바 코드보다 더 안전하고 간결하며 Kotlin과 자바 파일이 Android 앱에 공존 할 수 있으므로 Kotlin은 새로운 앱뿐만 아니라 기존 자바 앱 확장에도 유용하다는 것입니다.

Kotlin보다 Java를 선택한 것에 대해 내가 본 유일한 주장은 완전한 Android 개발 초보자의 경우 일 것입니다. 그들에게는 역사적으로 대부분의 Android 문서와 예제가 Java로되어 있다는 점을 감안할 때 극복 할 수있는 장벽이있을 수 있습니다. 반면에 Android Studio에서 Java를 Kotlin으로 변환하는 것은 Java 코드를 Kotlin 파일에 붙여 넣기 만하면됩니다.

Android 개발을 수행하는 거의 모든 사람들에게 Kotlin의 장점은 강력합니다. Java 개발자가 Kotlin을 배우는 데 걸리는 일반적인 시간은 몇 시간입니다. 이는 null 참조 오류를 제거하고, 확장 기능을 활성화하고, 함수형 프로그래밍을 지원하고, 코 루틴을 추가하는 데 지불하는 적은 비용입니다. 일반적인 대략적인 추정치는 Java에서 Kotlin까지 코드 줄 수가 약 40 % 감소했음을 나타냅니다.