기본 문법
패키지 정의
패키지 정의는 소스 파일의 제일 위에 있어야 합니다.
package my.demo
import java.util.*
// ...
실제 소스 디렉토리와 패키지는 달라도 좋습니다.
Packages를 살펴보세요.
함수 정의
두개의 Int인수를 가지며, Int 값을 반환하는 함수입니다:
fun sum(a: Int, b: Int): Int {
return a + b
}
표현식을 함수 바디로 가지고, 반환형을 추론하는 함수입니다:
fun sum(a: Int, b: Int) = a + b
반환형이 없는 함수입니다:
fun printSum(a: Int, b: Int): Unit {
print( a + b )
}
Unit 반환형은 생략할 수 있습니다.
fun printSum(a: Int, b: Int) {
print( a + b )
}
Functions를 살펴보세요.
Defining local variables
한 번만 정의되는 지역 변수(상수, 읽기 전용):
val a: Int = 1
val b = 1 // 'Int' 형으로 추론
val c: Int // 값을 선언하지 않을 경우는 타입을 정의해야 함.
c = 1 // 초기값 선언
변수:
var x = 5 // 'Int' 형으로 추론
x += 1
Properties And Fields를 보세요.
주석
자바와 자바스크립트와 마찬가지로, 코틀린은 end-of-line 과 block 주석을 지원합니다.
// This is an end-of-line comment
/* This is a block comment
on multiple lines. */
자바와의 차이점이라면 코틀린은 block 주석에서 중복 주석을 사용할 수 있습니다.
Java
/*
/* */ -> 에러 발생
*/
Kotlin
/*
/* */ -> 에러 없음
*/
주석의 문서화와 관련해서는 Documentating Kotlin Code를 살펴보세요.
템플릿 문자열 사용하기
fun main(args: Array<String>) {
if (args.size == 0) return
print("First argument: ${args[0]}")
}
String templates를 살펴보세요.
조건문 사용하기
fun max(a: Int, b: Int): Int {
if (a > b) {
return a
} else {
return b
}
}
if를 표현식으로 사용하면:
fun max(a: Int, b: Int) = if (a > b) a else b
if-expressions를 살펴보세요.
널 체크와 nullable 사용하기
널 값이 들어갈 수 있는 레퍼런스는 반드시 nullable 표기가 있어야 합니다.
str을 integer로 변환할 수 없는 경우 null을 반환:
fun parseInt(str: String): Int? {
// ...
}
nullable 값을 반환하는 함수를 사용:
fun main(args: Array<String>) {
if (args.size < 2) {
print("Two integers expected")
return
}
val x = parseInt(args[0])
val y = parseInt(args[1])
// Using `x * y` yields error because they may hold nulls.
if (x != null && y != null) {
// x and y are automatically cast to non-nullable after null check
print(x * y)
}
}
혹은
// ...
if (x == null) {
print("Wrong number format in '${args[0]}'")
return
}
if (y == null) {
print("Wrong number format in '${args[1]}'")
return
}
// x and y are automatically cast to non-nullable after null check
print(x * y)
Null-safety를 살펴보세요.
타입 체크와 자동 형변환 사용
is 연산자는 표현식이 해당하는 유형의 인스턴스인지 여부를 확인합니다. 변경할 수 없는 지역 변수 또는 속성이 대상 유형임이 확인되면 명시적으로 캐스팅 할 필요가 없습니다:
fun getStringLength(obj: Any): Int? {
if (obj is String) {
// `obj`는 이 안에서 자동적으로 `String`으로 캐스팅 됩니다.
return obj.length
}
// 조건문 밖에서 `obj`는 `Any`타입입니다.
return null
}
혹은
fun getStringLength(obj: Any): Int? {
if (obj !is String) return null
// `obj`는 이 경우 자동적으로 `String`으로 캐스팅됩니다.
return obj.length
}
아니면
fun getStringLength(obj: Any): Int? {
// `&&`의 오른쪽에서 `obj`는 자동적으로 `String`으로 캐스팅됩니다.
if (obj is String && obj.length > 0) {
return obj.length
}
return null
}
Classes과 Type casts를 살펴보세요.
for 반복문 사용하기
fun main(args: Array<String>) {
for (arg in args) {
print(arg)
}
}
혹은
for (i in args.indices) {
print(args[i])
}
for loop를 살펴보세요.
while 반복문 사용하기
fun main(args: Array<String>) {
var i = 0
while (i < args.size) {
print(args[i++])
}
}
while loop를 살펴보세요.
when 표현식 사용하기
fun cases(obj: Any) {
when (obj) {
1 -> print("One")
"Hello" -> print("Greeting")
is Long -> print("Long")
!is String -> print("Not a string")
else -> print("Unknown")
}
}
when expression를 살펴보세요.
Ranges 사용하기
in 연산자를 사용하여 숫자가 범위 안에 있는지 확인:
if (x in 1..y-1) {
print("OK")
}
숫자가 범위 밖에 있는지 확인:
if (x !in 0..array.lastIndex) {
print("Out")
}
범위 반복 적용:
for (x in 1..5) {
print(x)
}
Ranges를 살펴보세요.
Collections 사용하기
Collection 반복하기:
for (name in names) {
println(name)
}
in 연산자를 사용하여 collection에 어떤 객체가 담겨 있는지 확인:
if (text in names) { // names.contains(text) is called
print("Yes")
}
람다 표현식을 이용해서 collection을 필터링 및 매핑하기:
names
.filter { it.startsWith("A") }
.sortedBy { it }
.map { it.toUpperCase() }
.forEach { print(it) }
댓글