본문 바로가기
Study/중앙정보처리학원과정

5일차(1). String 문자열 비교

by 얏옹이 2022. 10. 31.
반응형

 

 

오늘은 String 문자열 비교 와 배열 초반부분이 수업의 주된 내용이였습니다.

 

문자열 비교를 배우면서 Java의 데이터가 어떤식으로 메모리에 저장되고 이를 어떻게 호출해서 사용하는지

에 대한 메서드, 클래스 호출을 같이 배웠습니다.

 

일단 String을 이용한 문자열 비교를 위해 코드를 작성했습니다.

 

 

String 타입의 변수 str1, str2, str3, str4를 지정한후

각각 변수에 "이찬원" 이라는 값을 대입해주었습니다.

 

이대로 실행을 돌려보면

 

 

4개의 변수에 동일하게 "이찬원" 이라는 값이 저장되고, 출력됩니다.

 

이 값들은 다 동일하기때문에 비교 연산자를 이용해 비교해보면 다 같다고 나올거 같습니다.

 

비교를 해주겠습니다.

 

 

코드 밑에 이부분을 추가해주었습니다.

 

str1과 str2가 같은지. str1과 str3이 같은지, str3과 str4가 같은지.

그리고 마지막으로 .equals() 메서드를 이용하여 str3과 str4가 같은지 비교해봤습니다.

 

일반적으로는 값은 true, true, true, true가 나올거 같습니다. 결과를 보겠습니다

 

 

음... 예상과는 다르게 str1과 str3이 같지 않고, str3과 str4가 같지 않다고 나오는군요.

 

왜 이렇게 나오는걸까요?

 

 

Java의 메모리 공간은 크게 2분류로 나뉘어있습니다.

 

Stack 메모리영역과 Heap 메모리 영역으로 나뉘어져있고. 여기서 흔히 관리자, 즉 개발자가 접근할수 있는건

Stack 메모리 영역까지만 다를수가 있습니다.

 

일단 말로 설명을 드리면

제가 작성한 코드에서 

 

str1과 str2의 이찬원은 스택 메모리에 저장이 됩니다. 하지만 str3과 str4는 new String이라는 클래스를 호출하면서 문자열을 저장했기때문에 Heap 메모리 영역에 각각 새로운 클래스로 생성이 된것이죠.

 

그림으로 보면 좀더 이해가 빠릅니다. 발그림을 그려보도록 하겠습니다

 

 

이런 구조입니다. stack 메모리 영역에는 참조타입 변수가 저장되고

 

그 둘은 heap 메모리에 있는 "이찬원" 이라는 값을 가리키고 있는 "경로or주소"를 지니고 있다고 생각하시면 됩니다.

 

그래서 그 둘은 같은 주소를 가르키고 있기때문에 비교 연산자 == 로 비교했을때 true가 출력되는겁니다.

 

 

하지만 str3과 str4는 new String이라는 클래스로 새로 힙 영역에 생성된거라

 

문자열로는 같지만 내부적으로는 str1, str2와는 새로운 영역에 생성되어있는 공간에 저장된 "이찬원" 이라는 값입니다.

 

== 비교 연산자로 비교를 하게 되면

 

문자열이 같은지 비교를 하게 되는게 아니고 리터럴값을 참조하고 있는가? 라고 물어보게 되는거죠.

 

그래서 String 문자열 비교를 할때 ==, != 같은 비교연산자로 비교를 하지 않습니다.

 

문자열 비교를 할때는 그래서, 코드 맨 하단에 있는 .equals() 라는 메서드를 이용하여 비교합니다.

 

.equals() 메서드는 말 그대로 문자열이 같은지를 검증해주는 메서드입니다.

 

(비교기준이 되는 변수).equals(비교 할 변수); 로 입력하고 실행을 돌리면

 

str3과 str4는 비록 다른 영역에 저장되어있지만 그 둘의 문자열이 같기때문에 True가 리턴되는것입니다.

반응형