본문 바로가기
Java

equals()와 ==

by KDW999 2023. 1. 3.

String 변수를 생성하는 2가지 방법이 있다고 한다.

1. 리터럴 방식 // String a = "뉴진스";

2. new 연산자 방식 // String a = new String("뉴진스");

이 때 까진 항상 1번 방식만 써왔기에 2번 방법은 이번에 처음 보았다.

1번 방식의 경우 String 변수값은 Pool 영역에,  2번 방식의 경우 Heap 영역에 존재한다고 한다.

 

Pool 영역은 변수명이 달라도 변수값이 같으면 같은 곳을 바라보고, Heap 영역은 변수값이 같아도 다른 곳에 저장된다.

 

이런 느낌?

간단히 eqauls()는 값 비교, ==은 주소값 비교라고 보면 된다.

그렇기에 리터럴 끼리는 값이 같으면 같은 주소를 공유하기에 ==을 써도 true고 값도 같으니 equals()를 써도 true이다.

허나 new 끼리는 값이 같으면 ==을 써도 주소값이 다르기에 false가 되나, 값은 같기에 equals()를 쓰면 true이다.

++ String은 클래스 형태라 주소값이 존재하나 우리가 자주쓰는 int 타입의 경우 주소값이 없기에 값비교로 ==을 써도 무방(하다는 것 같다)

public class Test {

	public static void main(String[] args) {
    
		String a1 = "뉴진스"; 
		String a2 = "뉴진스"; 
		String a3 = new String("뉴진스");
                String a4 = new String("뉴진스");
        
                if(a1 == a2) System.out.println("1. 리터럴 == 리터럴"); 
        // 같은 주소를 공유하기에 출력된다.
		if(a1 == a3) System.out.println("2. 리터럴 == new"); 
        // 다른 주소를 가지기에 출력되지 않는다.
		if(a3 == a4) System.out.println("3. new == new"); 
        // 다른 주소를 가지기에 출력되지 않는다.

		if(a1.equals(a2)) System.out.println("4. 리터럴 equals 리터럴"); 
        // 같은 값을 가지기에 출력된다.
		if(a1.equals(a3)) System.out.println("5. 리터럴 eqauls new"); 
        // 같은 값을 가지기에 출려된다.
		if(a3.equals(a4)) System.out.println("6. new eqauls new"); 
        // 같은 값을 가지기에 출력된다.
        }
}

 

 

처음엔 Scanner 사용 시 == 을 썼을 때 원하는 대로 흘러가지 않아서 찾아보게 되었다.

스캐너도 new 연산자를 사용하여 객체 선언하기에 new 방식과 같지 않을까 생각한다. [스캐너도 값이 같아도 ==으론 true가 나오지 않았고 equals()를 썼을 때 true가 되었다.]

더 찾을까 하다 너무 디테일하게 따지면 파도파도 끝이 없을 것 같았다.

문자열이면 그냥 equals()를 쓰자..

 

참고 : https://coding-factory.tistory.com/536

 

댓글