본문 바로가기
프로그래밍/Kotlin

Kotlin - Basic Syntax(기본 구문) (2/2)

by pentode 2019. 4. 30.

Kotlin - Basic Syntax(기본 구문) (1/2) 에서 이어집니다.

기본 구문(Syntax)에 대한 글은 말 그대로 구문(Syntax)에 대해 설명합니다. 프로그램에서 구문(Syntax)는 문법(Grammar)에 의해 정의된 프로그램의 형태, 구조 등을 말합니다. 그러므로 설명 코드내의 자세한 연산자, 예약어, 예외 등에 대한 설명은 없습니다. 이러한 자세한 내용은 나중에 알아보게 되겠습니다.


9. null이 가능한 값의 사용과 null 체크하기

null 값이 가능한 참조(reference)는 null사용 가능하다는 표시를 반드시 해야 합니다(반환 타입 뒤에 ? 를 붙입니다).

다음 함수는 문자열 str이 정수가 아닐경우 null을 반환합니다.

fun parseInt(str: String): Int? { 
    try { 
        return str.toInt() 
    } catch(e: NumberFormatException) { 
        return null; 
    } 
} 


null 가능한 값을 반환하는 함수를 사용합니다.

null 가능한 값을 반환하는 함수를 사용합니다. 

fun printProduct(arg1: String, arg2: String) { 
    val x = parseInt(arg1) 
    val y = parseInt(arg2) 

    // 'x * y'를 사용할 경우 null값을 가질 수 있으므로 에러가 발생합니다. 
    if (x != null && y != null) { 
        // null 체크후 x와 y는 자동적으로 null 가능하지 않을 값으로 변환(cast)됩니다. 
        println(x * y) 
    } 
    else { 
        println("either '$arg1' or '$arg2' is not a number") 
    } 
} 


또는

// ... 
if (x == null) { 
    println("Wrong number format in arg1: '$arg1'") 
    return 
} 
if (y == null) { 
    println("Wrong number format in arg2: '$arg2'") 
    return 
} 

// null 체크후 x와 y는 자동적으로 null 가능하지 않을 값으로 변환(cast)됩니다. 
println(x * y) 



10. 타입 체크와 자동 형변환 사용하기

연산자(operator)는 표현식이 유형(type)의 인스턴스인지 체크합니다. 만약 변경할 수 없는(immutable) 지역변수 또는 속성(property)이 특정 유형(type)으로 확인 되면 명시적으로 형변환(cast)할 필요가 없습니다.

fun getStringLength(obj: Any): Int? { 
    if (obj is String) { 
        // 이 분기에서 'obj'는 자동적으로 'String'으로 형변환 됩니다. 
        return obj.length 
    } 

    // 'obj'는 유형 체크 분기의 밖에 있으므로 여전히 'Any' 유형 입니다. 
    return null 
} 


또는

fun getStringLength(obj: Any): Int? { 
    if (obj !is String) return null 

    // 이 분기에서 'obj'는 자동적으로 'String'으로 형변환 됩니다. 
    return obj.length 
} 


또는 심지어

fun getStringLength(obj: Any): Int? { 
    // 'obj'는 '&&'연산자의 오른편에서 자동으로 'String'으로 형변환됩니다. 
    if (obj is String && obj.length > 0) { 
        return obj.length 
    } 

    return null 
} 



11. 루프(loop) 사용하기

val items = listOf("apple", "banana", "kiwifruit") 
for (item in items) { 
    println(item) 
} 


또는

val items = listOf("apple", "banana", "kiwifruit") 
for (index in items.indices) { 
    println("item at $index is ${items[index]}") 
} 


12. while 루프(loop) 사용하기

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


13. when 표현식(expression) 사용하기

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


14. 범위(ranges) 사용하기

숫자가 특정 범위내에 있는지 확인하는데 'in' 연산자(operator)를 사용합니다.

val x = 10 
val y = 9 
if (x in 1..y+1) { 
    println("fits in range") 
} 


숫자가 범위를 벗어났는지 확인한다.

val list = listOf("a", "b", "c") 

if (-1 !in 0..list.lastIndex) { 
    println("-1 is out of range") 
} 

if (list.size !in list.indices) { 
    println("list size is out of valid list indices range, too") 
} 


범의내에서 반복합니다.

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


또는 건너 뛰면서 반복합니다.

for (x in 1..10 step 2) { 
    print(x) 
} 
println() 
for (x in 9 downTo 0 step 3) { 
    print(x) 
} 


15. 컬렉션(Collections) 사용하기

컬렉션내의 데이터를 반복합니다.

for (item in items) { 
    println(item) 
} 


컬렉션내에 특정 객체(object)가 있는지 'in' 연산자(operator)를 사용하여 체크합니다.

when { 
    "orange" in items -> println("juicy") 
    "apple" in items -> println("apple is fine too") 
} 


람다(lambda) 표현식(expressions)을 사용하여 컬렉션 필터링 및 매핑하기

val fruits = listOf("banana", "avocado", "apple", "kiwifruit") 
fruits 
  .filter { it.startsWith("a") } 
  .sortedBy { it } 
  .map { it.toUpperCase() } 
  .forEach { println(it) } 


16. 기본 클래스 및 해당 인스턴스 만들기

//  클래스를 인스턴스화 하는데 'new' 키워드가 필요 없습니다. 
val rectangle = Rectangle(5.0, 2.0) 
val triangle = Triangle(3.0, 4.0, 5.0)
반응형