Java String은 가장 널리 사용되는 클래스 중 하나입니다. Java String 클래스는 java.lang
패키지에 정의되어 있습니다.
Java String
- 기본적으로 문자열은 문자의 시퀀스이지만 기본 유형은 아닙니다.
- Java에서 문자열을 생성할 때 실제로 String 유형의 객체를 만듭니다.
- 문자열은 한 번 생성되면 변경할 수 없는 불변 객체입니다.
- 문자열은 Java에서 연산자 오버로딩이 지원되는 유일한 클래스입니다. + 연산자를 사용하여 두 문자열을 연결할 수 있습니다. 예를 들어
"a" + "b" = "ab"
입니다. - Java는 문자열 조작을 위해 두 가지 유용한 클래스를 제공합니다 – StringBuffer와 StringBuilder입니다.
이제 Java String 클래스에 대해 더 자세히 알아보겠습니다.
문자열 생성의 다양한 방법
Java에서 문자열 객체를 만드는 여러 가지 방법이 있습니다. 인기 있는 몇 가지 방법은 다음과 같습니다.
-
문자열 리터럴 사용하기
이것은 문자열을 생성하는 가장 일반적인 방법입니다. 이 경우 문자열 리터럴은 이중 인용부호로 둘러싸여 있습니다.
String str = "abc";
이중 인용부호를 사용하여 문자열을 만들 때 JVM은 동일한 값을 가진 다른 문자열이 문자열 풀에 저장되어 있는지 확인합니다. 찾았다면 해당 문자열 객체에 대한 참조를 반환하고 그렇지 않으면 주어진 값으로 새로운 문자열 객체를 만들어 문자열 풀에 저장합니다.
-
새 키워드 사용
일반적인 자바 클래스처럼 새 연산자를 사용하여 String 객체를 생성할 수 있습니다. String 클래스에는 char 배열, 바이트 배열, StringBuffer 및 StringBuilder에서 문자열을 가져오는 여러 생성자가 있습니다.
String str = new String("abc"); char[] a = {'a', 'b', 'c'}; String str2 = new String(a);
Java String 비교
String 클래스는 두 문자열을 비교하기 위해 equals()
및 equalsIgnoreCase()
메서드를 제공합니다. 이러한 메서드는 두 문자열의 값을 비교하여 두 문자열이 동일한지 여부를 확인합니다. 두 문자열이 동일하면 true
를 반환하고 그렇지 않으면 false
를 반환합니다.
package com.journaldev.string.examples;
/**
* Java String Example
*
* @author pankaj
*
*/
public class StringEqualExample {
public static void main(String[] args) {
//두 개의 문자열 객체 생성
String s1 = "abc";
String s2 = "abc";
String s3 = "def";
String s4 = "ABC";
System.out.println(s1.equals(s2));//true
System.out.println(s2.equals(s3));//false
System.out.println(s1.equals(s4));//false;
System.out.println(s1.equalsIgnoreCase(s4));//true
}
}
위 프로그램의 출력은:
true
false
false
true
문자열 클래스는 Comparable 인터페이스를 구현하며, 두 문자열을 사전식으로 비교하는 compareTo()
및 compareToIgnoreCase()
메서드를 제공합니다. 두 문자열은 비교를 위해 유니코드 값으로 변환되고, 결과는 정수 값으로 반환됩니다. 문자열이 동일하면 0을 반환하고, 그렇지 않으면 0보다 크거나 작은 값을 반환합니다.
package com.journaldev.examples;
/**
* Java String compareTo Example
*
* @author pankaj
*
*/
public class StringCompareToExample {
public static void main(String[] args) {
String a1 = "abc";
String a2 = "abc";
String a3 = "def";
String a4 = "ABC";
System.out.println(a1.compareTo(a2));//0
System.out.println(a2.compareTo(a3));//less than 0
System.out.println(a1.compareTo(a4));//greater than 0
System.out.println(a1.compareToIgnoreCase(a4));//0
}
}
위 프로그램의 출력은 다음과 같습니다:
0
-3
32
0
자세한 내용은 String compareTo 예제에서 자세히 읽어주세요.
Java 문자열 메서드
다음은 몇 가지 인기 있는 문자열 클래스 메서드와 예제 프로그램을 살펴보겠습니다.
-
split()
Java String split() 메서드는 지정된 표현식을 사용하여 문자열을 분할하는 데 사용됩니다. split() 메서드에는 두 가지 변형이 있습니다.
split(String regex)
: 이 메서드는 주어진 정규식 표현식을 사용하여 문자열을 분할하고 문자열 배열을 반환합니다.split(String regex, int limit)
: 이 메서드는 주어진 정규식 표현식을 사용하여 문자열을 분할하고 문자열 배열을 반환하지만 배열 요소는 지정된 제한에 의해 제한됩니다. 지정된 제한이 2이면 메서드는 크기가 2인 배열을 반환합니다.
package com.journaldev.examples; /** * Java String split 예제 * * @author pankaj * */ public class StringSplitExample { public static void main(String[] args) { String s = "a/b/c/d"; String[] a1 = s.split("/"); System.out.println("정규식만 사용하여 문자열 분할:"); for (String string : a1) { System.out.println(string); } System.out.println("제한이 있는 정규식을 사용하여 문자열 분할:"); String[] a2 = s.split("/", 2); for (String string : a2) { System.out.println(string); } } }
위 프로그램의 출력 결과는 다음과 같습니다:
정규식만 사용하여 문자열 분할: a b c d 제한이 있는 정규식을 사용하여 문자열 분할: a b/c/d
-
contains(CharSequence s)
Java String contains() 메서드는 문자열이 지정된 문자열 시퀀스를 포함하는지 여부를 확인합니다. 이 메서드는 문자열이 지정된 문자열 시퀀스를 포함하면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
package com.journaldev.examples; /** * Java String contains() 예제 * * @author pankaj * */ public class StringContainsExample { public static void main(String[] args) { String s = "Hello World"; System.out.println(s.contains("W"));//true System.out.println(s.contains("X"));//false } }
위 프로그램의 출력은:
true false
-
length()
Java String length() 메서드는 문자열의 길이를 반환합니다.
package com.journaldev.examples; /** * Java String length * * @author pankaj * */ public class StringLengthExample { public static void main(String[] args) { String s1 = "abc"; String s2 = "abcdef"; String s3 = "abcdefghi"; System.out.println(s1.length());//3 System.out.println(s2.length());//6 System.out.println(s3.length());//9 } }
-
replace()
Java String replace() 메서드는 문자열의 특정 부분을 다른 문자열로 대체하는 데 사용됩니다. replace() 메서드에는 네 가지 변형이 있습니다.
replace(char oldChar, char newChar)
: 이 메서드는 문자열에서 oldChar의 모든 발생을 newChar로 대체합니다.replace(CharSequence target, CharSequence replacement)
: 이 메서드는 문자열에서 각 target 리터럴을 replacement 리터럴로 대체합니다.replaceAll(String regex, String replacement)
: 이 메서드는 문자열에서 지정된 정규식과 일치하는 부분 문자열의 모든 발생을 지정된 대체로 대체합니다.replaceFirst(String regex, String replacement)
: 이 메서드는 지정된 정규식과 일치하는 첫 번째 부분 문자열을 지정된 대체로 대체합니다.
package com.journaldev.examples; /** * Java String replace * * @author pankaj * */ public class StringReplaceExample { public static void main(String[] args) { //replace(char oldChar, char newChar) String s = "Hello World"; s = s.replace('l', 'm'); System.out.println("After Replacing l with m :"); System.out.println(s); //replaceAll(String regex, String replacement) String s1 = "Hello journaldev, Hello pankaj"; s1 = s1.replaceAll("Hello", "Hi"); System.out.println("After Replacing :"); System.out.println(s1); //replaceFirst(String regex, String replacement) String s2 = "Hello guys, Hello world"; s2 = s2.replaceFirst("Hello", "Hi"); System.out.println("After Replacing :"); System.out.println(s2); } }
위 프로그램의 출력은 다음과 같습니다:
After Replacing l with m : Hemmo Wormd After Replacing : Hi journaldev, Hi pankaj After Replacing : Hi guys, Hello world
-
format()
Java Sting format() 메소드는 문자열을 형식화하는 데 사용됩니다. Java String format() 메소드에는 두 가지 변형이 있습니다.
format(Locale l, String format, Object… args)
: 이 메소드는 지정된 로캘, 문자열 형식 및 인수를 사용하여 문자열을 형식화합니다.format(String format, Object… args)
: 이 메소드는 지정된 문자열 형식과 인수를 사용하여 문자열을 형식화합니다.
package com.journaldev.examples; import java.util.Locale; /** * Java String format * * @author pankaj * */ public class StringFormatExample { public static void main(String[] args) { String s = "journaldev.com"; // %s is used to append the string System.out.println(String.format("This is %s", s)); //using locale as Locale.US System.out.println(String.format(Locale.US, "%f", 3.14)); } }
위 프로그램의 출력은:
This is journaldev.com 3.140000
-
substring()
이 메소드는 지정된 인덱스를 기반으로 문자열의 일부를 반환합니다.
package com.journaldev.examples; /** * Java String substring * */ public class StringSubStringExample { public static void main(String[] args) { String s = "This is journaldev.com"; s = s.substring(8,18); System.out.println(s); } }
문자열 연결
문자열 연결은 자바에서 매우 기본적인 작업입니다. 문자열은 “+” 연산자를 사용하거나 concat()
메소드를 사용하여 연결할 수 있습니다.
package com.journaldev.examples;
/**
* Java String concatenation
*
* @author pankaj
*
*/
public class StringConcatExample {
public static void main(String[] args) {
String s1 = "Hello";
String s2 = "World";
String s3 = s1 + s2;
// + 연산자 사용
System.out.println("Using + operator: ");
System.out.println(s3);
// concat 메소드 사용
System.out.println("Using concat method: ");
System.out.println(s1.concat(s2));
}
}
위 프로그램의 출력은 다음과 같습니다:
Using + operator:
HelloWorld
Using concat method:
HelloWorld
Java에서 문자열 연결에 대한 자세한 정보는 이 포스트를 확인하십시오.
자바 문자열 풀
메모리 관리는 모든 프로그래밍 언어의 가장 중요한 측면입니다. Java의 문자열의 경우, 메모리 관리는 다른 클래스와 약간 다릅니다. Java를 더 메모리 효율적으로 만들기 위해 JVM은 문자열을 위한 특수한 메모리 영역인 String Constant Pool을 도입했습니다. 문자열 리터럴을 생성할 때, 문자열 풀에 동일한 문자열이 이미 있는지 확인합니다. 이미 존재한다면, 문자열 풀의 해당 문자열의 참조를 반환합니다. 아래 예제 프로그램을 살펴보겠습니다.
package com.journaldev.examples;
/**
* Java String Pool Example
*
*/
public class StringPoolExample {
public static void main(String[] args) {
String a = "abc";
String b = "abc";
String c = "def";
//동일한 참조
if (a==b) {
System.out.println("Both string refer to the same object");
}
//다른 참조
if (a==c) {
System.out.println("Both strings refer to the same object");
}else {
System.out.println("Both strings refer to the different object");
}
}
}
위 프로그램의 출력은 다음과 같습니다:
Both string refer to the same object
Both strings refer to the different object
더 자세한 내용은 Java String Pool을 참조하십시오.
intern() 메소드
문자열 리터럴을 사용하여 문자열을 생성하면 문자열 풀에 생성됩니다. 그러나 동일한 값을 가진 new 키워드를 사용하여 문자열을 생성한다면 어떻게 될까요? 힙 메모리에서 문자열을 문자열 풀로 이동시킬 수 있을까요? 이를 위해 intern() 메소드를 사용하며, 이 메소드는 문자열 객체의 규범적인 표현을 반환합니다. new 키워드를 사용하여 생성된 문자열 객체에 intern() 메소드를 호출하면, 풀에 이미 동일한 값의 문자열이 있는지 확인합니다. 만약 있다면, 해당 문자열 객체의 참조를 풀에서 반환합니다. 그렇지 않다면, 풀에 동일한 내용의 새로운 문자열을 생성하고 그 참조를 반환합니다.
package com.journaldev.examples;
/**
* Java String intern
*
* @author pankaj
*
*/
public class StringInternExample {
public static void main(String[] args) {
String s1 = "pankaj";
String s2 = "pankaj";
String s3 = new String("pankaj");
System.out.println(s1==s2);//true
System.out.println(s2==s3);//false
String s4 = s3.intern();
System.out.println(s1==s4);//true
}
}
이 게시물에서 Java String intern 메서드에 대해 더 알아보세요.
문자열 불변성의 이점
문자열이 불변 클래스인 장점 중 일부는 다음과 같습니다:
- 문자열 상수 풀, 따라서 메모리를 절약합니다.
- 변경할 수 없으므로 보안이 보장됩니다.
- 스레드 안전
- 클래스 로딩 보안
문자열 불변성의 장점에 대해 더 알아보려면 이 게시물을 확인하세요.
Java 8 String join()
A new static method join() has been added in String class in Java 8. This method returns a new String composed of copies of the CharSequence elements joined together with a copy of the specified delimiter. Let’s look at an example to understand it easily.
List<String> words = Arrays.asList(new String[]{"Hello", "World", "2019"});
String msg = String.join(" ", words);
System.out.println(msg);
출력: Hello World 2019
Java 9 문자열 메서드
Java 9 릴리스에서 String 클래스에 추가된 두 가지 메서드가 있습니다. 코드 포인트()와 chars(). 이러한 메서드는 IntStream 객체를 반환하며 해당 객체에서 작업을 수행할 수 있습니다. 이 메서드들을 간단히 살펴보겠습니다.
String s = "abc";
s.codePoints().forEach(x -> System.out.println(x));
s.chars().forEach(x -> System.out.println(x));
출력:
97
98
99
97
98
99
Java 11 String Class 새로운 메서드
Java 11 릴리스에서 String 클래스에 많은 새로운 메서드가 추가되었습니다.
- isBlank() – 문자열이 비어 있거나 공백 코드포인트만 포함하면 true를 반환하고 그렇지 않으면 false를 반환합니다.
- lines() – 이 문자열에서 추출된 라인의 스트림을 반환하며 라인 구분자로 분리됩니다.
- strip(), stripLeading(), stripTrailing() – 문자열에서 선행 및 후행 공백을 제거하는 데 사용됩니다.
- repeat() – 주어진 횟수만큼 이 문자열을 반복한 값이 있는 문자열을 반환합니다.
이 메서드들에 대한 예제 프로그램을 살펴보겠습니다.
package com.journaldev.strings;
import java.util.List;
import java.util.stream.Collectors;
/**
* JDK 11 New Functions in String class
*
* @author pankaj
*
*/
public class JDK11StringFunctions {
public static void main(String[] args) {
// isBlank()
String s = "abc";
System.out.println(s.isBlank());
s = "";
System.out.println(s.isBlank());
// lines()
String s1 = "Hi\nHello\rHowdy";
System.out.println(s1);
List lines = s1.lines().collect(Collectors.toList());
System.out.println(lines);
// strip(), stripLeading(), stripTrailing()
String s2 = " Java, \tPython\t ";
System.out.println("#" + s2 + "#");
System.out.println("#" + s2.strip() + "#");
System.out.println("#" + s2.stripLeading() + "#");
System.out.println("#" + s2.stripTrailing() + "#");
// repeat()
String s3 = "Hello\n";
System.out.println(s3.repeat(3));
s3 = "Co";
System.out.println(s3.repeat(2));
}
}
출력:
false
true
Hi
Hello
Howdy
[Hi, Hello, Howdy]
# Java, Python #
#Java, Python#
#Java, Python #
# Java, Python#
Hello
Hello
Hello
CoCo
이것이 Java String 클래스, 그 메서드 및 String 조작 예제에 관한 모든 내용입니다.
더 많은 String 예제는 GitHub Repository에서 확인할 수 있습니다.
참고: API 문서
Source:
https://www.digitalocean.com/community/tutorials/java-string