Package definition and imports
패키지 명세와 import 문은 소스 파일의 최상단에 위치한다. 디렉토리와 패키지를 일치시킬 필요는 없다 : 소스 파일은 독단적으로(임의로?) 시스템에 배치할 수 있다.
package my.demo
import kotlin.text.*
// ...
Program entry point
코틀린 애플리케이션의 진입점은 main 함수이다.
fun main() {
println("Hello world!")
}
fun main(args: Array) {
println(args.contentToString())
}
Print to the standard output
- print() : 한 줄에 출력
- println() : 마지막에 개행 문자가 추가되어있음. 다음 출력은 그 다음줄에
Functions
fun sum(a: Int, b: Int): Int {
return a + b
}
fun main() {
print("sum of 3 and 5 is ")
println(sum(3, 5))
}
fun sum(a: Int, b: Int) = a + b
fun main() {
println("23 + 30 = ${sum(23, 30)}")
}
fun printSum(a: Int, b: Int): Unit {
println("$a + $b = ${a + b}")
}
fun main() {
printSum(-3, 11)
}
Variables
val 키워드를 이용하여 read-only 변수 선언이 가능하다. 한번 변수를 초기화하고 나면 재정의가 불가능하다.
val a: Int = 1 // 선언 즉시 초기화
val b = 2 // `Int` type 추론
val c: Int // 추후 초기화시 타입 명시를 해주어야함
c = 3 // 선언 후 초기화, 참조 전에는 반드시 초기화 되어있어야 함
println("a = $a, b = $b, c = $c")
}
var 키워드를 이용하여 재정의 가능한 변수 선언이 가능하다.
var x = 1130 // `Int` type 추론
x += 323
println("x = $x")
}
변수는 top level 에 선언이 가능하다.
var x = 0
fun increment() {
x += 1
}
fun main() {
println("x = $x; PI = $PI")
increment()
println("increment()")
println("x = $x; PI = $PI")
}
Creating classes and instances
클래스를 선언할 때는 class 키워드를 사용한다. 클래스의 속성들은 선언부 또는 body에 선언 가능하다.
클래스 선언에 나열된 매개 변수를 가진 기본 생성자를 자동으로 사용할 수 있습니다.
var perimeter = (height + length) * 2
}
fun main() {
val rectangle = Rectangle(5.0, 2.0)
println("The perimeter is ${rectangle.perimeter}")
}
클래스의 상속 관계는 : 키워드를 통해 나타낼 수 있다. 클래스가 상속이 가능하게 변경하려면 open 키워드를 class 키워드 앞에 붙여 만든다.
open class Shape
class Rectangle(var height: Double, var length: Double): Shape() {
var perimeter = (height + length) * 2
}
Comments
// : 한줄 주석
/* */ : 여러줄 주석
String templates
큰 따옴표 안에 ${} 키워드를 사용하면 변수를 출력할 때 용이하다. 일종의 문법적 설탕
var a = 1
// 간단한 문자열일때
val s1 = "a is $a"
a = 2
// 임의의 표현식(?)일때
val s2 = "${s1.replace("is", "was")}, but now is $a"
println(s2)
}
Conditional expressions
코틀린은 if문을 표현식으로 사용할 수 있다.
fun main() {
println("max of 3 and 23 is ${maxOf(3, 23)}")
}
for loop
in 키워드를 이용하여 특정 범위 안에서 for 문을 생성할 수 있다. 컬렉션 또는 범위를 두어 사용한다.
while loop
for 문 뿐만 아니라 while문도 사용이 가능하다.
when expression
Switch문과 비슷한 역할을 한다.
Ranges
.. 키워드를 사용하여 범위를 생성할 수 있다. 닫힌 범위 이기 때문에 끝 값을 포함한다.
until 키워드를 사용하면 끝 값을 포함하지 않는 half-open 범위를 만들 수 있다.
for (x in 1..5) {
print(x)
}
}
step 키워드와 downTo 키워드를 사용하여 증감을 만들어 낼 수도 있다.
for (x in 1..10 step 2) {
print(x)
}
println()
for (x in 9 downTo 0 step 3) {
print(x)
}
}
Collections
list, set map 컬렉션과 강력한 collection 내장 함수를 제공한다. (람다식을 이용하여 collection을 필터링하고 맵핑할 수 있다.)
val fruits = listOf("banana", "avocado", "apple", "grape")
fruits
.filter { it.startsWith("a") }
.sortedBy { it }
.map { it.uppercase() }
.forEach { println(it) }
}
in 연산자를 사용하여 collection에 요소가 포함되어 있는지 확인할 수 있다.
val items = setOf("apple", "banana", "grape")
when {
"orange" in items -> println("juicy")
"apple" in items -> println("apple is fine too")
}
}
Nullable values and null checks
null 값이 가능한 경우 ? 키워드를 타입 이름 끝에 붙여서 참조를 nullable로 명시적으로 표시해야된다.
Type checks and automatic casts
is 키워드를 이용하여 표현식이 타입의 인스턴스인지 확인할 수 있다. 특정 유형에 대해 불변 지역 변수이거나 속성을 검사하는 경우 명시적으로 캐스팅할 필요가 없다.