mir.pe (일반/어두운 화면)
최근 수정 시각 : 2024-10-07 16:05:32

Kotlin

코틀린에서 넘어옴

파일:나무위키+유도.png  
코틀린은(는) 여기로 연결됩니다.
이 단어의 다른 뜻에 대한 내용은 코틀린(동음이의어) 문서
번 문단을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
참고하십시오.
프로그래밍 사이트 선정 프로그래밍 언어 순위 목록
{{{#!wiki style="margin: 0 -10px -5px; word-break: keep-all"
{{{#!wiki style="display: inline-table; min-width: 25%; min-height: 2em;"
{{{#!folding [ IEEE Spectrum 2024 ]
{{{#!wiki style="margin: -5px 0"
<rowcolor=#fff> 스펙트럼 부문 상위 10개 프로그래밍 언어 직업 부문 상위 10개 프로그래밍 언어
1 Python 1 SQL
2 Java 2 Python
3 JavaScript 3 Java
4 C++ 4 TypeScript
5 TypeScript 5 SAS
6 SQL 6 JavaScript
7 C# 7 C#
8 Go 8 HTML
9 C 9 Shell
10 HTML 10 C++
}}}
}}}
}}}
[ Stack Overflow 2024 ]
[ TIOBE 2024 ]
||<tablewidth=100%><width=9999><-4><bgcolor=deepskyblue><tablebgcolor=#fff,#222> 2024년 8월 기준 검색어 점유율 상위 20개 프로그래밍 언어 ||
1 Python 11 MATLAB
2 C++ 12 Delphi / Object Pascal
3 C 13 PHP
4 Java 14 Rust
5 C# 15 Ruby
6 JavaScript 16 Swift
7 SQL 17 Assembly language
8 Visual Basic 18 Kotlin
9 Go 19 R
10 Fortran 20 Scratch
{{{#!wiki style="margin: 0 -10px -5px; min-height: calc(1.5em + 5px);"
{{{#!folding [ 21위 ~ 50위 펼치기 · 접기 ]
{{{#!wiki style="margin: -5px -1px -11px"
21 COBOL 36 Scala
22 Classic Visual Basic 37 Transact-SQL
23 LISP 38 PL/SQL
24 Prolog 39 ABAP
25 Perl 40 Solidity
26 (Visual) FoxPro 41 GAMS
27 SAS 42 PowerShell
28 Haskell 43 TypeScript
29 Dart 44 Logo
30 Ada 45 Wolfram
31 D 46 Awk
32 Julia 47 RPG
33 Objective-C 48 ML
34 VBScript 49 Bash
35 Lua 50 Elixir
}}}}}}}}} ||
[ PYPL 2024 ]

}}} ||
프로그래밍 언어 목록 · 분류 · 문법
코틀린
Kotlin
파일:Kotlin_2024.svg 파일:Kotlin_2024.svg
파일:홈페이지 아이콘.svg | 파일:X Corp 아이콘(블랙).svg | 파일:유튜브 아이콘.svg | | 파일:레딧 아이콘.svg

1. 개요2. 문법3. 특징
3.1. 간결한 문법3.2. 안전성3.3. 그 외
4. 통합 개발 환경5. 기타6. 관련 문서7. 외부 링크

[clearfix]
#!syntax kotlin
fun main() {
    println("Hello, World")
}

1. 개요



IntelliJ IDEA의 개발사 JetBrains에서 2011년에 공개한 오픈 소스 프로그래밍 언어. JVM 기반의 언어이며, Java와 유사하지만 더 간결한 문법과 다양한 기능을 추가하였다. Java와의 상호 운용이 100% 지원된다.[상호운용] JVM 바이트코드가 기본이지만, Kotlin/Native 컴파일러를 사용하여 기계어로 컴파일할 수 있다. 안드로이드, 스프링 프레임워크, Tomcat[2], JavaScript, Java EE, HTML5, iOS, 라즈베리 파이 등을 개발할 때 사용할 수 있다.

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

이름은 Kotlin 개발 당시 JetBrains의 R&D 센터가 위치했던 상트페테르부르크 근처의 코틀린(Ко́тлин) 섬에서 따왔다. Andrey Breslav(Андрей Бреслав)의 발표 참고 Java가 인도네시아의 섬이라는 것을 생각해보면 다분히 Java를 의식한 듯한 이름.

2. 문법

파일:상세 내용 아이콘.svg   자세한 내용은 Kotlin/문법 문서
번 문단을
부분을
참고하십시오.

3. 특징

// 1. 기본 companion object
// - Java에서는 Companion으로 노출
// - Kotlin에서는 static 메서드 처럼 사용할 수 있으며, 상속이 가능하다.
companion object { /* ... */ }

// 2. 이름이 지정된 companion object
// - Java에서는 지정된 이름으로 노출, 여기서는 Static으로 노출된다.
// - Kotlin에서는 static 메서드 처럼 사용할 수 있으며, 상속이 가능하다.
companion object Static { /* ... */ }

// cf. 이름이 지정된 object
// - Java에서는 지정된 이름으로 노출, 여기서는 Static으로 노출된다.
// - Kotlin에서는 하위 싱글톤 참조로 사용, 상속은 가능하다.
object Static { /* ... */ }

// cf. @JvmStatic annotation 사용
// - Java에서는 static으로 노출, 여기서는 public static int get()으로 노출된다.
// - 상속은 불가능하다.
@JvmStatic fun get(): Int
}}}

3.1. 간결한 문법

var isDone: Boolean = false // 필드: isDone이라는 필드의 값에 false가 대입된다.

val isDone: Boolean get() = false // 속성: isDone 참조 시 on-demand로 false 반환
}}} var isDone: Boolean = false // 필드: isDone이라는 필드의 값에 false가 대입, get은 public이다
private set // set는 private로 제한

internal var isDone: Boolean = false
internal get // 불필요한 코드, 필드와 getter의 접근 범위가 동일하다
internal set // 불필요한 코드, 필드와 setter의 접근 범위가 동일하다

internal var isDone: Boolean = false
private get // 오류, getter에는 필드와 동일한 접근 범위를 부여해야 한다.
public set // 오류, setter는 필드의 접근 범위를 넘을 수 없다.
}}} data class Customer(var name: String, var email: String, var company: String) // OK

data class Customer private constructor(var name: String, var email: String, var company: String) // 경고
}}} object ThisIsASingleton { // 싱글톤 개체 선언
val companyName: String = "JetBrains"
}

val callback = object : Callback { /* ... */ } // 인터페이스에서 익명 클래스 개체 생성

val adapter = object : Adapter() { /* ... */ } // 클래스에서 상속해 익명 클래스 개체 생성
}}}
\1.9 버전부터는 ..< 연산자로 until을 대신할 수 있다. 실제로는 until이 아닌 rangeUntil()을 호출하지만, 그 기능은 같다.
{{{#!syntax kotlin
if (i in 1..10) { // equivalent of 1.rangeTo(10)
println(i)
}

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 출력
}}} when (x) {
0, 1 -> print("boolean") // 0과 1이 여기에서 처리됨
2 -> print("콩\n콩") // 2가 여기에서 처리됨
!in 1..9 step 2 -> print("홀수 아님") // 4, 6, 8 처리, 0과 2는 여기에서 처리되지 않음
in 0..9 -> print("한자릿수") // 3, 5, 7, 9 처리, 1은 여기에서 처리되지 않음
else -> print("otherwise") // 나머지 숫자들 처리
}
}}} npcContainer.forEach { npc ->
if (npc is Visible) npc.drawBody(gc, g) // npc가 Visible형으로 자동 변환되었다.
if (npc is Glowing) npc.drawGlow(gc, g) // npc가 Glowing형으로 자동 변환되었다.
}

when (expr) {
is Num -> expr.value // expr이 Num형으로 자동 변환되었다.
is Sum -> eval(expr.left) + eval(expr.right) // expr이 Sum형으로 자동 변환되었다.
else -> throw IllegalArgumentException("퉤에엣")
}
}}} val max = if (a > b) {
print("Choose a")
a // a라는 값이 if 문에서 반환됨}else {
print("Choose b")
b // b라는 값이 else 문에서 반환됨}
}}}

3.2. 안전성

return b?.length // b가 null이면 null 리턴
}}} /*
null이거나 null은 아니지만 대상 타입으로 형변환될 수 없는 경우와 같은
형변환이 실패하는 모든 경우에 대해 안전하게 null을 반환해준다.
*/
null as? String // null
"string" as? File // null

/*
반면 as는 경우에 따라 kotlin.TypeCastException이나
java.lang.ClassCastException 예외를 발생시킬 수 있다
*/
null as File // kotlin.TypeCastException 예외 발생
null as File? // null
"string" as File // java.lang.ClassCastException 예외 발생
"string" as File? // java.lang.ClassCastException 예외 발생
}}}

3.3. 그 외

val name: String = "Wikineet"
val greet_en: String = "Hello, $name!"
val greet_ko: String = "${name}님 안녕하세요!"
println(greet_en) // 출력: Hello, Wikineet!
println(greet_ko) // 출력: Wikineet님 안녕하세요!
println("이름은 ${name.length}자이네요.") // 출력: 이름은 8자이네요.
println("소문자로는 ${name.lowercase()}이고요.") // 출력: 소문자로는 wikineet이고요.
}}} var a: String = "abc"
a = null // 컴파일 에러
var b: String = "abc"
b = null // OK
}}} val testee_hometown: String? = null // 여기에 적절한 값을 넣으면 '' 대신 넣은 값이 표시된다.
val hometown_display = testee_hometown ?: "" // testee_hometown이 null인지 검사한다. null이면 연산자의 우변에 있는 값이 대신 대입된다.
println("이 장치는 ${hometown_display}에 사는 모든 사람의 소득 금액을 합친 것보다 더 비쌉니다.")
val notNullRequired = testee_hometown
?: throw IllegalArgumentException() // testee_hometown이 null이면 예외 발생
}}}

4. 통합 개발 환경

JetBrains에서 개발하고 구글이 밀어주는 언어인 만큼 이쪽에 특화된 통합 개발 환경에서 주로 지원된다. 대표적인 것이 IntelliJ IDEA 안드로이드 스튜디오. 이클립스에서도 Kotlin 플러그인을 설치해 사용할 수 있다.

5. 기타

6. 관련 문서

7. 외부 링크


[상호운용] Kotlin에서 Java 코드를 사용할 때에는 그냥 사용할 수도 있는데다 사용법 역시 Kotlin에 맞춰 할 수 있다. 하지만 Java에서 Kotlin 코드를 사용할 때에는 @Jvm* 계열의 annotation을 사용해야 하는 등의 불편함이 있다. [2] JVM 환경에서도 돌아간다. [3] 이는 Java가 C언어의 객체 시스템이라고 할 수 있는 구조체 라이브러리를 기저기반으로 제작된 언어이기 때문이다. 물론 초기에나 그랬지 지금은 그 시절의 흔적을 크게 찾아볼 순 없지만... 문법에 그 흔적들이 아직 많이 남아있어 장황했던 것. [4] https://stackoverflow.com/questions/63339605/what-is-the-correct-way-to-do-bigdecimal-comparison [상호운용] [6] 같은 패키지 내에서만 접근 가능한 범위 [7] getter/setter 메서드와 public 필드 접근은 JVM이 동일한 바이트코드로 변환해주기 때문에 전혀 성능적인 차이가 없다. 물론, IDE에서 만들어주는 일반적인 getter/setter 가 아닌 추가적인 로직이 들어간 경우는 예외다. [8] '모든 것을 상속하는 객체'의 개념으로 이해하면 되는데, 메서드의 이름과 인자는 동일한데 반환형만 다르게 지정되는 등 충돌하는 구현이 존재할 수 밖에 없다. 당연히 이러한 객체는 이론상으로 존재할 수 없으며, 그러한 이유로 Nothing이 붙은 것이다. [9] ?는 편리한 기능임과 동시에 타입시스템 상의 논리적인 오류이기 때문에 타입 안정성에 극도로 공을 들이는 Scala 같은 언어에서 도입할 가능성은 없다. Scala 2에서 null에 대처하는 일반적인 방법은 단순한 빌트인 타입 중 하나일 뿐인 Option 타입이고, 언어 자체에 null 안정성과 관련된 기능은 없다. 하지만 Scala 3에서는 `-Yexplicit-nulls` 컴파일러 옵션으로 타입 위계를 완전히 바꾸어서 레퍼런스 타입이라도 기본적으로 nullable하지 않게 할 수 있다. 이 경우, Null이 가능하게 하려면 `String|Null` 로 타입을 지정해야 한다. 타입시스템에 논리적 오류를 도입하지 않으면서도 null 안정성을 얻은 연구 성과이다. [10] JetBrains에서 제작했다. [11] 이 기능은 IntelliJ IDEA를 기반으로 만들어진 IDE인 Android Studio에도 존재한다.