[JAVA] 문자열 비교 (백준 1152 : 단어의 개수)

이한솔·2023년 11월 2일
0

JAVA

목록 보기
2/9

백준 : 1152번 단어의 개수

코드 제출 중 계속 틀렸다는 결과를 받아, == 를 equals로 변경 후 제출했더니 통과되었다. ==와 equals의 차이는 무엇인지, 언제 사용해야하는지 정리해본다.

문자열 변수 생성

: 문자열 변수 생성은 두 가지 방법이 있다.
  1. String str = ""; 와 같이 문자열을 큰 따옴표로 둘러 싸서 선언하는 방식 -> 문자열 리터럴을 사용
  2. String str = new String("") 와 같이 new 키워드를 사용하여 문자열을 생성 -> 이 때 문자열 객체는 heap 메모리에 생성

여기서 문자열 리터럴을 사용하는 경우, 문자열 상수 풀(String Pool)이라는 메모리 영역에 해당 문자열을 저장하고, 동일한 문자열 리터럴을 사용하는 경우에는 새로운 객체를 사용하지 않고 이미 존재하는 객체를 재사용하게 된다. new String()을 사용하는 경우 매번 새로운 문자열 객체가 생성되므로, 항상 새로운 메모리 주소를 가지게 된다.

문자열 비교

: == 연산자와 equals() 메소드의 가정 큰 차이점은 다음과 같다.

  • == : 비교하고자 하는 두 개의 대상의 주소값을 비교
  • equals() : 비교하고자 하는 두 개의 대상의 값 자체를 비교

String은 int, char 와 같은 일반적인 타입이 아닌 클래스로 Call by Reference 형태이다. 그러므로 생성 시 주소값이 부여되기에, 같은 값을 부여하더라도 서로간의 주소값이 다르게 된다.

<예시>

String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");

boolean isEqual1 = (str1 == str2);    // true, str1과 str2는 동일한 문자열 리터럴을 참조
boolean isEqual2 = (str1 == str3);    // false, str1과 str3는 다른 객체를 참조
boolean isEqual3 = str1.equals(str3); // true, 두 문자열의 내용은 동일

그러므로, 문자열이 서로 같은 문자열인지 다른 문자열인지 비교할 때는 equals를 사용하는 것이 일반적으로 안전하다.

+) compareTo()

: 이 메서드는 문자열은 사전적인 순서에 따라 비교할 때 사용된다. 반환하는 값은 다음과 같다
  • 0 : 두 문자열은 동일함
  • 양수 : 첫 번째 문자열이 두 번째 문자열보다 사전적으로 뒤에 온다
  • 음수 : 첫 번째 문자열이 두 번째 문자열보다 사전적으로 앞에 나온다

해당 문제에 제출한 코드는 아래와 같다

import java.util.*;
public class Main {
	public static void main(String[] args) {		
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();    //한줄로 입력 받기
        
        //앞뒤 공백 제거
        str = str.trim();
        
        String[] arr = str.split(" ");
        
        if(arr.length == 1 && arr[0].equals("")){
           System.out.print(0);
        }else{
           System.out.print(arr.length);
        }
        sc.close();   
	}
}
profile
개인 공부용

0개의 댓글