Kotlin 연산자(Operators)


연산자 (Operators)

연산자 정류는 다음과 같다.

산술 연산자 (additiveOperator, multiplicativeOperator)

산술 연산자는 덧셈, 뺄셈, 나누셈, 곱셈 그리고 나머지 연산을 수행한다.

expr1 + expr2         // 더하기 
expr1 - expr2         // 빼기 
expr1 * expr2         // 곱하기 
expr1 / expr2         // 나누기 
expr1 % expr2         // 나머지 

대입 연산자

대입 연산자는 특정 변수에 값을 넣을 때 사용하는 연산자이다.

var = value           // 대입 

복합 대입 연산자

복합 대입 연산자는 산술 연산자와 대입 연산자를 합친 연산자이다.

var += value          // var = var + value 와 등가 
var -= value          // var = var - value 와 등가 
var *= value          // var = var* value 와 등가 
var /= value          // var = var / value 와 등가 
var %= value          // var = var % value 와 등가 

양수, 음수 및 증감 연산자

증가 연산자는 변수의 값을 1씩 더하거나 1씩 빼는 연산자이다.

+var                 // 양수
-var                 // 음수
var++                // 후위(postfix) 증가 연산자 (증가 전 값을 반환)
++var                // 전위(prefix) 증가 연산자 (증가  값을 반환)
var--                // 후위(postfix) 감소 연산자 (감소 이전 값을 반환)
--var                // 전위(prefix) 감소 연산자 (감소  값을 반환)

비교 연산자 (equalityOperator, comparisonOperator)

비교 연산자는 두 변수의 대소 관계나 값, 객체를 비교할 사용한다.

expr1 == expr2       // 동일하다
expr1 != expr2       // 같지 않다
expr1 === expr2      // 같다 (참조 비교) 
expr1 !== expr2      // 같지 않다 (참조 비교) 
expr1 < expr2        // 작다
expr1 <= expr2       // 같거나 작다
expr1 > expr2        // 크다.
expr1 >= expr2       // 같거나 크다

논리 연산자

논리 연산자는 참(true), 거짓(false)을 다룬다.

!expr1               // 부정 (NOT) 
expr1 && expr2       // 논리적 (AND) 
expr1 || expr2       // 논리합 (OR) 

배열 및 범위 연산자

arr[...]             // 배열 요소를 참조 
*arr                 // 스프레드 연산자 (배열 열기) 
n..m                 // 범위(range)
var in arr           // 포함한다 

nullsafe 연산자

var?.prop           // var이 null이면 null, 그렇지 않으면 var.prop (Safe call) 
var ?: expr         // var이 null가 아니면 var, 그렇지 않으면 expr (Elvis operator) 
var!!               // var이 null가 아니라고 선언

null를 참조하는 것을 매우 위험하다. null인 값을 참조하게 되면 NullPointExcepion을 발생하게 되는데 코틀린에서는 이런한 예외를 발생시키지 않게 하기 위해 Nullable 타입을 제공한다.

fun moneyStatus(name: String, money: Int?): String? {
    return "$name 님의 재산은 ${money?:"0"}원 입니다."
}

fun main(args:Array<String>) {
    var name1: String = "devkuma" // non-null
    //name1 = null // error
    var name2: String? = "kotlin"
    name2 = null;

    println("name1.length = ${name1.length}")
    println("name2.length = ${name2?.length}")

    println(moneyStatus("kimkc",2000000000))
    println(moneyStatus("devkuma",null))

    val framework:String? = "spring"
    println(framework?.uppercase())

    val library:String? = null
    println(library?.uppercase())
    println(library!!.uppercase());
}
name1.length = 7
name2.length = null
kimkc 님의 재산은 2000000000원 입니다.
devkuma 님의 재산은 0원 입니다.
SPRING
null

? 연산자

코틀린에서 기본적인 변수 선언을 할 때는 null을 가질 수 없다. 그래서 일반 변수에 null을 대입하면 컴파일 오류가 발생한다. null을 선언하고 싶다면 nullable한 변수으로 변경해야 하야 하는 변수 뒤에 물음표(?)를 붙여주면 된다.

var a:String? = null

위에 a의 값은 null일 수 있다는 것을 의미한다.

var a:String = "devkuma"
var b:String = null
println(a.length) // 7
println(b?.length) // null

b.length는 b가 null이기 때문에 length로 참조하면 NullPointExcption이 발생한다. b?.length라고 하면 null이 반환다.

!! 연산자

var b:String? = null
println(b!!.length) // NPE

null이 아니면 해당 값을 반환하고, null이면 NullPointException이 발생한다.

엘비스(?:) 연산자

var library:String? = null
println(library?.uppercase())
//println(library!!.uppercase())
println("라이브러리 ${library ?: "없습니다."}")

엘비스(elvis) 연산자는 삼항연선자와 비슷하게 쓰이는데 nullable한 변수가 null을 반환할 때 null 대신 반환할 값을 지정할 있다.

엘비스 연산자는 오른쪽으 로90도 돌려 보게 물음표(?)는 머리, 콜론(:)은 눈으로 보일 것이다. 이 모양이 엘비스를 닮았다고 해서 붙여진 이름이다.

람다 및 함수, 조건 연산자

args -> expr        // 람다 식 
type1 -> type2      // 함수의 형태 정의 
cond -> stmt        // when 식 조건 처리 

그밖에 연산자

::func              // 함수 참조 
@annotation         // 주석 
label@              // 라벨

연산자 우선 순위 (Operator precedence)

연산자마다 실행되는 순서가 있다. 연산자가 여러개일 경우에는 우선 순위에 따라 순서가 정해진다.

우선순위 명칭 연산자
Highest Postfix ++(후위), --(후위), ., ?., ?
2 Prefix -, +, ++(전위), --(전위), !, label
3 Type RHS :, as, as? (자료형을 바꿀 때 쓰는 연산자)
4 Multiplicative *, /, %
5 Additive +, -
6 Range .. (범위를 나타내는 연산자)
7 Infix function simpleIdentifier
8 Elvis ?:
9 Named checks in, !in, is, !is (각각 범위와 타입 체크를 위해 쓰입니다.)
10 Comparison <, >, <=, >=
11 Equality ==, !=, ===, !==
12 Conjunction &&
13 Disjunction `
14 Spread operator *
Lowest Assignment =, +=, -=, *=, /=, %=

참조