TIL 2021.02.27

Kyu·2021년 2월 27일
0

TIL

목록 보기
48/322

1. 동일성과 동등성 (VO)

미션 진행 중에 테스트코드에서 궁금증이 생겼다.

assertEquals(Piece.createBlackRook(), board.findPiece("a8"));
findPiece() 를 통해서 객체를 비교하는 메서드이다.

createBlackRook() 을 통해서 Rook의 상태를 가지는 Piece 객체를 생성하고, findPiece() 인자로 들어가는 a8은 체스판의 좌표이다.

그리고 초기화 메서드를 통해서 체스말들은 모두 만들어져있는 상태이다.

처음엔 createBlackRook() 메서드를 테스트 코드에서 다시 생성해주므로 무조건 서로 다른 객체가 될 수 밖에 없다고 생각했다. 그래서 이게 테스트하는 게 무슨 의미이지? 하고 슬랙에 물어봤다.

답변은 VO 를 공부해봐라고 했던 것!

근데 내가 배운 내용은 너무 포괄적이었던 거라 왜 지금 VO를 배워라고 하는지 몰랐던 상태였다. 그러던 중에 벨로그 내에서 Value Object로 우연히 태그 검색을 했는데 yeon의 포스트가 나와서 살펴봤는데 , "아~" 했다.

VO 란?

  • 객체의 값이 같으면 같은 객체로 보는 것
  • 객체를 값처럼 쓸 수 있다.
  • 객체의 인스턴스 변수가 생성자를 통해 설정된 이후에는 절대 변하지 않음을 보장
  • value를 담는게 주 목적이다.
  • ==로 비교할 수 있다. 값이 같으면 같은 객체라고 본다.
  • 고유하게 갖고있는 unique한 값(식별할수 있는 값)이 없다.

핵심은 "객체의 값이 같으면 같은 객체로 보는 것" 이었다.

그래서 VO를 공부해봐라고 했구나 하고 생각했다.

노을이 알려준 포스트 를 통해서 VO를 공부하고 자세히 알게 됐다. 핵심은 equals() 를 재정의해서 객체가 같은 상태이면 같도록 하는 것이었다.

배운 내용을 토대로 재정의는 잘했다. 테스트도 잘 통과했다.

그런데 내가 재정의한 equals 를 사용했다고 생각하지 않았었는데, AssertJ의 assertThat().isEqualTo()를 사용하니까 자동으로 내가 재정의한 equals를 사용했는지 테스트를 잘 통과했다는 게 이상했다.

이 내용은 내가 상속,오버라이드에 대해서 학습하고 있던 걸 잊어버려서 이상하다고 생각하는 건지, 아니면 isEqualTo 내부적으로 인자로 넣었던 Piece 객체의 equals 를 쓰도록 코딩이 되어있는 건지 잘 모르겠다.

일단 내일은 상속을 다시한번 빠르게 공부해봐야겠다.

배운 내용 정리
동일성과 동등성 Value Object

profile
TIL 남기는 공간입니다

1개의 댓글

comment-user-thumbnail
2021년 2월 28일

이 내용은 내가 상속,오버라이드에 대해서 학습하고 있던 걸 잊어버려서 이상하다고 생각하는 건지, 아니면 isEqualTo 내부적으로 인자로 넣었던 Piece 객체의 equals 를 쓰도록 코딩이 되어있는 건지 잘 모르겠다.

상속을 공부해보니 역시 오버라이드한 것은 직접 불러서 사용해줘야한다. 아마도 isEqualTo 내부적ㅇ로 인자로 넣었던 Piece 객체의 equals를 쓰도록 코딩되어있는거같다

답글 달기