코틀린에서는 대표적으로 산술, 대입, 복합대입, 증감, 비교, 논리, 비트연산자가 있다.
이 연산자들이 무엇인지, 그리고 우선순위에 대해 알아보자.
1. 산술 연산자
산술 연산자는 덧셈, 뺄셈, 곱셈, 나눗셈, 나머지 연산을 수행하는 연자이다.
Operator | Description | Example |
+ | 덧셈 | a+b |
- | 뺄셈 | a-b |
* | 곱셈 | a*b |
/ | 나눗셈 | a/b |
% | 나머지 연산 | a%b |
// 산술 연산자
var a = 5
var b = 3
var sum = a + b // 8
var difference = a - b // 2
var product = a * b // 15
var quotient = a / b // 1
var remainder = a % b // 2
나머지 연산자는 나머지를 수행하였을 때, 몫과 나머지가 생길 때의 나머지를 나타낸다.
2. 대입 연산자
대입 연산자는 변수에 값을 할당(대입)할 때 사용하는 연산자이다.
Operator | Description | Example |
= | 값 할당 | x=5 |
// 대입 연산자
var number : Int = 22
3. 복합대입연산자
복합대입 연산자는 대입 연산자와 산술 연산자를 결합하여 수행하여 결과를 왼쪽 변수에 할당한다.
Operator | Description | Example |
+= | a=a+b, a에 b를 더한 결과를 a에 할당 | a+=b |
-= | a=a-b, a에 b를 뺀 결과를 a에 할당 | a-=b |
*= | a=a*b, a에 b를 곱한 결과를 a에 할당 | a*=b |
/= | a=a/b, a에 b를 나눈 결과를 a에 할당 | a/=b |
%= | a=a%b, a에 b를 나머지 연산 결과를 a에 할당 | a%=b |
// 복합대입연산자
var a = 5
var b = 3
a += b // a = 8
b -= 2 // b = 1
a *= b // a = 8
b /= 2 // b = 0
a %= 3 // a = 2
4. 증감연산자
변수의 값을 1씩 증가하거나 감소하는 연산자이다.
Operator | Description | Example |
++ | 1씩 증가 | a++, ++a |
-- | 1식 감소 | a--, --a |
연산자를 어디에 붙이느냐에 따라 값이 달라지는데, ++a같이 연산자를 앞에 붙일 경우, +연산이 먼저 시작되고 그다음에 값이 할당된다.
반면, a++같이 연산자를 뒤에 붙일 경우, a의 값이 먼저 할당 된 후, +연산이 나중에 시작된다.
// 증감 연산자
var a = 5
var b = a++
println(a) // 6
println(b) // 5
a에 5를, b에 a++을 할당했다.
a++, +연산자가 변수의 뒤에 있으므로 b=a가 먼저 수행된 후, 나중에 +1 연산이 수행된다.
// 증감 연산자
var a = 5
var b = ++a
println(a) // Output: 6
println(b) // Output: 6
이 코드는 a에 5를 할당하고, b에 ++a를 할당했다.
++a, ++연산자가 변수의 앞에 있으므로 +1연산이 먼저 시작되고 그 후 b=a연산이 나중에 수행된다.
이는 헷갈리기 매우 쉬운데 ++a와 a++ 중 어느 연산자가 먼저 오느냐에 따라 다르다.
++연산자가 앞에 있으면 +1을 한 후, 대입할 것.
a가 앞에 오면 b=a 연산을 수행하고, +1을 수행할 것.
이렇게 기억하고 있으면 되겠다.
5. 비교연산자
비교 연산자는 말 그대로 비교를 하는 연산자이다.
두 변수 객체를 비교하여 Boolean 형식인 참 또는 거짓으로 결과가 나온다.
Operator | Description | Example |
== | 같음 | a == b |
!= | 다름 | a != b |
< | 왼쪽 변수가 더 작음 | a < b |
> | 왼쪽 변수가 더 큼 | a > b |
<= | 왼쪽 변수가 더 작거나 같음 | a <= b |
>= | 왼쪽 변수가 더 크거나 같음 | a >= b |
=== | 객체가 같음 | a === b |
!== | 객체가 다름 | a !== b |
// 비교 연산자
var x = 5
var y = 3
var isEqual = x == y // false
var isNotEqual = x != y // true
var isLessThan = x < y // false
var isGreaterThan = x > y // true
var isLessThanOrEqual = x <= y // false
var isGreaterThanOrEqual = x >= y // true
==과 ===은 모두 비교를 위해 사용되지만 의미가 다르다.
== 일 경우, 값을 비교하여 동일한지 여부를 확인한다.
=== 일 경우, 참조를 비교하여 동일한 개체를 참조하는지 확인한다.
참조를 비교한다는 뜻은 다음과 같다.
객체를 생성하면 그 객체의 참조값(Reference Value)이 메모리 상의 주소를 가리키게 된다.
따라서, 객체가 같은 메모리 주소를 가리키는지 비교한다는 의미이다.
아래 코드를 확인해보자.
// ==, === 차이
var str1 = "hello"
var str2 = "hello"
var str3 = str1
println(str1 == str2) // true
println(str1 === str2) // true
println(str1 === str3) // true
var obj1 = Any()
var obj2 = Any()
var obj3 = obj1
println(obj1 == obj2) // false
println(obj1 === obj2) // false
println(obj1 === obj3) // true
str1과 str2는 "hello" 문자열이 할당되어 있고, str3 은 str1의 값이 할당되어 있다.
str1과 str2는 동일한 값을 가지고 있기 때문에 true를 반환한다.
str1과 str2의 참조를 비교하는데 str1에 'hello'를 할당하였다.
만약, 동일한 문자열이 등장하면 이전에 생성한 문자열을 재활용한다.
때문에, str1과 str2를 === 비교를 했을 때에도 true를 반환하는 것이다.
str1과 str3도 동일한 참조값을 가지고 있기 때문에 true를 반환한다.
obj1는 Any()라는 인스턴스를 할당하는데, 이때 새로운 메모리 공간에 Any()의 인스턴스가 생성된다.
obj2도 Any()라는 인스턴스를 할당하는데, 이때도 새로운 메모리 공간에 Any()의 인스턴스가 생성된다.
obj3는 obj1의 값을 할당하는데, 이때 obj3는 obj1과 같은 메모리 주소를 참조하게 된다.
obj1과 obj2를 ==으로 비교했을 때, 서로 다른 인스턴스 값을 가지기 때문에 false를 반환한다.
obj1과 obj2를 ===으로 비교했을 때, 서로 다른 인스턴스로 다른 메모리 공간에 Any()가 생성됐기 때문에 false를 반환한다.
obj1과 obj3는 같은 메모리 상의 주소를 가지고 있기 때문에 true를 반환한다.
6. 논리연산자
논리 연산자는 참/거짓을 판단하는 논리식에서 사용되는 연산자로, 두 개 이상의 조건을 판단하여 결과를 참(true) 또는 거짓(false)으로 반환한다.
Operator | Description | Example |
&& | 논리 곱 (AND) | a && b |
|| | 논리 합 (OR) | a || b |
! | 논리 부정 (NOT) | !a |
&& 연산자는 두 개의 식이 모두 true일 때만 true를 반환하며, 그 외의 경우는 false를 반환한다.
|| 연산자는 두 개의 식 중 하나 이상이 true일 때 true를 반환하며, 모두 false일 경우일 때만 false를 반환한다.
! 연산자는 식의 결과가 true이면 false, false이면 true를 반환한다.
// 논리 연산자
var a = true
var b = false
println(a && b) // false
println(a || b) // true
println(!a) // false
7. 비트 연산자
비트 연산자는 비트 단위의 연산을 수행하는 연산자이다.
이진수를 다루며, 정수형에서만 사용할 수 있다.
Operator | Description | Example |
and | 비트의 AND 연산 | a and b |
or | 비트의 OR 연산 | a or b |
xor | 비트의 XOR 연산 | a xor b |
inv | 비트 반전 연산 | a inv b |
shl | 왼쪽 시프트 연산 | a shl b |
shr | 오른쪽 시프트 연산 | a shr b |
ushr | 부호없는 오른쪽 시프트 연 | a ushrb |
정수를 이진수로 나타내어 연산한다.
and 연산은 0과 1을 비교하여 두 값이 모두 1일 경우에만 1을 반환한다.
or 연산은 0과 1을 비교하여 두 값이 모두 0일 경우에만 0을 반환한다.
xor 연산은 두 개의 비트가 서로 다를 때 1을 반환하고, 같을 때 0을 반환한다.
inv 연산은 비트를 반전시킨다.
shl 연산은 비트를 왼쪽으로 이동하여 새로운 값을 반환한다.
shr 연산은 비트를 오른쪽으로 이동시켜 새로운 값을 반환한다.
ushr 연산은 부호 없는 오른쪽 시프트 연산을 수행하며, 새로운 값을 반환한다.
// 비트 연산자
val a = 3
val b = 5
val andResult = a and b // 0001 (1)
val orResult = a or b // 0111 (7)
val xorResult = a xor b // 0110 (6)
val invResult = a.inv() // 11111111111111111111111111111100 (-4)
val shlResult = a shl 1 // 0110 (6)
val shrResult = a shr 1 // 0001 (1)
val ushrResult = a ushr 1 // 0001 (1)
8. 우선순위
우선순위 | 연산자 | 설명 |
1 | () | 괄호 |
2 | !, ++, -- | 논리 부정, 증감 연산자(전위) |
3 | *, /, % | 곱셈, 나눗셈, 나머지 연산 |
4 | +, - | 덧셈, 뺄셈 |
5 | in, !in | 범위 검사 |
6 | <, <=, >, >= | 작음, 작거나 같음, 큼, 크거나 같음 |
7 | ==, != | 같음, 다름 |
8 | & | 비트 논리곱 |
9 | ^ | 비트 배타적 논리합 |
10 | | | 비트 논리합 |
11 | && | 논리곱 |
12 | || | 논리합 |
13 | ?: | 엘비스 연산자 |
14 | =, +=, -=, *=, /=, %=, &=, |=, ^=, shr=, shl=, ushr= | 대입 연산자, 복합대입연산 |
'Kotlin' 카테고리의 다른 글
[Kotlin] 코틀린 조건문 if-else 와 when 사용법 파헤치기 (0) | 2023.05.03 |
---|---|
[Kotlin] 코틀린 메소드 (Method) 선언하기 : 메소드 정의, 함수의 타입, 매개변수, 반환값 정의 방법 (0) | 2023.05.02 |
[Kotlin] 코틀린 NULL (널) (0) | 2023.04.07 |
[Kotlin] 코틀린 기본 자료형(Primitive type)과 참조 자료형(Reference type) (2) | 2023.04.05 |
[Kotlin] 코틀린 변수 선언과 네이밍 (feat. property) (0) | 2023.04.03 |