1. 비교

프로그래머는 항상 서로 다른 변수를 서로 비교해야 합니다. 그러나 이미 본 것처럼 모든 것이 그렇게 간단하지 않습니다.

정수는 비교하기가 매우 쉽습니다. 그냥 사용하면 ==끝납니다. 실수를 비교하려면 그 차이(또는 그 차이의 절대값)를 매우 작은 수와 비교해야 합니다.

문자열 비교는 훨씬 더 어렵습니다. 무엇보다도 이것은 문자열이 객체이기 때문입니다. 게다가 프로그래머는 문자열 비교가 상황에 따라 조금 다르게 진행되기를 원하는 경우가 많습니다.


2. 문자열 배열 메모리

이미 본 것처럼 문자열은 정수 및 실수와 다르게 메모리에 저장됩니다.

문자열이 배열되는 방식 메모리

두 개의 메모리 블록이 문자열을 저장하는 데 사용됩니다. 한 블록은 텍스트 자체를 저장하고(그 크기는 텍스트 크기에 따라 다름) 두 번째 블록(4바이트)은 첫 번째 블록의 주소를 저장합니다.

숙련된 프로그래머라면 " String str변수는 개체에 대한 참조를 저장합니다 String.


3. 문자열에 대한 참조 할당

이 접근 방식의 이점은 하나의 문자열 변수를 다른 문자열 변수에 할당해야 할 때 분명해집니다. 예:

String text = "This is a very important message";
String message = text;

결과적으로 메모리에 포함되는 내용은 다음과 같습니다.

문자열에 대한 참조 할당

이러한 유형의 할당 작업 후에 String개체는 원래 위치에 남아 있고 해당 주소(개체에 대한 참조)만 변수에 복사됩니다 message.


4. 참조 및 개체 작업

String그러나 문자열을 대문자(대문자)로 변환하기로 결정한 경우 Java 시스템은 모든 작업을 올바르게 수행합니다. 두 개의 객체가 생성되고 textmessage변수는 각각 자체 객체에 대한 참조를 저장합니다.

예:

String text = "This is a very important message";
String message = text.toUpperCase(); 

결과적으로 메모리에 포함되는 내용은 다음과 같습니다.

참조 및 개체 작업

메서드는 toUpperCase()호출 된 문자열을 변경하지 않습니다 . 대신 새 문자열(새 개체)을 만들고 이에 대한 참조를 반환합니다.

더 흥미로운 예는 어떻습니까? 문자열을 개체에 전달하기로 결정했다고 가정해 보겠습니다 Scanner(문자열에서 값을 읽도록).

예:

String text = "10 20 40 80";
Scanner console = new Scanner(text);
int a = console.nextInt();
int b = console.nextInt();

여기에서Scanner 클래스 작동 방식에 대해 자세히 알아볼 수 있습니다 .

이것이 모두 메모리에 저장되는 방법입니다.

참조 및 개체 작업.  스캐너 클래스

이 경우 단일 String개체는 그대로 메모리에 남아 있습니다. 해당 개체에 대한 참조만 전달되고 변수에 저장됩니다.


String5. 개체 에 대한 참조 비교

마지막으로 재미있는 부분인 문자열 비교에 도달했습니다.

문자열 변수를 비교하는 데 사용할 수 있는 연산자는 ==(같음) 및 !=(같지 않음) 두 가지입니다. "보다 큼", "보다 작음" 또는 "크거나 같음" 연산자를 사용할 수 없습니다. 컴파일러에서 허용하지 않습니다.

그러나 여기에 흥미로운 뉘앙스가 있습니다. 문자열 변수에 실제로 저장되는 것은 무엇입니까? 맞습니다: 객체에 대한 주소(참조)입니다. 그리고 비교할 주소는 다음과 같습니다.

String text = "Hi";
String message = text;
String s1 = text.toUpperCase();
String s2 = text.toUpperCase(); 

메모리에 저장되는 내용은 다음과 같습니다.

String 개체에 대한 참조 비교

message및 변수 text는 동일한 개체를 참조(주소 저장)합니다. 그러나 s1s2변수는 매우 유사하지만 별개인 개체에 대한 참조를 저장합니다.

그리고 코드에서 이 4개의 변수를 비교하면 다음과 같은 결과를 얻습니다.

암호 콘솔 출력
String text = "Hi";
String message = text;
String s1 = text.toUpperCase();
String s2 = text.toUpperCase();
System.out.println(text == message);
System.out.println(text == s1);
System.out.println(s1 == s2); 


true  // The addresses are equal
false // The addresses are different
false // The addresses are different