로또 라이브 코딩

hyunji·2023년 2월 17일
0
  • lottoNumber() 객체 생성

동등성 비교 방법

  • assertThat(LottoNumber(1)).isEqualTO(LottoNumber(1))
    * 같지 않다
  • 해결책
    1. equals와 hashCode를 이용해서 객체의 넘버를 비교하면 됨
      • value object(값 객체)
    2. 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가 어떻게 작동하는지 알고 있어야함.

0개의 댓글