[JAVA] 동등성과 동일성

handa·2023년 3월 7일
0

==equals

String 변수 생성시 주소할당

  • 리터럴(literal)을 이용한 방식

  • new 연산자를 이용한 방식

리터럴을 사용하게 되면 string constant pool이라는 영역에 존재
new를 통해 String을 생성하면 Heap 영역에 존재

String str1 = "apple";	//리터럴 이용
String str2 = new String("banana");	//new 연산자를 이용

동일성

public static void main(String[] args) {
	int intA = 1;
    int intB = 1;
    System.out.println(intA == intB);	//true
    
    String strA = "a";
    String strB = "a";
    System.out.println(strA == strB);	//true
    
    String stringA = new String("a");
    String stringB = new String("a");
    System.out.println(stringA == stringB)	//false
}

String으로 생성된 변수들을 new 키워드로 생성한 경우 값은 동일하지만 참조 값이 서로 다르기 때문에 동일성에서는 false를 나타내고 있다.
리터럴로 생성한 경우 Heap영역 String Pool에 "a"가 생성되고 "a"를 호출하는 경우 String Pool에 존재하는 "a"의 참조값을 반환하기 때문에 동일성 비교에서 true가 출력되는 것을 알 수 있다.

동등성

public static void main(String[] args) {
	String strA = "a";
    String strB = "a";
    System.out.println(strA.equals(strB));	//true
    
    String stringA = new String("a");
    String stringB = new String("a");
    System.out.println(stringA.equals(stringB));	//true
}

두 변수가 같은 참조 값을 가지지 않더라도 같은 값을 가지고 있는 경우를 찾을 때 equals 메서드를 통해 동등성을 비교한다.

public boolean equals(Object anObject) {
	if (this == anObject) {
    	return true;
    }
    if (anObject instanceof String) {
    	String aString = (String)anObject;
        if (coder() == aString.coder()) {
        	return isLatin1() ? StringLatin1.equals(value, aString.value)
            				  : StringUTF16.equals(value, aString.value);
        }
    }
    return false;
}
public static boolean equals(byte[] value, byte[] other) {
	if (value.length == other.length) {
    	for (int i = 0; i < value.length; i++) {
        	if (value[i] != other[i]) {
            	return false;
            }
        }
        return true;
    }
    return false;
}

== 키워드로 객체가 갖다면 더 확인하지 않고 true를 리턴
객체가 다른 경우 인자가 String이라면 문자열을 비교하여 동일한지에 대한 결과를 리턴

profile
진짜 해보자

0개의 댓글