1. 비교
프로그래머는 항상 서로 다른 변수를 서로 비교해야 합니다. 그러나 이미 본 것처럼 모든 것이 그렇게 간단하지 않습니다.
정수는 비교하기가 매우 쉽습니다. 그냥 사용하면 ==
끝납니다. 실수를 비교하려면 그 차이(또는 그 차이의 절대값)를 매우 작은 수와 비교해야 합니다.
문자열 비교는 훨씬 더 어렵습니다. 무엇보다도 이것은 문자열이 객체이기 때문입니다. 게다가 프로그래머는 문자열 비교가 상황에 따라 조금 다르게 진행되기를 원하는 경우가 많습니다.
2. 문자열 배열 메모리
이미 본 것처럼 문자열은 정수 및 실수와 다르게 메모리에 저장됩니다.
두 개의 메모리 블록이 문자열을 저장하는 데 사용됩니다. 한 블록은 텍스트 자체를 저장하고(그 크기는 텍스트 크기에 따라 다름) 두 번째 블록(4바이트)은 첫 번째 블록의 주소를 저장합니다.
숙련된 프로그래머라면 " String
str
변수는 개체에 대한 참조를 저장합니다 String
.
3. 문자열에 대한 참조 할당
이 접근 방식의 이점은 하나의 문자열 변수를 다른 문자열 변수에 할당해야 할 때 분명해집니다. 예:
String text = "This is a very important message";
String message = text;
결과적으로 메모리에 포함되는 내용은 다음과 같습니다.

이러한 유형의 할당 작업 후에 String
개체는 원래 위치에 남아 있고 해당 주소(개체에 대한 참조)만 변수에 복사됩니다 message
.
4. 참조 및 개체 작업
String
그러나 문자열을 대문자(대문자)로 변환하기로 결정한 경우 Java 시스템은 모든 작업을 올바르게 수행합니다. 두 개의 객체가 생성되고 text
및 message
변수는 각각 자체 객체에 대한 참조를 저장합니다.
예:
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
개체는 그대로 메모리에 남아 있습니다. 해당 개체에 대한 참조만 전달되고 변수에 저장됩니다.
String
5. 개체 에 대한 참조 비교
마지막으로 재미있는 부분인 문자열 비교에 도달했습니다.
문자열 변수를 비교하는 데 사용할 수 있는 연산자는 ==
(같음) 및 !=
(같지 않음) 두 가지입니다. "보다 큼", "보다 작음" 또는 "크거나 같음" 연산자를 사용할 수 없습니다. 컴파일러에서 허용하지 않습니다.
그러나 여기에 흥미로운 뉘앙스가 있습니다. 문자열 변수에 실제로 저장되는 것은 무엇입니까? 맞습니다: 객체에 대한 주소(참조)입니다. 그리고 비교할 주소는 다음과 같습니다.
String text = "Hi";
String message = text;
String s1 = text.toUpperCase();
String s2 = text.toUpperCase();
메모리에 저장되는 내용은 다음과 같습니다.
message
및 변수 text
는 동일한 개체를 참조(주소 저장)합니다. 그러나 s1
및 s2
변수는 매우 유사하지만 별개인 개체에 대한 참조를 저장합니다.
그리고 코드에서 이 4개의 변수를 비교하면 다음과 같은 결과를 얻습니다.
암호 | 콘솔 출력 |
---|---|
|
|
GO TO FULL VERSION