미누에요
[Java] 문자열 비교 본문
String s1 = "Java";
String s2 = "Python";
위와 같이 두 개의 문자열 s1, s2가 있다.
두 문자열의 내용이 같은지를 확인하려면 equals 메서드를 사용해야한다.
System.out.println(s1.equals("Java")); // s1과 "Java"가 같으면 true, 아니면 false
s1의 내용과 "Java"는 같으므로 true 가 출력된다.
System.out.println(s2.equals("python"));
위와 같이 코드를 작성하면 false가 나온다. 이유가 뭘까?
쉽게 알 수 있듯이 s2에는 "Python"이라는 문자열이 들어가 있지만 python은 p 가 소문자이다.
컴퓨터에서는 대소문자도 다른 값으로 구별하기 때문이다.
하지만, Java에서는 대소문자를 구분하지 않고 문자열을 비교하는 기능도 존재한다.
바로 equalsIgnoreCase()이다.
System.out.println(s2.equalsIgnoreCase("python")); // 대소문자 구분없이 문자열 내용이 같은지 체크
대소문자를 구분하지 않고 정상적으로 true 가 출력되는 것을 확인할 수 있다.
이번엔 새롭게 s1과 s2를 정의해보자.
s1 = "1234";
s2 = "1234";
위 s1과 s2를 equals를 사용하여 같은지 확인해보면 true가 출력된다.
System.out.println(s1.equals(s2));
하지만 equals를 사용하지 않아도 같은지를 알아볼 수 있는 방법이 있다.
System.out.println(s1 == s2);
바로 위와 같은 방법이다.
논리 연산자를 사용하면 true 혹은 false로 값이 나오기 때문에 이를 사용할 수도 있다.
하지만 Java에서는 이러한 방법을 추천하지 않는다.
아래의 예를 보자.
s1 = new String("1234");
s2 = new String("1234");
System.out.println(s1.equals(s2)); // true
System.out.println(s1 == s2); // false
위 코드를 보면 s1 과 s2를 new String이라는 방법으로 정의한 것을 볼 수 있다.
원래의 자료들은 데이터 구조 상으로 두 다른 변수에 같은 내용의 변수가 선언되면 같은 메모리를 사용한다.
위의 s1 = "1234" 와 s2 = "1234" 는 메모리 구조 상으로 주소 값이 같은 것이다.
하지만 new String 을 사용하여 변수를 정의하면, 내용이 같더라도 메모리상에 각각 다른 메모리를 할당한다.
new String("1234")를 사용하여 선언한 s1과 s2는 메모리 주소 값이 다른, 즉 각자 다른 번지수를 가지고 있는 것이다.
"내용"만을 사용하여 문자열을 비교할 때는 문제가 되지 않지만, "참조"를 사용하여 문자열을 비교할 때 이러한 메모리 번지수 차이는 오류를 불러올 수 있다.
그래서 Java에서는 "내용"을 사용한 문자열 비교를 추천한다.
s1 == s2 라는 코드보다 s1.eqauls(s2)를 더 적극적으로 사용하게 연습하자.
'Java' 카테고리의 다른 글
[Java] 퀴즈 3. 생년월일 및 성별 출력 (0) | 2023.11.05 |
---|---|
[Java] 특수 문자, 이스케이프 문자 (0) | 2023.11.05 |
[Java] 문자열 변환, 공백 제거, 문자열 결합 (2) | 2023.11.04 |
[Java] 문자열 길이, 대소문자 변환, 포함 관계 (0) | 2023.11.04 |
[Java] 퀴즈 2. 어린이의 키에 따른 탑승 (0) | 2023.11.01 |