문서 편집 권한이 없습니다. 다음 이유를 확인해주세요: 요청한 명령은 다음 권한을 가진 사용자에게 제한됩니다: 사용자. 문서의 원본을 보거나 복사할 수 있습니다. [include(틀:프로젝트 문서,프로젝트=나무위키 컴퓨터 프로젝트)] https://kotlinlang.org/assets/images/open-graph/kotlin_250x250.png?width=25% [* 정식 1.0 버전의 출시와 함께 바뀐 로고이다. 이전 로고는 알아서 찾아보길.] {{{#!html <!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #008800; font-weight: bold">package</span> <span style="color: #0e84b5; font-weight: bold">hello</span> <span style="color: #008800; font-weight: bold">fun</span> <span style="color: #0066BB; font-weight: bold">main</span>(args: Array<String>) { println(<span style="background-color: #fff0f0">"Hello World!"</span>) } </pre></div> }}} [[http://kotlinlang.org/|공식 사이트]] [목차] == 개요 == JetBrains에서 개발한 언어이다. 간결한 문법을 가지고 있으며, 세미콜론이 옵션이다. JVM 기반의 언어이며, Java간의 상호 운용이 100% 지원된다.[* JetBrain 홈페이지의 내용] '''안드로이드''', Tomcat[* JVM 환경에서도 돌아간다.] , '''자바스크립트''', Java EE, HTML 5 등을 개발할때 사용할 수 있다고 한다. 현재 공식 1.0.3 버전이 나와 있다. == 특징 == * 장황했던 자바와 비교하면 눈물날 정도로 간결한 문법을 제공한다. 간결한 문법을 제공하면서도 런타임 오버헤드가 거의 없다. * 오버헤드 없는 널 안전성을 제공한다. 코틀린의 변수는 Nullable(널 값 사용 가능)과 NotNull(널 값 사용 불가)로 나뉘는데, 변수 선언 시 '?'를 붙여 Nullable로 만들 수 있다. * 예외를 검사하지 않는다. * 확장함수, 연산자 오버로딩을 지원한다. 예를 들어 Int형을 확장해 'i = 3 power 4' 식으로 새 연산자를 만들 수 있다.[* 실제로는 새 infix 함수를 생성하는 것으로 작동한다. 사칙연산 또한 infix 함수로 구현되어 'a * 3'으로도, 'a.times(3)'으로도 쓸 수 있다. 연산자와 연산자 오버로딩도 요 infix 힘수로 돌아간다.] * API 문서에 자바의 HTML대신 Markdown을 사용한다. * == 연산자가 생각하는 대로 작동한다. 자바에서는 String i와 String j가 같은 문자열을 담고 있어도 가리키는 객체가 다르므로 i == j는 false이다. 코틀린에서 ==는 equals()와 똑같이 작동한다. 따라서 i == j는 true다. 자바의 ==를 쓰려면 ===를 쓰면 된다. !=는 !== * Static 메서드가 없다. companion object를 사용하자. 자바 코드에서 접근하려면 '클래스명.Companion.메서드_혹은_get변수명()'을 쓰면 된다. * 자바6에 호환된다. * '''자바와의 상호 운용이 100% 지원된다.''' === 간결한 문법 === * 클래스의 getters, setters, equals(), hashCode(), toString() 과 copy()를 '''한 줄로''' 선언할 수 있다! {{{#!html <!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">data <span style="color: #008800; font-weight: bold">class</span> <span style="color: #0066BB; font-weight: bold">Customer</span>(<span style="color: #008800; font-weight: bold">val</span> name: String, <span style="color: #008800; font-weight: bold">val</span> email: String, <span style="color: #008800; font-weight: bold">val</span> company: String) </pre></div> }}} * 람다 식을 지원한다. * 싱글톤 방식의 객체를 object로 만들 수 있다. {{{#!html <!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">object ThisIsASingleton { <span style="color: #008800; font-weight: bold">val</span> companyName: String = <span style="background-color: #fff0f0">"JetBrains"</span> } </pre></div> }}} * in과 Range문이 있다. {{{#!html <!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #008800; font-weight: bold">if</span> (i <span style="color: #008800; font-weight: bold">in</span> <span style="color: #6600EE; font-weight: bold">1.</span>.<span style="color: #6600EE; font-weight: bold">10</span>) { <span style="color: #888888">// equivalent of 1 <= i && i <= 10</span> println(i) } </pre></div> }}} * for문에도 쓸 수 있다! {{{#!html <!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #008800; font-weight: bold">for</span> (i <span style="color: #008800; font-weight: bold">in</span> <span style="color: #6600EE; font-weight: bold">0.</span>.<span style="color: #6600EE; font-weight: bold">12</span> step <span style="color: #6600EE; font-weight: bold">3</span>) print(<span style="background-color: #fff0f0">"$i "</span>) <span style="color: #888888">// 0 3 6 9 12 출력</span> <span style="color: #008800; font-weight: bold">for</span> (i <span style="color: #008800; font-weight: bold">in</span> <span style="color: #6600EE; font-weight: bold">12</span> downTo <span style="color: #6600EE; font-weight: bold">0</span> step <span style="color: #6600EE; font-weight: bold">2</span>) print(<span style="background-color: #fff0f0">"$i "</span>) <span style="color: #888888">// 12 10 8 6 4 2 0 출력</span> </pre></div> }}} * switch/case가 when ->으로 대체되었다. 위의 in과 Range도 쓸 수 있다. {{{#!html <!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #008800; font-weight: bold">when</span> (x) { <span style="color: #6600EE; font-weight: bold">0</span>, <span style="color: #6600EE; font-weight: bold">1</span> -> print(<span style="background-color: #fff0f0">"boolean"</span>) <span style="color: #6600EE; font-weight: bold">2</span> -> print(<span style="background-color: #fff0f0">"콩\n콩"</span>) !<span style="color: #008800; font-weight: bold">in</span> <span style="color: #6600EE; font-weight: bold">1.</span>.<span style="color: #6600EE; font-weight: bold">9</span> step <span style="color: #6600EE; font-weight: bold">2</span> -> print(<span style="background-color: #fff0f0">"홀수 아님"</span>) <span style="color: #008800; font-weight: bold">in</span> <span style="color: #6600EE; font-weight: bold">0.</span>.<span style="color: #6600EE; font-weight: bold">9</span> -> print(<span style="background-color: #fff0f0">"한자릿수"</span>) <span style="color: #008800; font-weight: bold">else</span> -> print(<span style="background-color: #fff0f0">"otherwise"</span>) } </pre></div> }}} * is 연산자가 있다. 타입 체크, 자동 형변환 등이 가능하다. {{{#!html <!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">npcContainer.forEach { npc -> <span style="color: #008800; font-weight: bold">if</span> (npc <span style="color: #008800; font-weight: bold">is</span> Visible) npc.drawBody(gc, g) <span style="color: #888888">// npc가 Visible형으로 자동 변환되었다.</span> <span style="color: #008800; font-weight: bold">if</span> (npc <span style="color: #008800; font-weight: bold">is</span> Glowing) npc.drawGlow(gc, g) <span style="color: #888888">// npc가 Glowing형으로 자동 변환되었다.</span> } </pre></div> }}} * when문에도 쓸 수 있다. {{{#!html <!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #008800; font-weight: bold">when</span> (expr) { <span style="color: #008800; font-weight: bold">is</span> Num -> expr.value <span style="color: #888888">// expr이 Num형으로 자동 변환되었다.</span> <span style="color: #008800; font-weight: bold">is</span> Sum -> eval(expr.left) + eval(expr.right) <span style="color: #888888">// expr이 Sum형으로 자동 변환되었다.</span> <span style="color: #008800; font-weight: bold">else</span> -> <span style="color: #008800; font-weight: bold">throw</span> IllegalArgumentException(<span style="background-color: #fff0f0">"퉤에엣"</span>) } </pre></div> }}} * 변수 선언시 값에 if문을 사용할 수 있다. {{{#!html <!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #008800; font-weight: bold">val</span> max = <span style="color: #008800; font-weight: bold">if</span> (a > b) { print(<span style="background-color: #fff0f0">"Choose a"</span>) a } <span style="color: #008800; font-weight: bold">else</span> { print(<span style="background-color: #fff0f0">"Choose b"</span>) b } </pre></div> }}} === 안전성 === * Null 객체를 호출하는 경우를 알아서 보호해준다 한다. 자바에서 가져온 클래스 등도 가능하다. * 변수명?를 사용하는 경우 변수 안의 메소드 (ex. length)를 실행할때 변수가 null이면 null을 반환한다. {{{#!html <!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">b?.length() <span style="color: #888888">//b가 null이면 null 리턴</span> </pre></div> }}} * 오류 방지로 null-safe 연산자를 쓸 수 있다. (ex. s as String?) * 안전한 형변환 키워드인 as? 가 존재한다. (ex. s as? String) === 그 외 === * new 키워드는 선택이다. * ;가 필요없다. * System.out.println/printf등이 println/printf 등으로 줄었다. * String에서 변수의 값을 쉽게 표현할 수 있는 interpolation($)을 지원한다. {{{#!html <!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #008800; font-weight: bold">val</span> name: String = <span style="background-color: #fff0f0">"Wikineet"</span> <span style="color: #008800; font-weight: bold">val</span> greet_en: String = <span style="background-color: #fff0f0">"Hello, $name!"</span> <span style="color: #008800; font-weight: bold">val</span> greet_ko: String = <span style="background-color: #fff0f0">"${name}님 안녕하세요!"</span> println(greet_en) <span style="color: #888888">// 출력: Hello, Wikineet!</span> println(greet_ko) <span style="color: #888888">// 출력: Wikineet님 안녕하세요!</span> </pre></div> }}} * Nullable이 아닌 변수에서 null 사용시 오류를 뱉어낸다. {{{#!html <!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">var a: String <span style="color: #333333">=</span> <span style="background-color: #fff0f0">"abc"</span> a <span style="color: #333333">=</span> null <span style="color: #333333">//</span> 컴파일 에러 </pre></div> }}} * ?을 사용해 Nullable로 만들어주면 쓸 수 있다. {{{#!html <!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #008800; font-weight: bold">var</span> b: String? = <span style="background-color: #fff0f0">"abc"</span> b = <span style="color: #008800; font-weight: bold">null</span> <span style="color: #888888">// ok</span></pre></div> }}} * Elvis 연산자(?:)가 존재한다. {{{#!html <!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #008800; font-weight: bold">val</span> testee_hometown: String? = <span style="color: #008800; font-weight: bold">null</span> <span style="color: #888888">// 여기에 적절한 값을 넣으면 '<피실험자 고향 지명>' 대신 넣은 값이 표시된다.</span> <span style="color: #008800; font-weight: bold">val</span> hometown_display = testee_hometown ?: <span style="background-color: #fff0f0">"<피실험자 고향 지명>"</span> <span style="color: #888888">// testee_hometown이 null인지 검사한다. null이면 연산자의 우변에 있는 값이 대신 대입된다.</span> println(<span style="background-color: #fff0f0">"이 장치는 ${hometown_display}에 사는 모든 사람의 신체 장기 가격과 소득 금액을 합친 것보다 더 비쌉니다."</span>) </pre></div> }}} == 기타 == * 간결한 언어라는 명성에 무색하게 다차원 배열의 선언은 전혀 간결하지 않다. 언어 개발자들도 이를 인지하고 있으며[* [[http://stackoverflow.com/questions/27512636/two-dimensional-int-array-in-kotlin]]], 추후에 수정될 듯하다. == 바깥 링크 == * [[https://kotlinlang.org/docs/reference/|레퍼런스 가이드]] * [[http://try.kotlinlang.org/|써보기]] * [[http://try.kotlinlang.org/koans|배워보기]] [[분류:객체 지향 언어]] [[분류:프로그래밍 언어]] 이 문서에서 사용한 틀: 틀:프로젝트 문서 (원본 보기) 코틀린 문서로 돌아갑니다.