반응형
자바에서 일반적인 데이터의 비교는 == 연산자를 사용한다.
그리고 String 문자열의 값을 비교할때에는 equals() 라는 메소드를 사용하여 비교한다.
"equals" 와 "==" 는 어떠한 차이가 있을까?
equals 는 데이터 값을 비교해주고, == 는 주소값을 비교해주는 연산자이다.
단순하게 말하면 "==" 연산자는 int, boolean 과 같은 primitive type에 대해서 비교해준다.
String 과 같은 reference type 에 대해서는 주소값을 비교한다.
String과 같은 reference type 을 생성할 때에는 두가지 방법이 존재한다.
1. 리터럴을 이용한 생성 방식
2. new 연산자를 이용한 생성 방식
리터럴을 사용하게 되면 해당 데이터가 Heap 내부에 있는 string constant pool 이라는 영역에 존재한다.
new 연산자를 통해 데이터를 할당하게 되면 Heap 영역에 바로 존재하게 된다.
public class Main
{
public static void main(String[] args) {
String str1 = "dragon";//리터럴 이용한 방식
String str2 = "dragon";//리터럴 이용한 방식
String str3 = new String("dragon");//new 연산자를 이용한 방식
String str4 = new String("dragon");//new 연산자를 이용한 방식
//identityHashCode 메서드는 해당 자료가 존재하는 메모리 주소를 나타낸다.
System.out.println("str1 : " + System.identityHashCode(str1));
System.out.println("str2 : " + System.identityHashCode(str2));
System.out.println("str3 : " + System.identityHashCode(str3));
System.out.println("str4 : " + System.identityHashCode(str4));
}
}
즉 위의 내용을 도식화 해보면 아래와 같다.
public class Main
{
public static void main(String[] args) {
String str1 = "dragon";
String str2 = "dragon";
String str3 = new String("dragon");
String str4 = new String("dragon");
System.out.println(str1 == str2);//true
System.out.println(str1 == str3);//false
System.out.println(str1.equals(str3));//true
System.out.println(str3 == str4);//false
System.out.println(str3.equals(str4));//true
}
}
반응형
'JAVA' 카테고리의 다른 글
[JAVA] JAVA GC(Garbage Collection) (0) | 2023.03.14 |
---|---|
[JAVA] JAVA 메모리 영역과 JVM 구조 - Stack, Heap, Method (0) | 2023.03.07 |
[JAVA] StringTokenizer (0) | 2022.03.23 |