CLOSE

Recommanded Free YOUTUBE Lecture: <% selectedImage %>

## Contents

### 패키지 정의

소스코드의 처음에 package를 이용, 패키지를 정의 할 수 있다.
```package my.demo
import java.util.*
// ...```

### 함수 정의

두개의 Int형 매개변수를 가지고, Int 값을 반환하는 함수다.
```fun sum(a: Int, b: Int) {
return a + b
}```
아래와 같이 단순화 할 수도 있다.
`fun sum(a: Int, b: Int)= a+b`
함수는 반환 값을 가지지 않을 수도 있다.
```fun printSum(a: Int, b: Int): Unit {
println("sum of \$a and \$b is \${a + b}")
}```
Go 같은 언어들은 에러를 반환하기도 하지만, 코틀린은 그냥 무시하고 실행된다. 실행되기는 하지만 좋은 코드는 아니다.
`sum of -1 and 8 is 7`

### 지역 변수

val은 읽기 전용이다.
```val a: Int = 1  // 즉시 할당
val b = 2       // Int로 타입 추론
val c: Int      // 나중에 값을 할당 하 ㄹ수도 있다.
c = 3```
쓰기 전용 이므로 재 할당 할 경우 컴파일 실패한다.

var는 쓰기가 가능한 변수다.
```var x = 5
x += 1```

### String 템플리트

```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"```

### null 검사

NullPointException은 프로그램 실행 중 발생하는 가장 흔한 오류 중 하나일 것이다. 가장 흔하면서, 프로그램 자체를 종료 시킬 수 있는 중요한 오류임에도, 전적으로 프로그래머가 책임져야 하는 부담이 있다. 코틀린은 null을 허용하지 않거나, null을 쓰더라도 안전하게 사용 할 수 있게 하고 있다.

코틀린에서 변수는 NotNullNullable을 설정 할 수 있다. 일반적인 변수는 Null을 할당 할 수 없다. 아래 코드를 보자.
```var temp: String = "abc"
temp = null```
컴파일 하면 "Kotlin: Null can not be a value of a non-null type String" 에러가 발생한다. null을 허용하고 싶다면, ?표를 이용해야 한다.
```var temp: String? ="abc"
temp = null```

### 자동 타입변환

is연산자를 이용해서 타입(type)을 체크하고, 캐스팅까지 해준다.
```fun getStringLength(obj: Any): Int? {
if (obj is String) {
// if 문 안에서 obj는 자동으로 String으로 캐스팅된다.
return obj.length
}

// if 문 바깥에서는 여전히 Any 타입이다.
return null
}```
아래와 같이 나타낼 수도 있다.
```fun getStringLength(obj: Any): Int? {
if (obj !is String) return null

// obj는 자동으로 String로 캐스팅 된다.
return obj.length
}```

### for 루프문

```fun main(args: Array<String>) {
val items = listOf("apple", "banana", "kiwi")
for (item in items) {
println(item)
}
}```
혹은
```val items = listOf("apple", "banana", "kiwi")
for (index in items.indices) {
println("item at \$index is \${items[index]}")
}```

### While 루프문

```val items = listOf("apple", "banana", "kiwi")
var index = 0
while (index < items.size) {
println("item at \$index is \${items[index]}")
index++
}```

### when

```fun describe(obj: Any): String =
when (obj) {
1          -> "One"
"Hello"    -> "Greeting"
is Long    -> "Long"
!is String -> "Not a string"
else       -> "Unknown"
}```

### range

```for (x in 1..5) {
print(x)
}```
스텝 설정
```for (x in 1..10 step 2) {
print(x)
}
for (x in 9 downTo 0 step 3) {
print(x)
}```

### Collections

```fun main(args: Array<String>) {
val items = listOf("apple", "banana", "kiwi")
for (item in items) {
println(item)
}
}```

```fun main(args: Array<String>) {
val items = setOf("apple", "banana", "kiwi")
when {
"orange" in items -> println("juicy")
"apple" in items -> println("apple is fine too")
}
}```