자바생
Published 2021. 5. 25. 18:02
==와 equals의 차이 Java
728x90

StringBuilder와 StringBuffer를 공부하다가 StringBuilder에서의 equals 출력 값과 String에서의 equals 출력 값이 다르다는 것을 발견했다. 그래서 왜 다른지 열심히 구글링 하고 오카방에 여쭤보았다.


원래 equals() 는 주소를 비교한다.

  • 아래 코드는 자바에서 equals() 메소드 구현한 코드이다. 보면 ==을 이용하여 비교를 한다. 즉, 오버라이딩 되지 않은 equals는 ==를 사용하여 주소 값을 비교한다.

 

public boolean equals(Object obj) {
return (this == obj);
}


그러면 왜 아래 코드는 이러한 값을 출력할까?

 

StringBuilder sb1 = new StringBuilder("abc");
StringBuilder sb2 = new StringBuilder("abc");
System.out.println(sb1.equals(sb2)); //false 여기서는 주소 비교

String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1.equals(str2)); //true 여기서는 값을 비교

 

결과를 먼저 말하자면 String은 equals 메소드를 오버라이딩 하였고, StringBuilder는 equals 메소드를 오버라이딩 하지 않았다.

그래서 sb1과 sb2를 equals 사용하여 비교하면 오버라이딩 하지 않았기 때문에 주소를 비교하여 false가 출력된다.

str1과 str2를 equals 사용하여 비교하면 String 클래스에서 오버라이딩 했기 때문에 값을 비교하여 true가 출력된다.

 


equals 오버라이딩

 

main 부분

 

StringBuilder sb1 = new StringBuilder("abc");
StringBuilder sb2 = new StringBuilder("abc");

A a = new A(sb1);
A b = new A(sb2);
System.out.print(a.equals(b)); //true 출력

 

class A

class A {
StringBuilder sb;

A(StringBuilder sb){
this.sb = sb;
}

public boolean equals(Object o){
A a = (A) o;
if(a.sb.length() != sb.length())
return false;
int n = sb.length();

for(int i = 0; i < n; i++){
if(sb.charAt(i) != a.sb.charAt(i))
return false;
}
return true;
}
}

 

728x90

'Java' 카테고리의 다른 글

final 키워드  (0) 2022.03.05
스트림  (0) 2022.01.04
String Operator '+' 의 작동 원리(2022.03.24 수정) Java 9  (0) 2021.05.25
Object 메소드  (0) 2021.05.24
(TYPE) type -> String , String -> type(TYPE)  (0) 2021.05.24
profile

자바생

@자바생

틀린 부분이 있다면 댓글 부탁드립니다~😀

검색 태그