동등성 비교 방법
- assertThat(LottoNumber(1)).isEqualTO(LottoNumber(1))
* 같지 않다
- 해결책
- equals와 hashCode를 이용해서 객체의 넘버를 비교하면 됨
- data class 활용
- equals와 hashCode 함수를 자동적으로 만들어준다.
동일성 비교
- 로또 넘버를 먼저 1-45 까지 만든다. 그러면 이 이외의 다른 로또 넘버 객체가 생성되지 않는다.
data class LottoNumber private constructor(private val value: Int)
- 객체를 wrapping 해서 안전함을 지키고 heap 메모리도 지키고..
- 주 생성자에 contructor 생성자가 원래 생략됨
* 이걸 드러내면 외부에서는 더이상 로또 생성을 호출 못함
동일성 비교 예제
val a = 1000
val b = 1000
assertThat(a).isEqualTo(b)
assertThat(a).isSameAs(b)
=> 통과하지 않음
val a = 1000
val b = 1000
assertThat(a==b).isTrue()
assertThat(a===b).isTrue()
=> 통과한다.
val a : Int? = 1
val b : Int? = 1
assertThat(a==b).isTrue()
assertThat(a===b).isTrue()
=> 통과
val a : Int? = 1000
val b : Int? = 1000
assertThat(a==b).isTrue()
assertThat(a===b).isTrue()
=> 통과 X
- why????
* isSameAs는 기본적으로 object 타입을 받음
- 코틀린에서 int는 기본 자료형임
- int를 integer로 wrapping해서 넘겨주지않을까?(추측)
- isSameAs(Integer.valueOf(b)) -> 로 자동으로 바뀜
- -128~127까지 캐싱되어있어 그 아래는 통과됨. 하지만 이 이외에는 다시 래핑을 해줘야하기 때문에 통과되지 않는 것임
- 코틀린에서 nullable int는 Integer로 변경된다.
Int와 Integer의 다른점을 알아야한다.
Integer로 바뀌기 때문에 Java의 Integer가 어떻게 작동하는지 알고 있어야함.