나무모에 미러 (일반/어두운 화면)
최근 수정 시각 : 2025-03-07 19:45:11

Kotlin

코틀린에서 넘어옴

파일:다른 뜻 아이콘.svg  
코틀린
,
,
,
,
,
,
,
,
,
은(는) 여기로 연결됩니다.
다른 뜻에 대한 내용은 아래 문서를
이 단어의 다른 뜻에 대한 내용은 코틀린(동음이의어) 문서
번 문단을
부분을
, 에 대한 내용은 문서
번 문단을
부분을
, 에 대한 내용은 문서
번 문단을
부분을
, 에 대한 내용은 문서
번 문단을
부분을
, 에 대한 내용은 문서
번 문단을
부분을
, 에 대한 내용은 문서
번 문단을
부분을
, 에 대한 내용은 문서
번 문단을
부분을
, 에 대한 내용은 문서
번 문단을
부분을
, 에 대한 내용은 문서
번 문단을
부분을
, 에 대한 내용은 문서
번 문단을
부분을
다른 뜻에 대한 내용은 아래 문서를
참고하십시오.

*
이 단어의 다른 뜻:
코틀린(동음이의어)
문서의 번 문단
문서의 부분
*
:
문서의 번 문단
문서의 부분
*
:
문서의 번 문단
문서의 부분
*
:
문서의 번 문단
문서의 부분
*
:
문서의 번 문단
문서의 부분
*
:
문서의 번 문단
문서의 부분
*
:
문서의 번 문단
문서의 부분
*
:
문서의 번 문단
문서의 부분
*
:
문서의 번 문단
문서의 부분
*
:
문서의 번 문단
문서의 부분

프로그래밍 사이트 선정 프로그래밍 언어 순위 목록
{{{#!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 ]
||<tablewidth=100%><width=9999><-4><bgcolor=#FFA500><tablebgcolor=#fff,#1c1d1f> 2024년 Stackoverflow 설문조사 기준 인기 상위 25개 프로그래밍 언어 ||
1 JavaScript 14 Rust
2 HTML, CSS 15 Kotlin
3 Python 16 Lua
4 SQL 17 Dart
5 TypeScript 18 어셈블리어
6 Bash 19 Ruby
7 Java 20 Swift
8 C# 21 R
9 C++ 22 Visual Basic
10 C 23 MATLAB
11 PHP 24 VBA
12 PowerShell 25 Groovy
13 Go
[ TIOBE 2025 ]
||<tablewidth=100%><width=9999><-4><bgcolor=deepskyblue><tablebgcolor=#fff,#1c1d1f> 2025년 2월 기준 검색어 점유율 상위 20개 프로그래밍 언어 ||
1 Python 11 Fortran
2 C++ 12 Scratch
3 Java 13 Rust
4 C 14 PHP
5 C# 15 R
6 JavaScript 16 MATLAB
7 SQL 17 Assembly language
8 Go 18 COBOL
9 Delphi / Object Pascal 19 Ruby
10 Visual Basic 20 Prolog
{{{#!wiki style="margin: 0 -10px -5px; min-height: calc(1.5em + 5px);"
{{{#!folding [ 21위 ~ 50위 펼치기 · 접기 ]
{{{#!wiki style="margin: -5px -1px -11px"
21 Swift 36 VBScript
22 Classic Visual Basic 37 PL/SQL
23 Kotlin 38 TypeScript
24 Ada 39 GAMS
25 SAS 40 Solidity
26 LISP 41 ABAP
27 Haskell 42 Logo
28 Dart 43 D
29 (Visual) FoxPro 44 Bash
30 Perl 45 PowerShell
31 Scala 46 Elixir
32 Lua 47 RPG
33 Objective-C 48 ML
34 Julia 49 Ladder Logic
35 Transact-SQL 50 Awk
}}}}}}}}} ||
[ PYPL 2025 ]
||<tablewidth=100%><width=9999><-4><bgcolor=green><tablebgcolor=#fff,#1c1d1f> 2025년 3월 기준 검색어 점유율 상위 20개 프로그래밍 언어 ||
1 Python 11 Swift
2 Java 12 Go
3 JavaScript 13 Kotlin
4 C/C++ 14 MATLAB
5 C# 15 Ada
6 R 16 Dart
7 PHP 17 Ruby
8 Rust 18 Lua
9 TypeScript 19 PowerShell
10 Objective-C 20 VBA

}}} ||
프로그래밍 언어 목록 · 분류 · 문법
코틀린
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를 사용하면 JVM 없이 기계어로 컴파일할 수 있으며, 이를 통해 임베디드 시스템 등 다양한 플랫폼에서 Kotlin을 사용할 수 있다. 안드로이드, 스프링 프레임워크, Tomcat[2], JavaScript, Jakarta EE, Kotlin/JS를 통한 HTML5, iOS, 라즈베리 파이 등을 개발할 때 사용할 수 있다.

2017년에 구글안드로이드의 공식 언어로 Kotlin을 추가하였다. 이는 오라클과의 Java API 저작권 분쟁의 여파로 보는 시각이 많다. 2018년 카카오카카오톡 메시징 서버에 Kotlin을 사용해 본 결과, 코드양이 비약적으로 감소하고 생산성이 대폭 향상되었다고 한다. # 2019년 1월부터 구글은 내부 안드로이드 프로젝트에서 Kotlin을 우선 언어로 사용하기 시작했으며, 기존 Java 프로젝트도 계속 유지되고 있다. # 안드로이드 공식 문서의 샘플 코드도 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) // 경고

@ConsistentCopyVisibility // copy의 접근 제한자도 생성자와 같은 private로 설정
data class Customer private constructor(var name: String, var email: String, var company: String) // OK (Kotlin 2.0.20~)
}}}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] copy는 기본적으로 public인데, 생성자가 public이 아닌 경우에도 생성자처럼 쓸 수 있는 copy를 노출하는 문제가 있다. 따라서 향후 생성자와 동일한 접근 제한을 가지도록 바뀔 예정이다. Kotlin 2.0.20부터는 @ConsistentCopyVisibility(새 동작)나 @ExposedCopyVisiblity(기존 동작) 어노테이션을 추가하지 않으면 컴파일 경고가 발생한다. #[9] '모든 것을 상속하는 객체'의 개념으로 이해하면 되는데, 메서드의 이름과 인자는 동일한데 반환형만 다르게 지정되는 등 충돌하는 구현이 존재할 수밖에 없다. 당연히 이러한 객체는 이론상으로 존재할 수 없으며, 그러한 이유로 Nothing이 붙은 것이다.[10] ?는 편리한 기능임과 동시에 타입 시스템상의 논리적인 오류이기 때문에 타입 안정성에 극도로 공을 들이는 Scala 같은 언어에서 도입할 가능성은 없다. Scala 2에서 null에 대처하는 일반적인 방법은 단순한 빌트인 타입 중 하나일 뿐인 Option 타입이고, 언어 자체에 null 안정성과 관련된 기능은 없다. 하지만 Scala 3에서는 `-Yexplicit-nulls` 컴파일러 옵션으로 타입 위계를 완전히 바꾸어서 레퍼런스 타입이라도 기본적으로 nullable하지 않게 할 수 있다. 이 경우, Null이 가능하게 하려면 `String|Null` 로 타입을 지정해야 한다. 타입 시스템에 논리적 오류를 도입하지 않으면서도 null 안정성을 얻은 연구 성과이다.[11] JetBrains에서 제작했다.[12] 이 기능은 IntelliJ IDEA를 기반으로 만들어진 IDE인 Android Studio에도 존재한다.