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