Java 에서 == 연산자 사용시 주의할점

Seong Hyeon Kim·2024년 7월 23일
0

자바

목록 보기
2/3

문제 상황

자바에서 문자열 비교를 할 때, == 연산자를 사용하면 문자열의 값을 비교하는 것이 아니라 객체의 참조를 비교합니다. 따라서 값이 같더라도 다른 객체인 경우 false가 반환될 수 있습니다. 이를 해결하려면 문자열의 실제 값을 비교하는 equals 메서드를 사용해야 합니다.

다음은 예시 상황입니다:

public class Main {
    public static void main(String[] args) {
        int rotation = 1;
        String[] minerals = {"gold", "silver", "diamond", "iron", "platinum"};
        int j = 2; // 예시 인덱스

        // 디버깅 출력
        System.out.println("rotation: " + rotation);
        System.out.println("minerals[" + j + "]: " + minerals[j]);

        // 잘못된 문자열 비교
        if (rotation == 1 && minerals[j] == "diamond") {
            System.out.println("조건이 만족되었습니다: rotation이 1이고 minerals[j]가 'diamond'입니다.");
        } else {
            System.out.println("조건이 만족되지 않았습니다.");
        }
    }
}

위 코드에서 rotation1이고, minerals[j]"diamond"입니다. 그러나 조건문이 참으로 평가되지 않습니다. 이는 문자열 비교를 == 연산자로 했기 때문입니다.

문제 원인

자바에서 == 연산자는 두 문자열 객체의 참조를 비교합니다. 즉, 두 문자열이 동일한 객체를 가리키고 있는지를 확인합니다. 따라서, 값이 같더라도 서로 다른 객체인 경우 false가 반환됩니다.

해결 방법

문자열 비교를 올바르게 하려면 == 연산자 대신 equals 메서드를 사용해야 합니다. 다음은 수정된 코드입니다:

public class Main {
    public static void main(String[] args) {
        int rotation = 1;
        String[] minerals = {"gold", "silver", "diamond", "iron", "platinum"};
        int j = 2; // 예시 인덱스

        // 디버깅 출력
        System.out.println("rotation: " + rotation);
        System.out.println("minerals[" + j + "]: " + minerals[j]);

        // 올바른 문자열 비교
        if (rotation == 1 && "diamond".equals(minerals[j])) {
            System.out.println("조건이 만족되었습니다: rotation이 1이고 minerals[j]가 'diamond'입니다.");
        } else {
            System.out.println("조건이 만족되지 않았습니다.");
        }
    }
}

코드 설명

  1. 디버깅 출력: 조건문 이전에 rotationminerals[j]의 값을 출력하여 디버깅에 도움이 되도록 합니다.

    System.out.println("rotation: " + rotation);
    System.out.println("minerals[" + j + "]: " + minerals[j]);
  2. 올바른 문자열 비교: 문자열 비교 시 == 대신 equals 메서드를 사용합니다.

    if (rotation == 1 && "diamond".equals(minerals[j])) {
        System.out.println("조건이 만족되었습니다: rotation이 1이고 minerals[j]가 'diamond'입니다.");
    } else {
        System.out.println("조건이 만족되지 않았습니다.");
    }

정리

  • 자바에서 문자열 비교를 할 때는 == 연산자 대신 equals 메서드를 사용해야 합니다.
  • == 연산자는 두 문자열 객체의 참조를 비교합니다. 이는 두 문자열이 동일한 객체를 가리키고 있는지를 확인합니다. 따라서 값이 같더라도 서로 다른 객체인 경우 false가 반환됩니다.
  • equals 메서드는 문자열의 실제 값을 비교합니다. 따라서 값이 동일하면 true가 반환됩니다.
  • 디버깅을 위해 조건문 이전에 값을 출력해보는 것이 좋습니다.

이 방법을 통해 문자열 비교와 관련된 문제를 해결할 수 있습니다. 이를 통해 조건문이 예상대로 동작하게 됩니다.

추가 설명

자바에서 문자열 리터럴은 문자열 상수 풀에 저장되므로 동일한 리터럴은 같은 객체를 참조하지만, new 키워드를 사용하여 생성한 문자열은 항상 새로운 객체를 생성합니다. 따라서 == 연산자를 사용한 비교는 항상 안전하지 않습니다. 이를 피하기 위해 항상 문자열 비교 시 equals 메서드를 사용하는 것이 권장됩니다.

profile
삽질도 100번 하면 요령이 생긴다. 부족한 건 경험으로 채우는 개발자

0개의 댓글