immutable 클래스의 인스턴스를 비교할때, ==? .equals()?
다옴
대표적인 immutable Class 인 String 을 예로 들어서..
같은 charSequence 를 가지고 있는 여러개의 String 들은 immutable 하기 때문에, == 로 비교해도 상관 없으며, 이것이 성능상 훨씬 좋을 수 있을것 같은데요..
굳이 왜 String 에서는 equals() 를 override 했을까요?
그리고, immutable Class 의 instance 들을 비교할 때는 ==이나, equals()둘중에 무엇을 호출해야 한다 라는 코드 가이드가 있는지도 궁금합니다..(또 그러한 이유도)
-
보슬
음.. 그렇겠네요. 상세한 답변 감사합니다~
-
라와
1.
하지만 두 객체가 생성될때 immutable이니깐 ==로 비교하게 할 수는 없을까? 라고 해 보면,
첫번째 new String(\A\) 과, 두번째 new String(\A\)이 모두 같은 객체를 가리켜야 할것이고,
그렇게 되는 방법은 \상수풀\에 있는 놈을 가져다 쓰는것일겁니다.
\상수풀\에 있는 놈들은, GC의 대상이 될 수 없습니다. ( 메모리 문제 발생 가능 )
2.
하지만 그렇지 않다고 해도, new String(\A\)를 여러 -
이하얀
만약 직접 무언가를 만드시고, 철저히 관리 한다면, 문제 될 것이 없어 보입니다.
하지만, == 로 비교하기 위해서는 모두 같은 메모리 주소를 가리키고 있어야 할것입니다.
void someMethod() {
if ( new String(\A\) == new String (\A\) ) { ... }
}
위의 메소드가 수행 될때에는 두개의 String객체를 만들어 낼것입니다.
위의 메소드를 벗어 난다면 그 객체 두개는 더 이상 사용되지 않으므로 GC의 -
유1혹
찬님 / 맞습니다! 제가 그 부분을 모르겠다는 거에요.. ^^; \aaa\==new String(\aaa\); 인 경우에는 false 가 떨어지겠지만.
제가 추후에 만들 immutable class 에서 default constructor 을 막아놓은 채 철저한 Constants Pool 을 관리한다면, 어떤 경우에도 equals() 를 오버라이드 할 필요가 없지 않나? 하는 거죠.. -
김예쁨
지금 String 클래스가 immutable하니, 걍 == 로 비교해도 되지 않을까? 라고 하셨는데 ^^;;
그렇다면 String 클래스에서는 왜 equals 메소드를 오버라이딩 해 놓았을까요?