Java
동등성 연산
자바에서는 원시 타입을 비교하기 위해 == 을 사용한다.
이 경우 == 는 두 피연산자의 값이 같은지 비교하는데, 이를 동등성이라고 한다. 값이 동등하다는 것이다.
int a = 1
int b = 2
System.out.println(a == b) // false
동일성 연산
참조 타입인 두 피연산자 사이에 ==을 사용할 경우 주소값으로 비교를 하게 된다.
두 피연산자의 주소값이 같은 곳을 가리키고 있다면 true를 반환한다.
String의 경우 원시 타입이 아닌 참조 타입이기에, 겉으로 보이는 문자가 같아도 주소값이 다를 경우 false를 출력한다.
String a = "hi" // 주소값 : 1번지
String b = "hi" // 주소값 : 2번지
System.out.println(a==b) // false
그래서 자바에서는 두 객체(참조 타입)의 동등성을 알기 위해서 equals를 호출해야 한다.
String a = "hi" // 주소값 : 1번지
String b = "hi" // 주소값 : 2번지
System.out.println(a.equals(b)) // true
Kotlin
동등성 연산
Kotlin에서도 == 연산자가 기본이다. 하지만 Java와는 동장 방식에 차이가 있다.
원시 타입 비교를 할때는 == 연산자가 동일하게 동작하지만, 참조 타입을 비교할 때는 다르게 동작한다.
주소 값이 다른 참조 타입을 호출해도 true를 반환한다.
val a: String = "hello" // 주소값 : 1번지
val b: String = "hello" // 주소값 : 2번지
println(a == b) // true
Decompile 해보면 Kotlin에서 == 은 내부적으로 equals를 호출한다.
따라서 참조 타입인 두개의 String을 == 연산으로 비교하면 주소값이 아닌 동등성을 비교한다.
public final class MainKt {
@NotNull
private static final String a = "hello";
@NotNull
private static final String b = "hello";
@NotNull
public static final String getA() {
return a;
}
@NotNull
public static final String getB() {
return b;
}
public static final void main() {
boolean var0 = Intrinsics.areEqual(a, b);
System.out.println(var0);
}
// $FF: synthetic method
public static void main(String[] var0) {
main();
}
}
동일성 연산
참조 타입의 주소 값을 비교하려면 Java에는 없는 === 연산자를 사용해야 한다.
val a: String = "hello" // 주소값 : 1번지
val b: String = "hello" // 주소값 : 2번지
println(a == b) // true
println(a === b) // false
차이
Java | Kotlin | |
동등성 | equals | == |
동일성 | == | === |
이해를 위한 사용
객체에서 equals 는 주소 비교 와 같다.
class UserA(var id: String)
fun main(){
var user1 = UserA("0")
var user2 = UserA("0")
println(user1 == user2) //false
println(user1 === user2) //false
}
객체의 값을 비교하려면 equals 를 override 해야 한다.
class UserB(var id: String) {
override fun equals(other: Any?): Boolean {
if (this === other) return true
other as UserB
if (id != other.id) return false
return true
}
override fun hashCode(): Int {
return id.hashCode()
}
}
fun main2(){
val user3 = UserB("1")
val user4 = UserB("1")
println(user3 == user4) //true
println(user3 === user4) //false
}
Reference
https://velog.io/@wlsrhkd4023/Kotlin-동등성Equality-동일성Identify
https://noapps-code.tistory.com/143
'Kotlin > Basic' 카테고리의 다른 글
object, companion object (0) | 2024.01.02 |
---|---|
Kotlin DSL, buildSrc 의존성 주입 (0) | 2023.12.07 |
Stream Fuction (0) | 2022.03.14 |
Closure, Scope Function (let, also, run, apply, with) (0) | 2022.03.11 |
Coroutine (0) | 2022.01.17 |