나무모에 미러 (일반/밝은 화면)
최근 수정 시각 : 2025-12-20 03:10:11

Kotlin


파일:다른 뜻 아이콘.svg  
#!if 넘어옴1 != null
'''코틀린'''{{{#!if 넘어옴2 == null
{{{#!if 넘어옴1[넘어옴1.length - 1] >= 0xAC00 && 넘어옴1[넘어옴1.length - 1] <= 0xD7A3
{{{#!if ((넘어옴1[넘어옴1.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴1[넘어옴1.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴1[넘어옴1.length - 1] < 0xAC00 || 넘어옴1[넘어옴1.length - 1] > 0xD7A3
은(는)}}}}}}{{{#!if 넘어옴2 != null
, ''''''{{{#!if 넘어옴3 == null
{{{#!if 넘어옴2[넘어옴2.length - 1] >= 0xAC00 && 넘어옴2[넘어옴2.length - 1] <= 0xD7A3
{{{#!if ((넘어옴2[넘어옴2.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴2[넘어옴2.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴2[넘어옴2.length - 1] < 0xAC00 || 넘어옴2[넘어옴2.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴3 != null
, ''''''{{{#!if 넘어옴4 == null
{{{#!if 넘어옴3[넘어옴3.length - 1] >= 0xAC00 && 넘어옴3[넘어옴3.length - 1] <= 0xD7A3
{{{#!if ((넘어옴3[넘어옴3.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴3[넘어옴3.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴3[넘어옴3.length - 1] < 0xAC00 || 넘어옴3[넘어옴3.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴4 != null
, ''''''{{{#!if 넘어옴5 == null
{{{#!if 넘어옴4[넘어옴4.length - 1] >= 0xAC00 && 넘어옴4[넘어옴4.length - 1] <= 0xD7A3
{{{#!if ((넘어옴4[넘어옴4.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴4[넘어옴4.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴4[넘어옴4.length - 1] < 0xAC00 || 넘어옴4[넘어옴4.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴5 != null
, ''''''{{{#!if 넘어옴6 == null
{{{#!if 넘어옴5[넘어옴5.length - 1] >= 0xAC00 && 넘어옴5[넘어옴5.length - 1] <= 0xD7A3
{{{#!if ((넘어옴5[넘어옴5.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴5[넘어옴5.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴5[넘어옴5.length - 1] < 0xAC00 || 넘어옴5[넘어옴5.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴6 != null
, ''''''{{{#!if 넘어옴7 == null
{{{#!if 넘어옴6[넘어옴6.length - 1] >= 0xAC00 && 넘어옴6[넘어옴6.length - 1] <= 0xD7A3
{{{#!if ((넘어옴6[넘어옴6.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴6[넘어옴6.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴6[넘어옴6.length - 1] < 0xAC00 || 넘어옴6[넘어옴6.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴7 != null
, ''''''{{{#!if 넘어옴8 == null
{{{#!if 넘어옴7[넘어옴7.length - 1] >= 0xAC00 && 넘어옴7[넘어옴7.length - 1] <= 0xD7A3
{{{#!if ((넘어옴7[넘어옴7.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴7[넘어옴7.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴7[넘어옴7.length - 1] < 0xAC00 || 넘어옴7[넘어옴7.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴8 != null
, ''''''{{{#!if 넘어옴9 == null
{{{#!if 넘어옴8[넘어옴8.length - 1] >= 0xAC00 && 넘어옴8[넘어옴8.length - 1] <= 0xD7A3
{{{#!if ((넘어옴8[넘어옴8.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴8[넘어옴8.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴8[넘어옴8.length - 1] < 0xAC00 || 넘어옴8[넘어옴8.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴9 != null
, ''''''{{{#!if 넘어옴10 == null
{{{#!if 넘어옴9[넘어옴9.length - 1] >= 0xAC00 && 넘어옴9[넘어옴9.length - 1] <= 0xD7A3
{{{#!if ((넘어옴9[넘어옴9.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴9[넘어옴9.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴9[넘어옴9.length - 1] < 0xAC00 || 넘어옴9[넘어옴9.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴10 != null
, ''''''{{{#!if 넘어옴10[넘어옴10.length - 1] >= 0xAC00 && 넘어옴10[넘어옴10.length - 1] <= 0xD7A3
{{{#!if ((넘어옴10[넘어옴10.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴10[넘어옴10.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴10[넘어옴10.length - 1] < 0xAC00 || 넘어옴10[넘어옴10.length - 1] > 0xD7A3
은(는)}}}}}} 여기로 연결됩니다. 
#!if 설명 == null && 리스트 == null
{{{#!if 설명1 == null
다른 뜻에 대한 내용은 아래 문서를}}}{{{#!if 설명1 != null
{{{#!html 이 단어의 다른 뜻}}}에 대한 내용은 [[코틀린(동음이의어)]] 문서{{{#!if (문단1 == null) == (앵커1 == null)
를}}}{{{#!if 문단1 != null & 앵커1 == null
의 [[코틀린(동음이의어)#s-|]]번 문단을}}}{{{#!if 문단1 == null & 앵커1 != null
의 [[코틀린(동음이의어)#|]] 부분을}}}}}}{{{#!if 설명2 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단2 == null) == (앵커2 == null)
를}}}{{{#!if 문단2 != null & 앵커2 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단2 == null & 앵커2 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명3 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단3 == null) == (앵커3 == null)
를}}}{{{#!if 문단3 != null & 앵커3 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단3 == null & 앵커3 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명4 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단4 == null) == (앵커4 == null)
를}}}{{{#!if 문단4 != null & 앵커4 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단4 == null & 앵커4 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명5 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단5 == null) == (앵커5 == null)
를}}}{{{#!if 문단5 != null & 앵커5 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단5 == null & 앵커5 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명6 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단6 == null) == (앵커6 == null)
를}}}{{{#!if 문단6 != null & 앵커6 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단6 == null & 앵커6 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명7 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단7 == null) == (앵커7 == null)
를}}}{{{#!if 문단7 != null & 앵커7 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단7 == null & 앵커7 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명8 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단8 == null) == (앵커8 == null)
를}}}{{{#!if 문단8 != null & 앵커8 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단8 == null & 앵커8 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명9 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단9 == null) == (앵커9 == null)
를}}}{{{#!if 문단9 != null & 앵커9 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단9 == null & 앵커9 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명10 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단10 == null) == (앵커10 == null)
를}}}{{{#!if 문단10 != null & 앵커10 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단10 == null & 앵커10 != null
의 [[#|]] 부분을}}}}}}
#!if 설명 == null
{{{#!if 리스트 != null
다른 뜻에 대한 내용은 아래 문서를}}} 참고하십시오.

#!if 리스트 != null
{{{#!if 문서명1 != null
 * {{{#!if 설명1 != null
이 단어의 다른 뜻: }}}[[코틀린(동음이의어)]] {{{#!if 문단1 != null & 앵커1 == null
문서의 [[코틀린(동음이의어)#s-|]]번 문단}}}{{{#!if 문단1 == null & 앵커1 != null
문서의 [[코틀린(동음이의어)#|]] 부분}}}}}}{{{#!if 문서명2 != null
 * {{{#!if 설명2 != null
: }}}[[]] {{{#!if 문단2 != null & 앵커2 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단2 == null & 앵커2 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명3 != null
 * {{{#!if 설명3 != null
: }}}[[]] {{{#!if 문단3 != null & 앵커3 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단3 == null & 앵커3 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명4 != null
 * {{{#!if 설명4 != null
: }}}[[]] {{{#!if 문단4 != null & 앵커4 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단4 == null & 앵커4 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명5 != null
 * {{{#!if 설명5 != null
: }}}[[]] {{{#!if 문단5 != null & 앵커5 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단5 == null & 앵커5 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명6 != null
 * {{{#!if 설명6 != null
: }}}[[]] {{{#!if 문단6 != null & 앵커6 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단6 == null & 앵커6 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명7 != null
 * {{{#!if 설명7 != null
: }}}[[]] {{{#!if 문단7 != null & 앵커7 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단7 == null & 앵커7 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명8 != null
 * {{{#!if 설명8 != null
: }}}[[]] {{{#!if 문단8 != null & 앵커8 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단8 == null & 앵커8 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명9 != null
 * {{{#!if 설명9 != null
: }}}[[]] {{{#!if 문단9 != null & 앵커9 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단9 == null & 앵커9 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명10 != null
 * {{{#!if 설명10 != null
: }}}[[]] {{{#!if 문단10 != null & 앵커10 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단10 == null & 앵커10 != null
문서의 [[#|]] 부분}}}}}}

[[프로그래밍 언어|'''프로그래밍 언어
{{{#!wiki style="font-family: Times New Roman, serif; display: inline;"
]]
{{{#!wiki style="min-height: calc(1.5em + 5px); margin: 0 -10px -5px"
{{{#!wiki style="display: inline-table; min-width: 40%; min-height: calc(1.5em + 5px)"
{{{#!folding [ 목록 ]
{{{#!wiki style="margin: -5px -1px"
<colbgcolor=royalblue><colcolor=#fff> ※ 나무위키에 등재된 프로그래밍 언어 목록
AActionScript · AdaT · AgdaTP · ALGOLT · ApexT · APL · awk · AssemblyT
BBASIC
C파일:C언어 로고.svg CT · 파일:C C#T · 파일:C++ 로고.svg C++T · CarbonT · 파일:clojure_logo.png ClojureS · COBOLT · CoffeeScript · Common LispS · CrystalT
D파일:external/upload.wikimedia.org/D_programming_language_logo.png DT · 파일:Dart 심볼.svg DartT
EElixir · 파일:Elm_logo.svg.png elmT · Erlang
F파일:fsharp-logo.png F#T · Factor · 파일:fennel-logo.svg FennelS · 파일:forth.png Forth · FortranT
GGNU Octave · 파일:Go 로고.svg GoT · Groovy
H파일:Haskell 로고 심볼.svg HaskellT · HolyCT · Haxe
I
J파일:Java 로고.svg JavaT · 파일:JavaScript 로고.svg JavaScript · 파일:julia-dots.svg Julia
K파일:Kotlin 심볼.svg KotlinT
LLeanTP · 파일:LISP_logo.svg LISPS · 파일:Lua 로고.svg Lua
MMATLAB · MaxV · MojoT · Moonlight
N파일:Nim 왕관 로고.svg NimT · 파일:Nix 로고.svg Nix
OOberonT · Objective-CT · 파일:ocaml.svg OCamlT
PPascalT · Perl · 파일:PHP 로고.svg PHP · Processing · Prolog · 파일:Python 심볼.svg Python
QQ#T · QML
R파일:R 로고.svg R · 파일:racket-logo.svg RacketS · Raku · ReasonMLT · 파일:rocq.png RocqTP · 파일:Ruby 로고.svg Ruby · 파일:Rust 로고.svg파일:Rust 로고 화이트.svg RustT
SSAS · 파일:Scala 로고.png ScalaT · SchemeS · 파일:스크래치(교육 플랫폼) 로고.svg ScratchV · sed · Shell Script · Smalltalk · SQL · 파일:Swift 심볼 배경.svg SwiftT
T파일:Typescript_logo_2020.svg TypeScriptT
UUdon
VVisual Basic · Visual Basic .NET · Visual Basic for Applications · vvvvV
WWave
XXSharp
Y
ZZenScript · 파일:Zig 로고마크.svg ZigT
한글누리 · V · 씨앗 · 약속 · 파일:엔트리 아이콘.svg 엔트리V · 창조
T: 정적 타입 프로그래밍 언어 · P: 증명 보조 언어 · S: LISP 방언 및 S-표현식 기반 언어 · V: 시각적 프로그래밍 언어 }}}}}}}}}{{{#!wiki style="display: inline-table; min-width: 40%; min-height: calc(1.5em + 5px)"
{{{#!folding [ 순위 ]
{{{#!wiki style="margin: -5px -1px -10px"
{{{#!wiki style="min-height: calc(1.5em + 5px); margin: 0 -10px -5px"
{{{#!wiki style="display: inline-table; min-width: 25%; min-height: calc(1.5em + 5px)"
{{{#!folding [ IEEE Spectrum 2025 ]
{{{#!wiki style="margin: -5px -1px"
<tablewidth=100%><tablebgcolor=transparent><colbgcolor=#11a500><colcolor=#fff> 스펙트럼 부문 상위 10개 프로그래밍 언어 <colbgcolor=#ff1100><colcolor=#fff> 직업 부문 상위 10개 프로그래밍 언어
1 Python 1 Python
2 Java 2 SQL
3 C++ 3 Java
4 SQL 4 JavaScript
5 C# 5 TypeScript
6 JavaScript 6 C#
7 TypeScript 7 C++
8 C 8 HTML
9 Shell 9 Go
10 Go 10 Shell }}}}}}}}}{{{#!wiki style="display: inline-table; min-width: 25%; min-height: calc(1.5em + 5px)"
{{{#!folding [ Stack Overflow 2025 ]
{{{#!wiki style="margin: -5px -1px"
<colbgcolor=#ffa500><colcolor=#fff> 2025년 Stackoverflow 설문조사 상위 25개 프로그래밍 언어
1 JavaScript <colbgcolor=#ffa500><colcolor=#fff> 14 Rust
2 HTML & CSS 15 Kotlin
3 SQL 16 Lua
4 Python 17 어셈블리어
5 Bash/Shell 18 Ruby
6 TypeScript 19 Dart
7 Java 20 Swift
8 C# 21 R
9 C++ 22 Groovy
10 PowerShell 23 Visual Basic
11 C 24 VBA
12 PHP 25 MATLAB
13 Go }}}}}}}}}{{{#!wiki style="display: inline-table; min-width: 25%; min-height: calc(1.5em + 5px)"
{{{#!folding [ TIOBE 2025 ]
{{{#!wiki style="margin: -5px -1px"
<colbgcolor=#2777c2><colcolor=#fff> 2025년 10월 TIOBE 검색어 점유율 상위 20개 프로그래밍 언어
1 Python <colbgcolor=#2777c2><colcolor=#fff> 11 Fortran
2 C 12 Perl
3 C++ 13 R
4 Java 14 PHP
5 C# 15 Assembly language
6 JavaScript 16 Rust
7 Visual Basic 17 MATLAB
8 Go 18 Scratch
9 Delphi / Object Pascal 19 Ada
10 SQL 20 Kotlin }}}}}}}}}{{{#!wiki style="display: inline-table; min-width: 25%; min-height: calc(1.5em + 5px)"
{{{#!folding [ PYPL 2025 ]
{{{#!wiki style="margin: -5px -1px -10px"
<colbgcolor=green><colcolor=#fff> 2025년 11월 PYPL 검색어 점유율 상위 20개 프로그래밍 언어
1 Python <colbgcolor=green><colcolor=#fff> 11 Ada
2 Java 12 TypeScript
3 C++ 13 MATLAB
4 Objective-C 14 Kotlin
5 R 15 PowerShell
6 JavaScript 16 Go
7 C# 17 Dart
8 Swift 18 Ruby
9 PHP 19 Lua
10 Rust 20 VBA }}}}}}}}}}}} }}}}}}}}}}}}
실행 방식 · 분류 · 언어 목록(분류:프로그래밍 언어 문법) · 언어별 예제 · 틀:프로그래밍 언어 문법 · 틀:난해한 프로그래밍 언어
코틀린
Kotlin
파일:Kotlin_2024.svg파일:Kotlin_2024.svg
개발 JetBrains
최초 출시 2016년 2월 15일
파일:홈페이지 아이콘.svg |
파일:X Corp 아이콘(블랙).svg | 파일:유튜브 아이콘.svg | | 파일:레딧 아이콘.svg

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


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

1. 개요



2016년 2월에 정식 출시된 IntelliJ IDEA로 유명한 JetBrains가 개발한 오픈 소스 프로그래밍 언어. JVM 기반의 언어이며, Java와 유사하지만 더 간결한 문법과 다양한 기능을 추가하였다. Java와의 상호 운용이 100% 지원된다.[상호운용] JVM 바이트코드가 기본이지만, Kotlin/Native를 사용하면 JVM 없이 기계어로 컴파일할 수 있으며, 이를 통해 임베디드 시스템 등 다양한 플랫폼에서 Kotlin을 사용할 수 있다. Android, Spring 프레임워크, Tomcat[2], JavaScript, Jakarta EE, Kotlin/JS를 통한 HTML5, iOS, 라즈베리 파이 등을 개발할 때 사용할 수 있다.

2011년 7월에 처음 공개된 후, 2012년 2월부터 아파치 2.0 라이선스인 오픈 소스로 전환하여 4년간 개선 끝에 버전 1.0이 발표되었다. 2017년에 구글안드로이드의 공식 언어로 Kotlin을 추가하였다. 이는 오라클과의 Java API 저작권 분쟁의 여파로 보는 시각이 많다. 2018년 카카오카카오톡 메시징 서버에 Kotlin을 사용해 본 결과, 코드양이 비약적으로 감소하고 생산성이 대폭 향상되었다고 한다. # 2019년 1월부터 구글은 내부 안드로이드 프로젝트에서 Kotlin을 우선 언어로 사용하기 시작했으며, 기존 Java 프로젝트도 계속 유지되고 있다. # 안드로이드 공식 문서의 샘플 코드도 Java보다 Kotlin으로 작성된 예제가 먼저 나온다. 예시

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

2. 문법

파일:상세 내용 아이콘.svg   자세한 내용은 Kotlin/문법 문서
#!if (문단 == null) == (앵커 == null)
를
#!if 문단 != null & 앵커 == null
의 [[Kotlin/문법#s-|]]번 문단을
#!if 문단 == null & 앵커 != null
의 [[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에서 개발하고 구글이 밀어주는 언어인 만큼 이쪽에 특화된 IDE에서 주로 지원된다. 대표적인 것이 IntelliJ IDEAAndroid Studio. Eclipse IDE에서도 Kotlin 플러그인을 설치해 사용할 수 있다.

5. 기타

6. 관련 문서

7. 외부 링크


[상호운용] Kotlin에서 Java 코드를 사용할 때에는 그냥 사용할 수도 있는 데다 사용법 역시 Kotlin에 맞춰 할 수 있다. 하지만 Java에서 Kotlin 코드를 사용할 때에는 @Jvm* 계열의 annotation을 사용해야 하는 등의 불편함이 있다.[2] JVM 환경에서도 돌아간다.[3] https://stackoverflow.com/questions/63339605/what-is-the-correct-way-to-do-bigdecimal-comparison[상호운용] [5] JetBrains의 IDE에서는 코틀린 코드 문서 내에 자바 코드가 삽입될 경우 아예 코틀린 코드로 변경해버린다.[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에도 존재한다.

분류