
이번 포스팅에서는 코틀린을 공부하면서 헷갈렸던 내용과, 잘못 이해했던 부분(오답)을 바로잡고 보완 하겠습니다. 연산자와 비교(동등성 vs 동일성), 제어문(if, when), 반복문(for, while) 등을 Java와 Kotlin에서 어떻게 다루는지 살펴보도록 하겠습니다. 특히 코틀린의 compareTo, 연산자 오버로딩, 스마트 캐스팅 등을 함께 정리했으니 참고하시면 좋을 것 같아요.
⚖️ 동등성과 동일성 (Equality vs Identity)
자바와 코틀린 모두 객체를 비교할 때 “동등성”과 “동일성”을 구분합니다.
- 동등성(Equality)
- 값이 같은지 비교합니다.
- Java: equals()
- Kotlin: == (내부적으로 equals() 호출)
- 동일성(Identity)
- 완전히 같은 객체(메모리 주소가 동일)인지 비교합니다.
- Java: ==
- Kotlin: ===
아래 예시 코드를 통해 확인해보겠습니다.
Java 예시
JavaMoney money1 = new JavaMoney(10_000L);
JavaMoney money3 = money1;
System.out.println(money1 == money3); // true (동일성)
System.out.println(money1.equals(money3)); // true (동등성)
Kotlin 예시
val money1 = JavaMoney(10_000L)
val money3 = money1
println(money1 === money3) // true, 동일성
println(money1 == money3) // true, 동등성
🔎 compareTo와 비교 연산자
코틀린에서 >, < 같은 비교 연산자를 사용하면 자동으로 compareTo가 호출됩니다.
- 자바에서도 compareTo를 구현해 놓으면 Collections.sort() 등에 활용 가능하지만, 직관적인 >, <는 사용할 수 없습니다(직접 compareTo(...) 호출해야 함).
- 코틀린에서는 <, > 등을 사용하면 내부적으로 compareTo(...) 호출을 시도합니다.
헷갈린 점: “data class가 compareTo를 자동 생성해준다?”
- data class는 equals, hashCode, toString 등을 자동으로 생성하지만 compareTo는 자동으로 제공하지 않습니다.
- 비교 연산을 위해서는 Comparable 인터페이스를 구현하거나 operator fun compareTo(...) 같은 메서드를 직접 정의해야 합니다.
예를 들어, 아래와 같이 Comparable을 구현하면 >, <를 간편히 사용할 수 있습니다.
class Money(val amount: Long) : Comparable<Money> {
override fun compareTo(other: Money): Int {
return this.amount.compareTo(other.amount)
}
}
// 이렇게 정의해두면...
val m1 = Money(10_000L)
val m2 = Money(2_000L)
if (m1 > m2) {
println("m1이 m2보다 큽니다")
}
➕ 연산자 오버로딩 (Operator Overloading)
코틀린에서는 operator 키워드를 통해 직접 정의한 이름 있는 메서드(e.g. plus)를 + 연산자로 사용할 수 있습니다.
data class Money(val amount: Long) {
operator fun plus(other: Money): Money {
return Money(this.amount + other.amount)
}
}
- 이렇게 작성해두면, 아래처럼 + 연산자로 후처리가 가능합니다.
val kMoney1 = Money(1_000L)
val kMoney2 = Money(2_000L)
println(kMoney1 + kMoney2) // Money(amount=3000)
✂️ if와 when (Statement vs Expression)
자바: if-else는 Statement
return이나 변수 대입에 직접 활용하기보다는 분기 로직으로만 사용됩니다. (3항 연산자가 별도로 있음)
if (score >= 50) {
return "P";
} else {
return "F";
}
코틀린: if-else는 Expression
하나의 값으로 도출될 수 있으므로, 변수에 할당하거나 바로 반환 가능합니다. 따라서 3항 연산자가 따로 없습니다.
fun getPassOrFail(score: Int): String {
return if (score >= 50) {
"P"
} else {
"F"
}
}
when 문
자바의 switch 문보다 훨씬 강력하며, 여러 조건부(= Expression)를 다룰 수 있습니다.
- 단순 분기 (== 사용, in 범위 사용)
- is 체크 (스마트 캐스팅)
- else 대신 default 처리
fun getGrade(score: Int): String {
return when (score) {
in 90..100 -> "A"
in 80..89 -> "B"
in 70..79 -> "C"
else -> "D"
}
}
🔄 반복문 (for, while)
for (전통적 for문과 range)
자바:
for (int i = 1; i <= 3; i++) {
System.out.println(i);
}
코틀린:
for (i in 1..3) {
println(i)
}
1..3
은 1부터 3까지 범위를 의미downTo
,step
으로 숫자를 감소시키거나 건너뛸 수도 있음
for-each
자바:
List<Long> numbers = Arrays.asList(1L, 2L, 3L);
for (Long number : numbers) {
System.out.println(number);
}
코틀린:
val numbers = listOf(1L, 2L, 3L)
for (number in numbers) {
println(number)
}
while
자바와 코틀린은 동일 문법:
var i = 1
while (i <= 3) {
println(i)
i++
}
🏷️ 스마트 캐스팅 (Smart Casting)
fun startsWithA(obj: Any): Boolean {
// obj가 String 타입인지 체크
return when (obj) {
is String -> obj.startsWith("A") // 여기서 obj를 String으로 자동 캐스팅
else -> false
}
}
is String
조건을 통과하면, 그 블록에서는 별도 캐스팅 코드 없이 바로 String 메서드를 사용할 수 있습니다.- 자바의
(String) obj
같은 문법 없이도 사용 가능하므로 코드가 더 간결해집니다.
✅ 정리
오늘 포스팅에서는 다음과 같은 내용들을 정리해봤습니다.
- 자바 vs 코틀린의 동등성(equals, ==)과 동일성(==, ===) 개념
- compareTo와 비교 연산자 사용 시 주의점 (data class가 자동 생성해주지 않음!)
- operator 키워드를 이용한 연산자 오버로딩(plus, compareTo 등)
- if-else, when 문이 Expression으로 동작하는 특징과 이로 인한 간결성
- for, while 반복문의 범위 표현, 중위함수(downTo, step) 사용 예시
- 스마트 캐스팅(is, as, as?) 간단 정리
다음편에도 코틀린을 학습한 내용을 정리하겠습니다.
감사합니다!
'Languege > Kotlin' 카테고리의 다른 글
[Kotlin Basic] 기초 문법 학습 5 (0) | 2025.03.12 |
---|---|
[Kotlin Basic] 기초 문법 학습 4 (0) | 2025.03.10 |
[Kotlin Basic] 기초 문법 학습 3 (1) | 2025.03.06 |
[Kotlin Basic] 기초 문법 학습 1 (0) | 2025.03.03 |