[Kotlin] 새차원의 코틀린 강좌(2)

새차원의 코틀린 강좌 - Basic Syntax


패키지 정의
  • 패키지 정의는 파일 최상단에 위치
  • 디렉터리와 패키지를 일치시키지 않아도 됨
1
2
package my.demo
import java.util.*;



함수 정의
  • 함수는 fun 키워드로 정의
1
2
3
fun sum(a: Int, b: Int): Int {
return a + b
}
  • 함수 몸체가 식(Expression)인 경우 return 생략 가능
  • 이런 경우 return type이 추론됨
1
fun sum(a: Int, b: Int) = a + b
  • 리턴 할 값이 없는 경우 Unit(Object)으로 리턴 함
  • Unit는 Java에서 void 리턴 역할
1
2
3
fun printKotlin(): Unit {
println("hello Kotlin")
}
  • Unit는 생략 가능
1
2
3
fun printKotlin() {
println("hello Kotlin")
}



지역 변수 정의
  • val : 읽기 전용 변수
  • 값의 할당은 1회만 가능, Java의 final과 유사
1
2
3
4
val a: Int = 1// 즉시 할당
val b = 2// Int 타입 추론
val c: Int// 컴파일 오류, 초기화 필요
c = 3// 컴파일 오류, 읽기 전용
  • var: Mutable 변수
1
2
var x = 5
x += 1



문자열 템플릿
  • String Interpolation (문자열 보간법)
1
2
3
4
5
6
7
var a = 1
// simple name in template:
val s1 = "a is $a"

a = 2
// arbitrary expression in template:
val s2 = "${s1.replace("is","was")}, but now is $a"



조건문
1
2
3
4
5
6
7
fun maxOf(a: Int, b: Int): Int {
if (a > b) {
return a
} else {
return b
}
}


  • 조건식으로 사용가능
1
fun maxOf(a: Int, b: Int) = if (a > b) a else b



nullable
  • 값이 null 일 수 있는 경우 타입에 nullable 마크를 명시 해야함.
1
2
3
fun parseInt(str: String): Int? {
// 정수가 아닌 경우 null을 리턴
}
  • nullable 타입의 변수를 접근 할 때는 반드시 null 체크를 해야 함
  • 그렇지 않으면 컴파일 오류 발생
1
2
3
4
5
6
7
8
9
10
fun printProduct(arg1: String, arg2: String) {
val x: Int? = parseInt(arg1)
val y: Int? = parseInt(arg2)

if (x != null && y != null) {
println(x * y)
} else {
println("either '$arg1' or '$arg2' is not a number" )
}
}



자동 타입 변환
  • 타입 체크만 해도 자동으로 타입 변환이 됨
1
2
3
4
5
6
7
fun getStringLength(obj: Any): Int? {
if (obj is String) {
// 'obj' 가 자동으로 String 타입으로 변환 됨
return obj.length
}
return null
}



while loop
1
2
3
4
5
6
val items = listOf("apple", "banana", "kiwi")
var index = 0
while (index < items.size) {
println("item at $index is ${items[index]}")
index++
}



when expression
1
2
3
4
5
6
7
8
fun dexcribe(obj: Any): String =
when (obj) {
1 -> "One"
"Hello" -> "Greeting"
is Long -> "Long"
!is String -> "Not a string"
else -> "Unknown"
}



ranges
  • in 연산자를 이용해서 숫자 범위를 체크 가능
1
2
3
4
val x = 3
if (x in 1..10) { // 1~10 사이에 있는 숫자인지 확인
println("fits in range")
}


  • range를 이용한 for loop
1
2
3
for (x in 1..5) { // 1~5 까지 (5 포함)
print(x)
}



collections
  • 컬렉션도 in으로 loop 가능
1
2
3
4
val items = listOf{"apple", "banana", "kiwi"}
for (item in items) {
println(item)
}
  • in 으로 해당 값이 collection에 포함되는지 체크 가능
1
2
3
4
5
6
val items = setOf("apple", "banana", "kiwi")
when {
"orange" in items -> println("juicy")
"pear" !in items -> println("pear is not exist.") // 여기서 break 되고 아래는 실행 안됨
"apple" in items -> println("apple is fine too")
}
  • 람다식을 이용해서 컬렉션에 filter, map 등의 연산 가능
1
2
3
4
5
val fruits = listOf("banana", "avocado", "apple", "kiwi")
fruits.filter { it.startsWith("a")}
.sortedBy { it }
.map { it.toUpperCase() }
.forEach { println(it) }


Share