[개발 일기] 2025.01.26 - 논리적 동치성 (Feat : equals())

2025. 1. 26. 22:54·개발 일기

개요

 

이펙티브 자바 책을 읽다가 equals() 메서드에 대해 보고 있었는데, 논리적 동치성이라는 단어가 나왔다.

 

 

== 연산자와 equals() 메서드의 차이점에 대해서는 알고 있었다.

 

 

하지만 논리적 동치성이라는 단어는 익숙하지 않아서 오늘 정리해 보겠다.

 

 

 

논리적 동치성

 

논리적 동치성은 참조 타입 두 객체가 내용(상태)이 같음을 의미한다.

 

 

이를 풀어서 설명하면 두 객체가 가지고 있는 특정 변수의 값이 동등하다면 ‘논리적으로 같다’라고 한다.

 

 

다음은 논리적 동치성을 비교하는 예시 코드이다.

 

public class LogicalEquivalence {
    public static void main(String[] args) {
        String s1 = "test";
        String s2 = "test";
        String s3 = new String("test");
        String s4 = new String("test");
        StringBuilder s5 = new StringBuilder("test");
        StringBuilder s6 = new StringBuilder("test");

        System.out.println(s1.equals(s2));
        System.out.println(s3.equals(s4));
        System.out.println(s5.equals(s6));
    }
}
[결과]
true
true
false

 

s1.equals(s2)

s1과 s2는 리터럴 방식으로 생성된 문자열이다. 리터럴 방식은 같은 문자열 내용을 가진 객체가 생성된다면 String Contant Pool에서 문자열을 재사용하기 때문에 s1.eqals(s2)는 true이다. 뿐만 아니라 s1 == s2도 true이다.

 

 

s3.equals(s4)

s3과 s4는 생성자를 사용해 생성된 문자열이다. 이는 리터럴 방식은 아니기 때문에 순수한 힙 영역에 문자열이 저장된다. 그렇기 때문에 s3 == s4는 false이지만, 두 문자열 내용은 test로 동일하기 때문에 s3.equals(s4)는 true이다.

 

 

s5.equals(s6)

유일하게 false가 반환되었다. 이를 위해선 일단 StringBuilder.equals() 메서드를 보자.

 

 

…? equals() 메서드가 없다..

 

 

일단 저 주석을 해석하면 다음과 같다.

 

StringBuilder는 Comparable을 구현했지만, equals()를 재정의하지 않았다. 자연스러운 순서와 equals()가 불일치하면 주의가 필요하다.

 

내가 보기엔 StringBuilder.equals()는 따로 재정의되지 않은 Object.equals()인 것으로 판단된다.

 

 

그렇다면 Object.equals()는 어떻게 생겼을까?

 

 

보다시피 return this == obj; 가 전부이다.

 

 

우리가 비교하고자 하는 것은 StringBuilder의 문자열 내용이다.

 

 

우리가 원하는 기능을 가진 equals() 메서드는 다음과 같다.

 

boolean equals(StringBuilder sb1, StringBuilder sb2) {
     return sb1.toString().equals(sb2.toString());
}

 

위의 메서드를 적용하면 다음과 같다.

public class LogicalEquivalence {
    public static void main(String[] args) {
        String s1 = "test";
        String s2 = "test";
        String s3 = new String("test");
        String s4 = new String("test");
        StringBuilder s5 = new StringBuilder("test");
        StringBuilder s6 = new StringBuilder("test");

        System.out.println(s1.equals(s2));
        System.out.println(s3.equals(s4));
//        System.out.println(s5.equals(s6));
        System.out.println(equals(s5, s6));
    }

    static boolean equals(StringBuilder sb1, StringBuilder sb2) {
        return sb1.toString().equals(sb2.toString());
    }
}
[결과]
true
true
true

 

이처럼 객체의 내용을 비교할 때, 사용되는 equals() 메서드가 재정의된 메서드인지 아닌지 확인하고 사용해야 한다.

'개발 일기' 카테고리의 다른 글

[개발 일기] 2025.01.28 - 이분탐색 (Lower Bound, Upper Bound)  (0) 2025.01.28
[개발 일기] 2025.01.27 - Nginx (Feat : Apache Web Server)  (0) 2025.01.27
[개발 일기] 2025.01.25 - volatile  (1) 2025.01.25
[개발 일기] 2025.01.24 - 낙관적 락 vs 비관적 락  (0) 2025.01.24
[개발 일기] 2025.01.23 - 직렬화  (0) 2025.01.23
'개발 일기' 카테고리의 다른 글
  • [개발 일기] 2025.01.28 - 이분탐색 (Lower Bound, Upper Bound)
  • [개발 일기] 2025.01.27 - Nginx (Feat : Apache Web Server)
  • [개발 일기] 2025.01.25 - volatile
  • [개발 일기] 2025.01.24 - 낙관적 락 vs 비관적 락
오도형석
오도형석
  • 오도형석
    형석이의 성장일기
    오도형석
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • MSA 모니터링 서비스
        • DB
      • 스파르타 코딩클럽
        • SQL
        • Spring
      • 백엔드
        • Internet
        • Java
        • DB
      • 캡스톤
        • Django
        • 자연어처리
      • Spring
        • JPA
        • MSA
      • ETC
        • ERROR
      • 개발 일기 N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 인기 글

  • 태그

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
오도형석
[개발 일기] 2025.01.26 - 논리적 동치성 (Feat : equals())
상단으로

티스토리툴바