[Java] String, StringBuilder 모르고 지나쳤던 점
출처 : https://medium.com/@KosteRico/5-inadequate-java-interview-questions-35390256c79d
Q. line 1, 2, 3번 줄 중 어느 것이 false 가 나오는가?
A.
* 처음에는 1번 라인만 false 가 나올 것이라 생각했다.
== 동등 연산자 비교는 값의 주소를 비교하기 때문에, new StringBuilder() 객체로 생성된 주소는 String s 와 당연히 다를 것이라 생각했다.
2, 3번 라인은 equals() 메서드로 값 비교를 하기 때문에 true 를 리턴할 것이라 예상했다.
실제 Answer.
1번 라인
정답 후보라 생각한 1번 라인은 애초에 컴파일 조차 안된다. 이유는 타입이 다르기 때문.
애초에 String 타입과 StringBuilder 타입이 다른데 어떻게 동등연산자(==)를 사용할 수 있겠는가 🤦🏻♂️
결론은 false 조차 출력할 수 없음.
2번 라인
false 가 출력된다. 이유는 String 클래스의 equals 메서드가 정의된 아래 코드를 보자.
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
} else {
if (anObject instanceof String) {
String aString = (String)anObject;
if (this.coder() == aString.coder()) {
return this.isLatin1() ? StringLatin1.equals(this.value, aString.value) : StringUTF16.equals(this.value, aString.value);
}
}
return false;
}
}
두번째 if 문에서 anObject 가 String 의 인스턴스인지 체크할 때, StringBuilder 의 인스턴스인 builder 변수는 해당 조건문을 통과할 수 없다. 곧바로 return false; 문으로 직결한다. false 였다.
3번 라인
이 라인도 false 를 출력한다.
2번 라인과는 조금 다른 이유인데, StringBuilder 클래스는 equals 메서드가 없다.
엥? 그럼 어떻게 위 문장이 호출되는 것이냐고?
바로 자바의 상속성으로 인하여, StringBuilder 에 없는 equals() 메서드를 부모 클래스에서 찾는다. 즉 Object 클래스의 equals 메서드가 호출되는 것이지.
Object의 equals 메서드를 까보면 아래처럼 동등연산자(==) 로 두 객체의 주소를 비교한다. 즉 서로 다른 두 객체인 String s 와 StringBuilder builder2 의 주소를 비교하면 당연히 false 를 출력한다.
public boolean equals(Object obj) {
return this == obj;
}