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 | =, +=, -=, *=, /=, %= |