Backend/☕️ Java

[Java] String, StringBuilder 모르고 지나쳤던 점

Hugehoo 2022. 3. 30. 13:25

출처 : https://medium.com/@KosteRico/5-inadequate-java-interview-questions-35390256c79d

 

5 inadequate Java job interview questions

Would you like to work for the company after such questions?

medium.com

 

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;
    }