Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 9 JShell에서 문자열 유틸리티 메서드와 불변성(Immutability) 이해하기

JShell은 Java 9부터 도입된 대화형 명령줄(command-line) 도구로, 표현식, 클래스, 메서드, 필드, 인터페이스 등 간단한 코드 조각을 컴파일 과정 없이 즉시 실행하고 결과를 확인할 수 있습니다. String 클래스는 자바의 기본 패키지인 java.lang에 포함되어 있으며, 다양한 텍스트 처리 작업을 위한 여러 메서드를 제공합니다.

1) 문자열 유틸리티(String Utility)

String 클래스는 개발 편의성을 높여주는 다양한 내장 유틸리티 메서드를 제공합니다. 대표적으로 indexOf(), lastIndexOf(), startsWith(), endsWith(), isEmpty(), equals(), equalsIgnoreCase() 등이 있으며, 문자열 검색, 비교, 위치 확인 등의 작업에 활용됩니다.

아래 코드 예제에서는 JShell에서 문자열 유틸리티 메서드를 실제로 사용하는 모습을 확인할 수 있습니다.

예제 1

jshell> String str = "JShell is a new feature in Java9";
str ==> "JShell is a new feature in Java9"

jshell> str.indexOf("new")
$4 ==> 12

jshell> str.charAt(7)
$5 ==> 'i'

jshell> str.indexOf('i')
$6 ==> 7

jshell> str.lastIndexOf('i')
$7 ==> 24

jshell> str.contains("feature")
$8 ==> true

jshell> str.startsWith("JShell")
$9 ==> true

jshell> str.startsWith("Java9")
$10 ==> false

jshell> str.endsWith("Java9")
$11 ==> true

jshell> str.endsWith("a9")
$12 ==> true

jshell> str.endsWith("a9java")
$13 ==> false

jshell> String str1 = "value"
str1 ==> "value"

jshell> str1.equals("value")
$15 ==> true

jshell> str1.equals("VALUE")
$16 ==> false

jshell> str1.equalsIgnoreCase("VALUE")
$17 ==> true

위 실행 결과에서 알 수 있듯이, indexOf()는 특정 문자나 문자열이 처음 나타나는 위치를 반환하고, lastIndexOf()는 마지막으로 나타나는 위치를 반환합니다. 또한 startsWith()endsWith()는 문자열의 시작과 끝이 지정한 값과 일치하는지 확인하며, equals()는 대소문자까지 정확히 비교하고 equalsIgnoreCase()는 대소문자를 무시하고 비교합니다.

2) 문자열 불변성(String Immutability)

String 객체는 불변(immutable)입니다. 즉, 한 번 생성된 문자열 객체의 값은 이후에 변경할 수 없습니다. 문자열을 수정하는 것처럼 보이는 연산도 실제로는 기존 객체를 변경하는 것이 아니라 새로운 객체를 생성합니다.

아래 코드 예제에서 String 클래스의 concat() 메서드는 두 문자열의 내용을 하나로 합친 결과를 반환합니다. 하지만 원래 변수 "str"이 참조하던 값은 그대로 유지되며, concat() 메서드는 새로운 String 객체를 만들어 반환합니다. concat()과 마찬가지로 toUpperCase(), toLowerCase(), trim() 같은 다른 String 메서드들도 모두 새로운 String 객체를 반환합니다.

예제 2

jshell> String str = "Tutorialspoint";
str ==> "Tutorialspoint"

jshell> str.concat(" is e-learning app");
$3 ==> "Tutorialspoint is e-learning app"

jshell> str
str ==> "Tutorialspoint" ^

jshell> String str1 = str.concat(".")
str1 ==> "Tutorialspoint."

jshell> str1
str1 ==> "Tutorialspoint."

jshell> String str = str.concat(" is e-learning app");
str ==> "Tutorialspoint is e-learning app"

jshell> str
str ==> "Tutorialspoint is e-learning app"

jshell> String str1 = "Tutorialspoint";
str1 ==> "Tutorialspoint"

jshell> str1.concat(" is e-learning app");
$2 ==> "Tutorialspoint is e-learning app"

jshell> str1
str1 ==> "Tutorialspoint"

jshell> String str2 = str1.concat(" is e-learning app");
str2 ==> "Tutorialspoint is e-learning app"

jshell> str1
str1 ==> "Tutorialspoint"

jshell> String str3 = str2.concat(".");
str3 ==> "Tutorialspoint is e-learning app."

jshell> str1
str1 ==> "Tutorialspoint"

jshell> str2
str2 ==> "Tutorialspoint is e-learning app"

jshell> String s = "Tutorialspoint is e-learning app."
s ==> "Tutorialspoint is e-learning app."

jshell> s.toUpperCase()
$10 ==> "TUTORIALSPOINT IS E-LEARNING APP."

jshell> s.toLowerCase()
$11 ==> "tutorialspoint is e-learning app."

실행 결과를 살펴보면, str.concat()을 호출한 직후에도 원래 변수 str의 값은 "Tutorialspoint"로 변하지 않습니다. 병합된 문자열을 계속 사용하려면 반환값을 새로운 변수에 할당해야 하며, 이것이 바로 문자열 불변성의 핵심입니다. 마찬가지로 toUpperCase()toLowerCase()도 원본 문자열을 변경하지 않고 대문자 또는 소문자로 변환된 새로운 문자열을 반환합니다.