-
[JAVA JUnit] assertThat의 isSameAs와 isEqaulTo 비교 분석프로그래밍 언어/JAVA 2022. 10. 1. 13:07
JUnit의 Assertions.assertThat을 이용해 테스트코드를 작성할 때 isSameAs와 isEqualTo 어떤 것을 사용해야되는가?를 이해하기 위해 포스팅으로 정리해볼까 한다.
📑 == 과 equlas()
https://wonisdaily.tistory.com/38
앞서 포스팅한 내용에서 설명한 적 있지만, 기본형과 참조형을 비교할 때 기본형은 == 참조형은 equals()로 비교하는 것은 알고 있을 것이다. 그렇다면 why? 의문점을 가지게 된다.
다음과 같이 변수를 값을 저장한다고 할 때 생성되는 객체는 3개이다. 아래 그림을 보면 이해하기가 쉬운데,
String str1 = "abc";
String str2 = "abc";
Strring str3 = new String("abc");
String str4 = new String("abc");📌 String 클래스의 생성자를 이용한 경우 new 연산자에 의해 메모리할당이 이루어지기 때문에 항상 새로운 String 인스턴스가 생성된다. 그러나 문자열 리터럴은 이미 존재하는 것을 재사용하는 것이다.
즉) srt1과 str2은 같은 값을 참조하고 있기에 주소값이 같다. 하지만 str3, str4는 서로 다른 객체를 생성하므로 값은 같을지라도 주소값은 다른 걸 확인할 수 있다. 그렇기 때문에 객체는 ==가 아닌 String 클래스의 equals() 메서드를 통해 값을 비교할 수 있다.
==는 (call by reference)로 주소의 값을 비교한다. 실제의 값이 아닌 자료의 위치값을 비교하는 것! 그렇다면 equlas() 메서드는 어떤 의미가 있을까?
equlas() 메서드는 (call by value)로 객체끼리의 내용, 즉) 두 문자열 구성이 같은지를 확인한다.
Object의 equals() 메서드를 오버라이딩한다고 생각하면 되는데 oveeride의 목적은 다른 메모리에 위치하는 객체여도 논리적으로 동일함을 구현하기 위한 것이다. 물리적으로 다른 메모리( ==비교를 통한 주소값이 다르다르더라도) , 논리적으로 동일함( 값 비교(equals)를 통해 같은 값이기만 한다면 같은 객체임을 보장함을 의미한다.
📑 isSameAs와 isEqualTo 비교
isSameAs는 자바에서 ==를 뜻한다. 즉) 참조값이 같은지만 비교하 것으로 참조갑이 같다면 true를 반환한다.
isEqualTo는 자바에서 equals()를 뜻한다. 즉) 같은 참조값이 아니더라도 두 문자열의 구성이 같다면 true를 반환한다.
@Test @DisplayName("isSameAs와 isEqualTo 이해하기1 - 기본형, 같은 문자열") void primaryCompare(){ String str1 = "abc"; String str2 = "abc"; assertThat(str1).isEqualTo(str2); //true assertThat(str1).isSameAs(str2); //true } @Test @DisplayName("isSameAs와 isEqualTo 이해하기2 - 참조형, 객체일 때 ") void referenceCompare(){ String str1 = "abc"; String str2 = new String("abc"); //isEqualTo 는 같은 객체인지도 비교하며, //같은 참조값이 아니더라도 String 클래스의 equals() 메서드에 따라 두 문자열의 구성이 같다면 true을 반환합니다. assertThat(str1).isEqualTo(str2); //true //isSameAs는 두 객체의 참조값이 같은지만 비교하기 때문에 위 예제에서는 false를 반환 assertThat(str1).isSameAs(str2); //false }
반응형'프로그래밍 언어 > JAVA' 카테고리의 다른 글
[Servlet] HttpServletRequest, HttpServletResponse 파헤치기 (1) 2022.10.11 [JAVA ] 직렬화(Serialization)와 역직렬화(Deserialization) (0) 2022.10.11 [JAVA] static import에 대하여 ( +IntelliJ에서 사용하기) (0) 2022.09.29 [Java Junit] AssertJ 메서드 사용법 알아보기 (0) 2022.09.27 [ch14 람다식] 작성법 예제, 함수형 인터페이스(Functional Interface) (0) 2022.09.27