블로거 워누입니다. 

 

지난번 포스팅에 이어 String 메소드에서 제공하는 equals에 대해서 포스팅하고자 합니다! 

equals는 문자열을 비교할 때 사용하는 메소드입니다. 이 메소드를 이용해서 서로 다른 문자열 타입 변수의 문자열을 서로 비교합니다. 

....

그런데 말입니다.. 우리가 일반적으로 변수 타입을 비교하려면 같다는 의미의 이항연산자인 "==" 연산자를 통해서 많이 비교하는데, 문자열은 굳이 equals를 쓸 필요가 있을까요?

 

 

확인을 위해 직접 실험해 보았습니다. 우리에게 늘 익숙한 Hello 시리즈로 소스코드를 만들었습니다.


[equalsPrac.java 소스코드]

public class equalsPrac {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String str1 = new String("HelloJava");
		String str2 = "HelloJava";
		String str3 = "HelloJava";
		
		if(str1 == str2) 
			System.out.println("같은 문자열");
		else 
			System.out.println("다른 문자열");
		
		if(str2 == str3) 
			System.out.println("같은 문자열");
		else 
			System.out.println("다른 문자열");
		
	}

}

결과는 아래와 같이 나옵니다. 

equalsPrac.java 실행화면

.

.

.

?

분명 똑같이 비교연산자를 썼는데 str1과 str2가 왜 다른걸까요..?

(대학교에서 이 내용을 가르쳐주지 않았습니다. 교수님이 몰랐을수도...ㅎ)

 

사실 자바는 문자열 값이 완전히 똑같으면, 동일한 String 객체를 참조합니다. 즉, str2와 str3는 같은 객체라는 것인데요, 반면 str1은 new 연산자를 사용하는 바람에 다른 String 객체를 참조하게 되버린 것입니다.

 

쉽게 말하면 클래스를 하나 만들어놓고 객체를 따로 만들어놓은 것처럼 말이죠!

.

Class cl1 = new Class();

Class cl2 = new Class();.

.

대충 이런 느낌인데 여기서 cl1과 cl2는 완전히 다른 객체인 것처럼, str1과 str2, str3 사이도 마찬가지라고 합니다. 

 

이런 경우, "=="을 사용하면 다른 객체간 문자열 비교가 불가능하겠죠?

이래서 equals를 사용합니다. 

 

이번엔 지난 포스팅에서 사용했던 substring() 메소드까지 같이 써서 비교해볼게요!

 


[equalsPrac2.java 소스코드]

public class equalsPrac2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String str1 = new String("Java");
		String str2 = "Java";
		String str3 = new String("HelloJava");
		String str4 = "HelloJavaProject";
		
		if(str1 == str2) 
			System.out.println("같은 String 객체를 지정");
		else
			System.out.println("다른 String 객체를 지정");
		
		if(str2.equals(str1))
			System.out.println("같은 문자열");
		else 
			System.out.println("다른 문자열");
		
		if(str3.substring(5).equals(str1))
			System.out.println("같은 문자열");
		else 
			System.out.println("다른 문자열");
		
		if(str4.substring(5,9) == str2)
			System.out.println("같은 String 객체를 지정");
		else
			System.out.println("다른 String 객체를 지정");
		
		if(str4.substring(5,9).equals(str2))
			System.out.println("같은 문자열");
		else 
			System.out.println("다른 문자열");
		
	}

}

이번 결과는 아래와 같이 나옵니다.

equalsPrac2.java 실행결과

.

어떤 느낌인지 대략 감이 오시나요..? "==" 연산자를 사용해버리면 객체의 값만 비교하는게 아니라 객체 동일 여부까지 따지게 되서, 문자열 비교할 때 원하는 값을 가져오지 못할 수도 있습니다.

이전 포스팅에서 언급한 것처럼 자바에서의 String은 단순한 문자열 타입 변수가 아닌 Class로 분류되기 때문에

문자열의 값 자체를 비교할 때는 비교 연산자 "=="이 아닌 equals() 메소드로 비교해야 정확한 값을 가져올 수 있습니다. 

(이거땜에 회사에서 쓸때없이 잡아먹은 시간이 얼만지 모르겠습니다...)

 

만약 이 글을 읽으시는 초급개발자분들은 예시를 보면서 직접 소스도 짜보고 여기저기 바꿔가면서 테스트 해보셨으면 좋겠습니다! 그래야 저처럼 버리는 시간 없이 효율적으로 개발하실 수 있거든요... ㅎ

 

오늘 포스팅은 여기까지 작성하고 다음 포스팅에서 뵙겠습니다 ㅎㅎ

+ Recent posts