Minwoo Dev.

[Java] 문자열 비교 본문

Java

[Java] 문자열 비교

itisminu 2023. 11. 4. 23:48
728x90
반응형
SMALL
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)를 더 적극적으로 사용하게 연습하자.

728x90
반응형
LIST