한 걸음 두 걸음

02 코틀린 기본 문법 본문

Language/Kotlin

02 코틀린 기본 문법

언제나 변함없이 2019. 4. 28. 19:39
반응형

출처 : 인프런 새차원님의 kotlin 강의입니다.
https://www.inflearn.com/course/%EC%BD%94%ED%8B%80%EB%A6%B0-%EA%B0%95%EC%A2%8C-%EC%83%88%EC%B0%A8%EC%9B%90/lecture

1. 패키지

1.1 package

package demo

코드 맨 윗줄에 작성하며, 디렉토리 경로와 상관없습니다.

1.2 import

import의 경우 java와 같습니다.

2. 함수정의

2.1 func키워드 (리턴타입 명시)

fun 키워드를 사용하여 정의합니다.

fun sum(a: Int, b: Int) : Int { 
    return a+b
}

여기서 sum(a: Int, b: Int) : Int(리턴타입) 이 이렇게 명시되어있습니다.(생략가능합니다)

2.2 func키워드 (리턴타입 없음, body작성)

body가 없는 경우 리턴을 생략하고 =를 두어 바디를 따로 작성하지 않습니다.

fun sum(a:Int, b:Int) = a+b

2.3 Unit

리턴할 값이 없는 경우에 사용하는 void 개념입니다.

fun sum(a: Int, b: Int) :Unit { 
   println(a+b)
}

여기서 return타입을 명시하지 않는 경우 자동으로 Unit인 것으로 간주됩니다.

fun sum(a: Int, b: Int) { 
   println(a+b)
}

3. 지역변수

val이나 var을 사용합니다.
val은 읽기 전용 변수 이며,
var은 초기화시키고 변수 값을 바꾸는 것까지 모두 가능합니다.

3.1 val

final과 같은 기능을 하기 때문에, 한 번만 할당가능하며 초기화 시 값 할당이 병행되어야합니다.

val a: Int = 1 
val b = 2

val c: Int로 두면 컴파일 오류가 생깁니다.
a = 10으로 하면 읽기 전용 변수를 쓰기로 사용하려는 접근이므로 컴파일 오류가 생깁니다.

3.2 var

값을 할당하면 그에 맞는 자료형이 알아서 설정됩니다.

var x = 5
x ++

4. 주석

주석은 ///**/를 사용하는 것이 동일합니다.
특이한 점은 주석을 중첩시킬 수 있다는 것입니다.
주석 내에 또 다른 주석처리가 가능합니다.

5. 문자열

java에서는 문자열을 합칠 떄 +나 StringBuilder를 활용하여 보다 효율적인 연산을 구현해야했지만 kotlin에서는
$를 사용하여 보다 손쉽게 접근합니다.

var a = 1
var string = "a is $a"

이렇게 $a로 적으면 a값이 그대로 들어가게됩니다.

var string2 = "${string.replace("is", "was")} but it change to 2 "

위와같은 연산을 하는 경우에도 연산 후에 결과값이 자동으로 toString화되어 입력됩니다.

6. 조건문

if-else문을 활용하는 방법이 같습니다.

fun max(a: Int, b: Int):Int{
    if(a > b) 
        return a
    else 
        return b
}

보다 간단하게 써보자면 다음과 같습니다.

fun max(a: Int, b: Int) = if( a > b ) a else b

7. nullable

kotlin은 null에 민감하기 때문에, 값이 null일 수 있는 경우를 명시해주어야합니다.
?를 활용하여 표시해줄 수 있습니다.

7.1 리턴값이 null일 수 있는 경우

fun sum(): Int?{
}

7.2 변수가 null일 수 있는 경우

nullable 변수에 접근하기 위해서는 아래와 같이 반드시 null값 여부를 체크하고 사용해야합니다.
그렇지 않으면 컴파일 오류가 발생합니다.

fun print(a : String, b : String){
    val x : Int? = parseInt(a)
    val b : Int? = parseInt(b)

    //이 부분 만들어주지 않으면 컴파일 오류 발생합니다.
    //null값 여부 체크
    if( x != null && y != null){
        println(x * y) //체크 후 접근가능
    }

}

8. Any 자동 타입 변환

Any를 활용하여 자동으로 타입이 변환되게 할 수 있습니다.

func length( a : Any ): Int?{
    if( a is String) {
        return a.length
    }
    return null
}

위와 같이 매개변수 a로 무엇이든 입력하면 그에 맞춰 형변환되어 받을 수 있으며,
a is String을 사용해 매개변수 종류별로 다른 동작을 하도록 만들 수 있습니다.

9. while

java와 완전히 동일합니다.

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

10. when

java의 switch와 비슷합니다.
switch의 경우 하나의 자료형만 받을 수 있었는데 when의 경우 그런 제약이 없습니다.

fun describe(a : Any) String {
    when ( a ){
        1             return "One"
        "Hello"     return "Greeting"
        is Long     return "Long"
        !is String  return "Not a string"
        else         return "Ubknown"

    }
}

body 없이 작성하면

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

    }

11. range

in을 활용하여 범위를 체크합니다.

 for (x in 1..5){
     print(x)
 }

for문 뿐만 아니라 if문에서도 사용 가능합니다.

val x = 3
if(x in 1..10) {
    println("in range")
}

12. Collections

12.1 For-Each 문처럼 사용가능합니다.

val items = listOf{"apple", "banana", "kiwi"}

while (a in items){
    println("item at $index is ${items[a]}")
}

12.2 Set.contain처럼 사용할 수 있습니다.

val items = setOf{"apple", "banana", "kiwi"}
when {
    "orange" in items -> println("juicy")
    "apple" in items -> println("apple is also fine")
}

12.3 람다식을 사용하여 filter 또는 map 연산을 할 수 있습니다.

val fruits = listOf("banana","avocado","apple","kiwi")
//it에는 fruits의 요소들이 들어있습니다.(iterator)
fruits
    .filter { it.startsWith("a") } //a가 포함되어있는 요소로 필터링하고
    .sortedBy {it } // it를 오름차순으로 정렬시킵니다.
    .map( it.toUpperCase() } // 모두 대문자로 바꾼 후
    .forEach { println(it) } //남은 요소를 모두 출력합니다.
반응형

'Language > Kotlin' 카테고리의 다른 글

Kotlin 07 ] 클래스와 상속  (0) 2019.05.20
Kotlin ] 06 Package, Return and Jumps  (0) 2019.05.20
Kotlin 코틀린 ] 05 Control Flow  (0) 2019.05.20
03. kotlin basic types  (0) 2019.04.28
01. 코틀린을 배워야하는 이유  (0) 2019.04.27