[Kotlin] Kotlin 기초 문법 (Basic Syntax)

2019. 5. 20. 15:11Kotlin

코틀린의 함수 정의


함수는 fun keyword 를 사용하여 함수를 정의한다

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

fun add ( a: Int , b : Int) = a + b;

 

처음 방식으로 함수를 만들경우 return type을 직접 입력해 주어야 한다.

두번째 방식으로 함수 몸체가 식인경우는 return 을 생략가능하며 return type이 추론이 된다 . 

 

첫번째 함수 같은 경우는 Int 와 Int의 return 값으로 Int를 사용했지만 만약 return할 type이 없을경우는 Unit(Object)로 리턴한다,.

Kotlin에서의 Unit는 Java의 void와 같고 Unit은 생략이 가능하다.

 

코틀린의 변수 정의


코틀린에서의 변수는 var 과 val로 변수를 정의한다

먼저 val부터 알아보자면 val은 읽기 전용 변수이다 그말은 값의 할당이 1회만 가능하다는 말이다 Java의 final과 유사하다고 본다.

 

var - mutable     - 가변 

val - immutable - 불변

 

val CODE_OK = 200;
var age = 26;

age = 27;

CODE_OK = 404; // Val cannot be reassigned

다음의 예제는 Kotlin에서의 var 과 val을 사용한 예제이다 . 

CODE_OK변수는 val(immutable) 200을 할당받았다 . 그다음 age변수는 var (mutable) 26값을 할당 받았다 . 

그다음 age변수는 mutable하기 때문에 27이란 값을 대입하면 Error가 나지 않는다 하지만 immutable인 CODE_OK는 새로운 값인

404를 넣어주면 Val cannot be reassigned Error가 발생한다 . 

 

코틀린의 문자열 템플릿 


코틀린에서의 문자열 템플릿은 

${} or $변수명 으로 사용이 가능합니다 . 또한 대괄호 안에서는 다른 코드들도 사용 가능하다 . 

 

fun main(args: Array<String>) {

    var name = "최윤진";
    var age = 27;

    println("글쓴이의 이름은 : ${name} 이며 나이는 ${age}살 입니다")
}

 

코틀린의 조건문 if 


fun main(args: Array<String>) {

    var age = 27;
    val ageFlag :Int = 20;

    print(ageValid(age , ageFlag))
}

fun ageValid( age:Int , ageFlag:Int) : String {

    if (age > ageFlag ){
        return "성인"
    }else {
        return "미성년자"
    }
}

fun ageValid (age : Int, ageFlag:Int) =  if (age>ageFlag) "성인" else "미성년지"

위의 예는 현재 나이와 성인의 기준인 20살의 나이를 기준으로 성인인지 미성년자인지 구분하는 소스코드입니다 .

조건문은 다음과 같이 쓴다고 보시면 됩니다 . 

 

코틀린의 nullable


코틀린에는 값이 null일수 있는 경우 표현을 해주기위해 nullable마크를 명시하여 null을 리턴할수도 있다고 표시합니다 . 

사용하는 기호는 (?) 입니다 예제로 확인해보겠습니다 . 

 

fun main(args: Array<String>) {
    print(add(3,5))
}

fun add (a : Int? , b : Int?) : Int?{
    
    return null
}

함수를 실행하자마자 null을 리턴하지만 Error가 발생하지않고 결과값으로 null을 리턴한것을 확인할 수 있다 .

 

 

코틀린의 자동 타입 변환 


fun main(args: Array<String>) {

    print(getLength("Hello Kotlin"))
}

fun getLength ( obj : Any) : Int? {

    if (obj is String){
        //obj가 자동으로 String 타입으로 변환됨.
        // 타입 체크만해도 자동으로 타입 변환 .
        return obj.length;
    }

    return null
}

코틀린에서 타입 변환에 대한 예제이다 코틀린의 데이터타입 Any는 원시타입을 포함한 모든 타입의 조상이다 자바의 Object

Any에 담게 되면 참조타입이므로 박싱된다 .  Kotlin의 Any는 java.lang.Object에 대응하기는 하지만 , toString() , equals() , hashCode()를 제외한 다른 메소드 wait() , notify()는 Any에서 사용할 수 없다 사용하려면 java.lang.Object로 형변환 해야한다 . 

 

 

코틀린의 Loop


코틀린에서의 while문은 자바와 유사하기때문에 패스하도록 하겠습니다 . 

 

when expression - switch case처럼 쓰이는 문법.

fun main(args: Array<String>) {

    var name : Any= "최윤진";

    print(when (name ){
        1 -> "1이다"
        is String -> "문자열이다";
        !is String -> "문자열이 아니다";
        is Int -> "정수다"
        else  -> "모르겠다."
    })
}

위의 코드를 보면 name의 값으로 "최윤진"이라는 값을 넣어놓고 print안에 when expression을 사용하였다 .

name 이 1이면 "1이다 " , 스트링이면 문자열이다 등등 상황에 맞는 문자열이 나올것이고 when에는 타입 구분이 없다 .

 

따라서 name 의 Type을 Any 로 지정하여 사용하였다 . 

 

 

코틀린의 range


코틀린에서는 ranges라는 문법을 지원한다 예제로 보는게 이해가 잘될거같아서 예제로 표현해보았습니다 . 

fun main(args: Array<String>) {

    for ( i in 0..5){
        println(i)
    }

    val CODE = 200;
    if (CODE in 200..299){
        print("정상입니다 CODE ${CODE}")
    }

}
// 결과값 
0
1
2
3
4
5
정상입니다 CODE 200

코드로 본다면 더 간편할것입니다 . 

ranges 를 이용하여 0 ~ 5까지 출력을하고

조건문에서는 해당값이 range 안에 포함된 값이라면 true 아니라면 false를 통해 조건문을 사용할 수 있습니다 . 

 

 

코틀린의 Collections


코틀린에서는 람다식을 이용하여 컬렉션에 filter , map등의 연산이 가능하다.

import kotlin.coroutines.experimental.buildIterator

fun main(args: Array<String>) {

    val fruit : List<String?> = listOf("banana" , "apple" , "grape" , null);

    println(fruit)
    println(fruit.filterNotNull())
    fruit.filterNotNull()
         .filter{it.startsWith("b") }
         .sortedBy { it }
         .map { it.toUpperCase() }
         .forEach{print(it)};
}

// 출력결과
[banana, apple, grape, null]
[banana, apple, grape]
BANANA

처음 fruit라는 immutable 변수에 List를 만드는데 타입은 String이지만 null이 올수있도록 타입을 지정하고 갚을 넣었습니다.

첫번째 출력결과는 fruit 변수를 그대로 출력한것이며

두번째 출력결과는 fruit 변수에서 null이 아닌 값들만 출력한다는 의미입니다.

세번째 출력결과는 fruit 변수에서  null 이아닌 값들을 뽑아내고 그중에서도 시작하는 첫번째 문자가 b로 시작하며 

b 에 해당하는 요소로 정렬을 하고 그 요소들을 전부 대문자로 바꾼다음에 출력하는 로직입니다 .

현재 예제에는 b로시작하는 요소가 하나밖에 없지만 직접 실습해보실때는 여러개로 해보시길 추천드립니다 . 

 

 

이글을 작성하면서 참고한 사이트 ( 문제가 된다면 내리도록 하겠습니다 .  )

https://umbum.tistory.com/609?category=778552

 

[Kotlin] 컬렉션과 배열

filterNotNull() : 널이 아닌 값만 추리고 싶은 경우 ```kt >>> val l = listOf(1, 2, null, 4, 5) >>> println(l.filterNotNull()) [1, 2, 4, 5] ``` Note ) 걸러내고 난 결과 컬렉션의 타입은 ``kt null``이 제..

umbum.tistory.com

https://www.inflearn.com/course/코틀린-강좌-새차원/dashboard

 

새차원의 코틀린(Kotlin) 강좌 - 인프런

코틀린(Kotln) 프로그래밍 언어에 대한 강좌 입니다. 최근에 구글이 안드로이드 개발 언어로 코틀린을 공식적으로 추가했습니다. 하지만 아직 국내에는 코틀린 번역서나, 코틀린을 배우기 위한 자료가 부족한 상황입니다. 다만 kotlinlang.org에 가면 비록 영문이지만, 코틀린에 대한 내용이 잘 정리 되어있습니다. 그래서 제가 kotlinlang.org 직접 공부하면서 그 내용을 비디오로 정리해 보았습니다. 코틀린을 공부하는 다른 분들께 도움이 될 것

www.inflearn.com

 

'Kotlin' 카테고리의 다른 글

[Kotlin] 상속  (0) 2019.05.21
[Kotlin] class 의 활용 및 개념  (0) 2019.05.21
[Kotlin] Package , Return and Jumps  (0) 2019.05.21
[Kotlin] 코틀린 Control Flow  (0) 2019.05.21
[Kotlin] 코틀린의 기본 타입 ( Java와의 비교 )  (0) 2019.05.21