[JAVA] String의 ==와 equals()의 차이점

Yejun Jang·2022년 5월 5일
0

**_ : ( ==는 주소값이 같은지 아닌지 비교하는 것이고, equals()연산도 내부적으로 주소값을 비교하지만 String클래스에서는 equals()를 재정의해 내용을 비교하게 되어있다. )

_**

  1. == 는 int, boolean 등 primitive type에 대해선 값을 비교한다.
    ( reference type에 대해선 주소값을 비교한다. )

//primitive type
int a = 10;
int b = 10;
int c = 20;

System.out.println(a==b); //true
System.out.println(a==c); //false

2. equals() : **최상위 클래스인 Object 클래스의 메서드.
(StringBuffer에선 사용 불가)

  • 정의 :
    public boolean equals(Object anObject) {
    if (this == anObject) {
    return true;
    }
    if (anObject instanceof String) {
    String anotherString = (String)anObject;
    int n = value.length;
    if (n == anotherString.value.length) {
    char v1[] = value;
    char v2[] = anotherString.value;
    int i = 0;
    while (n-- != 0) {
    if (v1[i] != v2[i])
    return false;
    i++;
    }
    return true;
    }
    }
    return false;
    }

: 주소값이 같으면 일단 true를 return,
주소값이 다를 경우엔 String 객체의 문자열을 Char 타입으로 하나씩 비교해 보면서 끝까지 같다면 true를 리턴 다르다면 false를 리턴한다.

//reference type
String text1 = "sample";
String text2 = text1;
String text3 = new String("sample");
String text4 = new String("sample");

System.out.println(text1 == text2); //true
System.out.println(text1.equals(text2)); //true
System.out.println(text3 == text4); //false
System.out.println(text3.equals(text4)); //true

text1은 new 연산자가 아닌 = "" 로 만들었기 때문에 힙(heap) 영역안에 String Constant Pool에 (주소,값) 형태로 저장됨.

그 후 = "" 로 만들어진 String객체는 String Constant Pool 안에 자신이 생성할 문자열과 같은 값이 존재하는지 찾아본다.
같은 값이 존재한다면 공간을 새로 만드는 것이 아닌, 주소값을 미리 만들어진 String Constant Pool에 있는 값에 연결함.
이렇게 같은 값을 가르키게 때문에 == 연산 , equals() 연산 둘다 true를 리턴하게 될 것이다.

profile
자바 개발자

0개의 댓글