java에서 equals()와 ==의 차이점은 무엇인가요
1. “equals” 메서드
원래 equals()의 경우 Object 클래스의 메서드이고 이는 == 연산자와 동일하게 주소값을 비교를 수행하는 메서드 흔히 우리가 문자열 비교를 위해 사용하는 equals()의 경우 String 클래스에서 오버라이딩을 함으로써 문자열 간의 비교 가능
2. “==” 연산자
== 연산자의 경우 객체의 주소값을 비교 -> 비교하는 객체가 동일한 객체인지를 판별 Primitive Type의 객체에 대해서는 값 비교가 가능하고, Reference Type에 대해서는 주소 비교를 수행
이를 더 엄밀하게 서술하면 Primitive Type의 객체는 Constant Pool의 특정한 값을 참조하는 변수이기에, 결국 Constant Pool내의 동일한 주소를 비교함.(해당 주소가 동일하기에 ==을 사용해서 비교가 가능)
String에서 equals()와 ==
String 변수를 생성할때는 두가지 방법
- 리터럴을 이용한 방식 new 연산자를 이용한 방식. 리터럴을 사용하게 되면 string constant pool이라는 영역에 존재하게 되고 new를 통해 String을 생성하면 Heap 영역에 존재
String을 리터럴로 선언할 경우 내부적으로 String의 intern() 메서드가 호출되게 되고 intern() 메서드는 주어진 문자열이 string constant pool에 존재하는지 확인하고 있으면 그 주소값을 반환하고 없으면 string constant pool에 넣고 새로운 주소값을 반환
String str1 = "test";
String str2 = "test";
String str3 = new String("test");
String str4 = new String("test");
주소값 비교(==)와 값 비교(equals)
==연산자와 equals()메서드의 차이점은 == 연산자는 비교하는 두 대상의 주소값을 비교하는데 반해 String 클래스의 equals() 메서드는 비교하는 두 대상의 값을 비교하는 것
기본 타입의 int형, char형등은 Call by Value 형태로 기본적으로 대상에 주소값을 가지지 않는 형태로 사용 하지만 String은 일반적인 타입이 아니라 클래스 클래스는 기본적으로 Call by Reference형태로 객체 생성 시 주소값이 부여됨 그렇기에 String 타입을 선언했을때는 같은 값을 부여하더라도 서로의 주소값이 다르다
public class Main {
public static void main(String[] args) {
String str1 = "test";
String str2 = "test";
String str3 = new String("test");
String str4 = new String("test");
System.out.println(str1==str3); //false
}
}
== 연산자의 경우 참조 타입 변수들 간의 연산은 동일한 객체를 참조하는지, 다른 객체를 참조하는지 알아볼 때 사용됨 참조 타입의 변수의 값은 힙 영역의 객체 주소이므로 서로 다른 주소값을 비교하게 됨. 그래서 자바에서 문자열을 비교하려면 equals()이라는 메서드를 활용하여 두개의 값을 비교해주어야 함
public class Main {
public static void main(String[] args) {
String str1 = "test";
String str2 = "test";
String str3 = new String("test");
String str4 = new String("test");
System.out.println(str1.equals(str3)); //true
}
}
String 클래스안에 있는 equals라는 메서드를 사용하면 두 비교대상의 주소 값이 아닌 데이터 값을 비교하기 때문에 어떻게 String을 생성하느냐에 따라 결과가 달라지지 않고 정확한 값 비교를 할 수 있다.
꼬리 - 오버라이딩 , 오버로딩
- 오버라이딩(Overriding), 오버로딩(Overloading)이 가능하다는 얘기다.
- 오버라이딩 : 부모클래스의 메서드와 같은 이름, 매개변수를 재정의 하는것.
- 오버로딩 : 같은 이름의 함수를 여러개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것.
string constant pool 의 위치
