본문 바로가기
Language/Java

[JAVA] 문자열 비교 - ==, equals() 차이점

by IsBerry 2021. 7. 6.
반응형

[JAVA] 문자열 비교 -  ==, equals() 차이점

 


Java에서 일반적으로 데이터 타입의 비교는 == 이라는 연산자를 사용하여 비교합니다.

String을 비교할 때에는 ==이 아닌 equals() 라는 메소드를 사용하여 비교합니다.

String 변수 생성 시 주소할당

String 변수를 생성할 때는 두가지 방법이 있습니다.

- 1. 리터럴을 이용한 방식

- 2. new 연산자를 이용한 방식


위 두가지 방식에는 큰 차이점이 있습니다.


String을 리터럴로 선언할 경우 "string constant pool" 이라는 영역에 존재하게 됩니다
내부적으로 String의 intern()메서드가 호출하게 되는데

-> intern() 메서드는 주어진 문자열이 string constant pool에 존재하는지 검색하고 있다면 그 주소값을 반환하고 없으면, string constant pool에 넣고 새로운 주소값을 반환합니다.


new 연산자를 이용해 String을 생성하면 Heap영역에 존재하게 됩니다.

 

주소값 비교 ( == )와 값 비교 (equals)

== 연산자와 String 클래스의 equals() 메소드의 가장 큰 차이점은
== 연산자는 비교하고자 하는 두개의 대상의 주소값을 비교하고,
String클래스의 equals 메소드는 비교하고자 하는 두개의 대상의 값 자체를 비교합니다.

일반적인 타입들 int, char형 등은 Call by Value 형태로 기본적으로 대상에 주소값을 가지지 않는 형태로 사용됩니다.
하지만, String은 일반적인 타입이 아니라 클래스 입니다. 클래스는 기본적으로 Call by Reference형태로 생성 시 주소값이 부여됩니다. 그렇기에 String 타입을 선언했을 때는 같은 값을 부여하더라도 서로간의 주소값이 다를 수가 있습니다.

 

문자열 비교 ( == 연산자)

public class compare {
    public static void main(String[] args) {
        String s1 = "abcd";
        String s2 = new String("abcd");
		
        if(s1 == s2) {
            System.out.println("두개의 값이 같습니다.");
        }else {
            System.out.println("두개의 값이 같지 않습니다.");
        }
    }
}

== 연산자의 경우 객체의 주소값을 비교하기 때문에 일반 객체처럼 Heap 영역에 생성된 String 객체와 리터럴을 이용해 string constant pool에 저장된 String 객체의 주소값은 다를 수 밖에 없습니다.


문자열 비교 (eqauls 메소드)

public class compare {
    public static void main(String[] args) {
        String s1 = "abcd";
        String s2 = new String("abcd");
		
        if(s1.equals(s2)) {
            System.out.println("두개의 값이 같습니다.");
        }else {
            System.out.println("두개의 값이 같지 않습니다.");
        }
    }
}

String 클래스안에 있는 equals라는 메서드를 사용하면 두 비교대상의 주소 값이 아닌 데이터값을 비교하기 때문에 어떻게 String을 생성하느냐에 따라 결과가 달라지지 않고 정확한 비교를 할  수 있습니다.

출처

https://coding-factory.tistory.com/536?category=758267

 

반응형

'Language > Java' 카테고리의 다른 글

[JAVA] String, StringBuffer, StringBuilder  (0) 2021.07.06
[JAVA] 래퍼 클래스 - Wrapper Class  (0) 2021.07.06
[Java] Socket Programming - UDP  (0) 2019.04.30
[Java] InputStream, OutputStream 개념  (0) 2019.04.30
[Java] UUID 사용법  (0) 2019.01.16