Kotlin 기본 문법
1. 함수
1
2
3
4
5
6
fun helloWorld() : Unit {
println("Hello World")
}
fun add (a : Int, b : Int) : Int {
return a + b
}
함수에서 return 값이 없는 경우면 Unit
을 작성하지만 생략해도 가능하다.
return 값이 있다면 그 타입을 :
뒤에 작성한다.
2. var vs val
1
2
3
4
val a : Int = 10
var b : Int = 9
var c = 100
var s = "String"
val
은 value로 상수를 의미, 변하지 않는 값이다. var
는 variable로 변수를 의미 변하는 값이다.
kotlin에서는 변수의 타입을 자동으로 추론하기 떄문에 c
에서 처럼 : Int
를 적지 않아도 가능하다. 이는 Int 에서만 적용되는 것이 아니라 모두 적용된다.(s의 경우)
3. String template
1
2
val = name = "doodoo"
println("my name is ${name}")
큰 따옴표(““)안에 변수를 넣으려면 &{변수 이름}
이렇게 사용하면 된다.
4. 조건식
1
2
3
4
5
6
7
8
9
fun maxBy1 (a : Int, b : Int) {
if (a > b) {
return a
} else {
return b
}
}
fun maxBy2 (a : Int, b : Int) if (a > b) a else b
maxBy1 함수는 아래 maxBy2 처럼 간결하게 적을 수 있다.
5. when
Java에서의 switch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
fun checkNum(score : Int) {
when (score) {
0 -> println("0")
1,2 -> println("1 or 2")
else -> println("other scores")
}
var b : Int = when(score) {
0 -> 0
else -> 1
}
when(score) {
in 90..100 -> println("great")
in 50..80 -> println("not bad")
else -> println("try hard")
}
}
변수 할당에서 when
을 사용할 수 있다. 이 경우에는 함수에서 사용한 것과는 다르게 else
로 기본 값을 반드시 써줘야 한다.
when
에서 범위를 설정하려면 in 90..100
처럼 사용하면 된다.
6. Expression vs Statement
Expression은 변수를 어떤 값을 할당하거나 변환하는 것, 즉 값을 만들어 내는 것이다. kotlin에서 모든 함수는 Expression이다.
Statement는 값을 만들지 않고 문장을 실행하는 것(?)
7. Array vs List
1
2
3
4
5
6
7
val array = arrayOf(1, 2, 3)
val list = listOf(1, 2, 3)
val array2 = arrayOf(1, "s", 3.14f)
val list2 = listOf(1, "s", 3.14f)
val arrayList = arrayListOf<Int>()
list는 interface로 get만 존재하므로 list[0] = 3
와 같이 값을 변경하는 것은 불가능하다. 반면 array는 가능
arrayList는 add remove 등으로 변경이 가능하다.
8. for vs while
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
for (i in 1..10) {
println(i)
}
for (i in 1..10 step 2) {
println(i)
}
for (i in 10 downTo 1) {
println(i)
}
val students = arrayListOf("a", "b", "c")
for ((index : Int, name : String) in students.withIndex()) {
println(index, name)
}
index : Int = 0
while(index < 5) {
println(index)
index ++
}
첫 번째 for문은 1부터 10까지
두 번째 for문은 2간격으로 1부터 10까지
세 번째 for문은 10부터 1까지
네 번째 for문은 withIndex()
를 사용하여 index와 value를 둘 다 가져올 수 있다. (python 에서의 enumerate
와 동일)
9. NonNull 과 Nullable
1
2
3
4
var name : String = "doodoo"
var nullName : String? = null
var nullNameInUpperCase = nullName?.toUpperCase()
String은 NonNull 타입인데 ?
를 사용하면 null을 할당 / null이 될 수 있다.
초기 변수 할당이 아닌 때에도 nullable 타입을 할당하려고 하면 ?
를 사용하면 된다.
1
2
3
4
5
6
7
val lastName : String? = null
val fullName : name + " " + (lastName ?: "No LastName")
val email : String ?= "doodoo3804@gmail.com"
email?.let {
println("my email is ${email})
}
?:
elvis expression
null인 경우의 default 값을 적어준다.
보통 ?.let
을 사용하여 null이 아닌 경우의 함수를 짠다.
!!
null이 절대로 될 수 없는 경우에 사용
10. class
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
open class Human constructor(val name : String = "default name") {
constructor(name : String, age : Int) : this(name) {
println(name, age)
}
init {
println("walk")
}
open fun eating() {
println("eat")
}
}
class NotHuman : Human(){
override fun eating() {
super.eating()
println("not eating")
}
}
fun main() {
val human1 = Human("doodoo")
val human2 = Human("doodoos", 99)
val notHuman = NotHuman()
}
kotlin의 class는 기본적으로 final class이다. 그렇기 때문에 같은 파일 내에 있더라도 override하여 사용할 수 없다. 상속하여 사용하기 위해서는 open
예약어를 사용한다. class내부의 fun
도 같은 문제가 있어 open
을 사용한다. 상속받은 parameter 역시 사용 가능하다.
주생성자 : name 이라는 String을 할당하기 위해 사용 class 이름 옆에 constructor를 작성한다. 이는 생략 가능
부생성자 : class 내부에 constructor를 선언, 부생성자는 주생성자에게서 this
를 통해 값을 받아와야만 한다.
init : 생성되었을 때 자동으로 실행하는 부분
super : 만약 부모로 부터 상속 받아 사용해야 하는 경우 사용한다.
open : 상속을 받기 위한 부분에 사용하는 예약어