Java/[국비] JAVA

[국비][JAVA] 자동 형변환과 문자열 비교

줌인. 2024. 5. 27. 23:31

 

자동 형변환 : 자바에서 int와 long 간의 비교 시 int가 long으로 자동 형변환되어 비교됨
문자열 비교시 == 연산자는 참조값을 비교, equals() 메서드는 문자열의 실제 내용을 비교

 

자동 형변환과 값 비교
- 자바는 같은 타입끼리 연산자 사용 가능
- 다만, 서로 다른 기본 타입을 비교할 때, 작은 타입이 큰 타입으로 자동 형변환됨
   ex) int 타입과 long 타입의 값을 비교할 때, int 타입이 long 타입으로 자동 형변환된 후 비교가 이루어짐

 

문자열 비교
- 문자열을 비교할 때는 == 연산자와 equals() 메서드의 차이를 이해해야 함
- == 연산자는 참조값을 비교
- equals() 메서드는 문자열의 내용을 비교합니다.

 

 

[예제 코드]

public class Main {
    public static void main(String[] args) {
        int num1 = 1;
        long num2 = 1L;
        System.out.println(num1 == num2);
        // 다른 타입인데? -> int와 long은 서로 다른 타입이지만,
        // '==' 연산을 수행할 때, num1이 long 타입으로 자동 형변환되어 비교되므로, 두 값이 같기 때문에 true 출력

        String name1 = "winter";
        String name2 = "winter";
        System.out.println(name1 == name2);
        // true -> 문자열 리터럴 "winter"는 상수 풀(constant pool)에 저장되며,
        // name1과 name2는 같은 리터럴을 참조하므로 동일한 주소값을 가지며 true 출력

        System.out.println("이름을 입력해주세요");
        Scanner sc = new Scanner(System.in);
        String newName = sc.nextLine();

        System.out.println(name1 == newName); // false
        // 주소값 비교 -> newName은 새로운 문자열 객체를 가리키므로,
        // name1과 다른 참조값을 가지기 때문에 false 출력
        System.out.println(name1.equals(newName)); // true
        // 값 비교 -> equals() 메서드는 문자열의 내용을 비교하므로,
        // newName이 "winter"라면 true 출력

        sc.close(); // Scanner를 사용한 후 닫아주는 것이 좋습니다
    }
}

 

Keypoint
int와 long의 비교 - num1 == num2: int와 long은 서로 다른 타입이지만, == 연산자는 값을 비교
- 따라서 두 값이 같기 때문에 true를 출력합니다
String 리터럴 비교 - name1과 name2는 모두 "winter"라는 동일한 문자열 리터럴을 참조
- 자바에서는 동일한 문자열 리터럴을 상수 풀(constant pool)에 저장하고, 동일한 리터럴에 대해       동일한 참조를 사용하기 때문에 == 연산자는 true를 반환함
사용자 입력 문자열 비교 - newName은 Scanner를 통해 입력받은 문자열로, 새로운 객체로 생성됨
- name1과 newName은 서로 다른 참조값을 가지기 때문에 == 연산자는 false를 반환
- equals() 메서드는 문자열의 내용을 비교
- 만약 newName이 "winter"라면 name1.equals(newName)는 true를 반환
728x90