Categories: Java

Java 자바 String 클래스 특징 및 메소드

String 클래스란?

자바에서 String 클래스는 가장 널리 사용되는 클래스 중 하나입니다. 문자열 시퀀스를 나타내며, 문자열을 조작하고, 비교하고, 변환하는 데 사용되는 다양한 메소드를 제공합니다. 자바의 문자열은 불변(immutable)으로, 한 번 생성된 String 객체의 값은 변경될 수 없습니다. 이러한 불변성은 문자열의 보안성과 효율성을 높이는 데 기여합니다.

String 클래스의 특징

자바의 String 클래스는 문자열을 처리하는데 필수적이며, 자바에서 문자열을 효율적으로 관리하기 위해 여러 특징들을 가지고 있습니다. 다음은 String 클래스의 주요 특징들을 설명한 것입니다.

1. 불변성 (Immutability)

  • 정의: 문자열 객체가 생성된 후에는 그 내용을 변경할 수 없습니다.
  • 이유:
    • 보안: 불변 객체는 외부의 변화에 안전합니다.
    • 성능: 문자열을 공유할 수 있어 메모리 효율성을 높입니다.
    • 동기화: 불변 객체는 본질적으로 스레드 안전(Thread-safe)합니다.
Java
String str = "Hello";
str = str.concat(" World"); // 새로운 String 객체가 생성됨
Java

2. 문자열 리터럴 (String Literals)

  • 정의: 문자열 리터럴은 소스 코드에서 직접 문자열 값을 지정하는 방법입니다.
  • 특징:
    • 문자열 리터럴은 자바의 문자열 풀(String Pool)에 저장됩니다.
    • 동일한 리터럴은 동일한 객체를 참조합니다.
Java
String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1 == str2); // true, 같은 객체 참조
Java

3. 문자열 풀 (String Pool)

  • 정의: 문자열 풀은 자바 힙 메모리 내에 있는 특수한 저장소로, 문자열 리터럴을 저장합니다.
  • 특징:
    • 메모리 절약: 동일한 문자열 리터럴은 하나의 객체로 관리됩니다.
    • 성능 향상: 문자열 비교 시 빠른 비교가 가능합니다.
Java
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");
System.out.println(str1 == str2); // true, 같은 풀 내 객체
System.out.println(str1 == str3); // false, 다른 객체
Java

4. 값 비교 (Value Comparison)

  • 정의: 문자열의 값을 비교할 때는 equals() 메소드를 사용합니다.
  • 특징:
    • == 연산자는 객체의 참조를 비교합니다.
    • equals() 메소드는 문자열의 내용을 비교합니다.
Java
String str1 = "Hello";
String str2 = new String("Hello");
System.out.println(str1 == str2); // false, 다른 객체
System.out.println(str1.equals(str2)); // true, 같은 내용
Java

5. 불변성과 성능 (Immutability and Performance)

  • 특징:
    • 문자열 조작 시 새로운 문자열 객체를 생성합니다.
    • 반복적인 문자열 변경 작업에서는 성능 문제가 발생할 수 있습니다.
    • 이러한 문제를 해결하기 위해 StringBuilder 또는 StringBuffer를 사용합니다.
Java
String str = "Hello";
for (int i = 0; i < 1000; i++) {
    str += " World";
}
// 위 코드는 성능이 좋지 않습니다.
Java

6. 문자 배열 (Character Array)

  • 정의: 문자열은 내부적으로 문자 배열(char array)로 관리됩니다.
  • 특징:
    • String 객체의 내용을 변경할 수 없으므로, 내부 배열도 불변으로 유지됩니다.
Java
char[] chars = {'H', 'e', 'l', 'l', 'o'};
String str = new String(chars);
System.out.println(str); // "Hello"
Java

7. 상속 구조 (Inheritance Structure)

  • 정의: String 클래스는 Object 클래스를 직접 상속 받습니다.
  • 특징:
    • final 클래스로 선언되어 상속할 수 없습니다.
    • 이는 String의 불변성을 보장하기 위함입니다.
Java
public final class String extends Object {
    // 클래스 내용
}
Java

8. 문자열 인터닝 (String Interning)

  • 정의: intern() 메소드를 사용하여 문자열을 풀에 추가할 수 있습니다.
  • 특징:
    • 이미 풀에 존재하는 문자열과 동일한 내용을 가지는 문자열 객체를 풀 내의 객체로 대체합니다.
    • 메모리 효율성을 높입니다.
Java
String str1 = new String("Hello");
String str2 = str1.intern();
System.out.println(str1 == str2); // false, str1은 풀 외부 객체
System.out.println("Hello" == str2); // true, str2는 풀 내 객체
Java

9. 스레드 안전성 (Thread Safety)

  • 특징:
    • 불변성으로 인해 String 객체는 본질적으로 스레드 안전합니다.
    • 여러 스레드에서 동일한 String 객체를 안전하게 공유할 수 있습니다.
Java
String sharedString = "Shared";
Runnable task = () -> {
    System.out.println(sharedString);
};
new Thread(task).start();
new Thread(task).start();
Java

10. 유니코드 지원 (Unicode Support)

  • 정의: 자바의 String 클래스는 유니코드를 지원합니다.
  • 특징:
    • 다양한 언어와 문자를 표현할 수 있습니다.
    • UTF-16 인코딩을 사용하여 내부적으로 문자열을 관리합니다.
Java
String str = "안녕하세요";
System.out.println(str); // "안녕하세요"
Java

String 클래스의 메소드

자바 String 클래스는 문자열을 조작하는 데 유용한 다양한 메소드를 제공합니다. 이 섹션에서는 String 클래스의 주요 메소드들을 설명합니다.

length()
  • 설명: 문자열의 길이를 반환합니다.
  • 반환값: 문자열의 문자 수를 나타내는 정수(int) 값.
  • 예시: “Hello World”.length()는 11을 반환합니다.
charAt(int index)
  • 설명: 지정된 인덱스의 문자를 반환합니다.
  • 매개변수: index – 반환할 문자의 인덱스(0부터 시작).
  • 반환값: 지정된 인덱스에 위치한 문자(char).
  • 예시: “Hello”.charAt(1)은 ‘e’를 반환합니다.
substring(int beginIndex)
  • 설명: 지정된 시작 인덱스부터 문자열의 끝까지 부분 문자열을 반환합니다.
  • 매개변수: beginIndex – 시작 인덱스(포함).
  • 반환값: 지정된 인덱스부터 끝까지의 부분 문자열.
  • 예시: “Hello World”.substring(6)은 “World”를 반환합니다.
substring(int beginIndex, int endIndex)
  • 설명: 지정된 범위의 부분 문자열을 반환합니다.
  • 매개변수:
    • beginIndex – 시작 인덱스(포함).
    • endIndex – 끝 인덱스(미포함).
  • 반환값: 지정된 시작 인덱스부터 끝 인덱스 전까지의 부분 문자열.
  • 예시: “Hello World”.substring(0, 5)는 “Hello”를 반환합니다.
concat(String str)
  • 설명: 두 문자열을 결합합니다.
  • 매개변수: str – 결합할 문자열.
  • 반환값: 원래 문자열에 str이 결합된 새로운 문자열.
  • 예시: “Hello”.concat(“World”)는 “HelloWorld”를 반환합니다.
indexOf(String str)
  • 설명: 지정된 문자열이 처음으로 등장하는 인덱스를 반환합니다.
  • 매개변수: str – 찾고자 하는 문자열.
  • 반환값: 지정된 문자열이 처음으로 등장하는 인덱스, 찾을 수 없으면 -1.
  • 예시: “Hello World”.indexOf(“World”)는 6을 반환합니다.
indexOf(String str, int fromIndex)
  • 설명: 지정된 문자열이 주어진 인덱스 이후로 처음 등장하는 위치를 반환합니다.
  • 매개변수:
    • str – 찾고자 하는 문자열.
    • fromIndex – 검색을 시작할 인덱스.
  • 반환값: 지정된 문자열이 fromIndex 이후로 처음 등장하는 인덱스, 찾을 수 없으면 -1.
  • 예시: “Hello World Hello”.indexOf(“Hello”, 6)는 12를 반환합니다.
lastIndexOf(String str)
  • 설명: 지정된 문자열이 마지막으로 등장하는 인덱스를 반환합니다.
  • 매개변수: str – 찾고자 하는 문자열.
  • 반환값: 지정된 문자열이 마지막으로 등장하는 인덱스, 찾을 수 없으면 -1.
  • 예시: “Hello World Hello”.lastIndexOf(“Hello”)는 12를 반환합니다.
lastIndexOf(String str, int fromIndex)
  • 설명: 지정된 문자열이 주어진 인덱스 이전으로 마지막 등장하는 위치를 반환합니다.
  • 매개변수:
    • str – 찾고자 하는 문자열.
    • fromIndex – 검색을 시작할 인덱스.
  • 반환값: 지정된 문자열이 fromIndex 이전으로 마지막 등장하는 인덱스, 찾을 수 없으면 -1.
  • 예시: “Hello World Hello”.lastIndexOf(“Hello”, 10)는 0을 반환합니다.
equals(Object anObject)
  • 설명: 이 문자열과 지정된 객체가 같은지 비교합니다.
  • 매개변수: anObject – 비교할 객체.
  • 반환값: 문자열이 동일하면 true, 그렇지 않으면 false.
  • 예시: “Hello”.equals(new String(“Hello”))는 true를 반환합니다.
equalsIgnoreCase(String anotherString)
  • 설명: 이 문자열과 다른 문자열이 대소문자 구분 없이 같은지 비교합니다.
  • 매개변수: anotherString – 비교할 문자열.
  • 반환값: 대소문자 구분 없이 문자열이 동일하면 true, 그렇지 않으면 false.
  • 예시: “Hello”.equalsIgnoreCase(“hello”)는 true를 반환합니다.
compareTo(String anotherString)
  • 설명: 사전순으로 두 문자열을 비교합니다.
  • 매개변수: anotherString – 비교할 문자열.
  • 반환값: 이 문자열이 anotherString보다 작으면 음수, 같으면 0, 크면 양수.
  • 예시: “Hello”.compareTo(“World”)는 음수를 반환합니다.
compareToIgnoreCase(String str)
  • 설명: 대소문자를 무시하고 두 문자열을 사전순으로 비교합니다.
  • 매개변수: str – 비교할 문자열.
  • 반환값: 이 문자열이 str보다 작으면 음수, 같으면 0, 크면 양수.
  • 예시: “Hello”.compareToIgnoreCase(“hello”)는 0을 반환합니다.
toLowerCase()
  • 설명: 문자열을 소문자로 변환하여 반환합니다.
  • 반환값: 소문자로 변환된 새로운 문자열.
  • 예시: “Hello World”.toLowerCase()는 “hello world”를 반환합니다.
toUpperCase()
  • 설명: 문자열을 대문자로 변환하여 반환합니다.
  • 반환값: 대문자로 변환된 새로운 문자열.
  • 예시: “Hello World”.toUpperCase()는 “HELLO WORLD”를 반환합니다.
trim()
  • 설명: 문자열의 양쪽 끝에 있는 공백을 제거합니다.
  • 반환값: 앞뒤 공백이 제거된 새로운 문자열.
  • 예시: ” Hello World “.trim()는 “Hello World”를 반환합니다.
replace(char oldChar, char newChar)
  • 설명: 문자열 내의 모든 특정 문자를 새로운 문자로 대체합니다.
  • 매개변수:
    • oldChar – 기존 문자.
    • newChar – 대체할 새로운 문자.
  • 반환값: 대체된 새로운 문자열.
  • 예시: “Hello”.replace(‘l’, ‘p’)는 “Heppo”를 반환합니다.
replace(CharSequence target, CharSequence replacement)
  • 설명: 문자열 내의 모든 특정 문자 시퀀스를 새로운 시퀀스로 대체합니다.
  • 매개변수:
    • target – 기존 시퀀스.
    • replacement – 대체할 새로운 시퀀스.
  • 반환값: 대체된 새로운 문자열.
  • 예시: “Hello World”.replace(“World”, “Java”)는 “Hello Java”를 반환합니다.
split(String regex)
  • 설명: 지정된 정규 표현식을 기준으로 문자열을 분할합니다.
  • 매개변수: regex – 분할할 기준이 되는 정규 표현식.
  • 반환값: 분할된 문자열 배열.
  • 예시: “one,two,three”.split(“,”)는 [“one”, “two”, “three”] 배열을 반환합니다.
split(String regex, int limit)
  • 설명: 지정된 정규 표현식을 기준으로 문자열을 분할하되, 분할 횟수를 제한합니다.
  • 매개변수:
    • regex – 분할할 기준이 되는 정규 표현식.
    • limit – 분할할 최대 횟수.
  • 반환값: 분할된 문자열 배열.
  • 예시: “one,two,three”.split(“,”, 2)는 [“one”, “two,three”] 배열을 반환합니다.
join(CharSequence delimiter, CharSequence… elements)
  • 설명: 지정된 구분자를 사용하여 문자열 배열을 하나의 문자열로 결합합니다.
  • 매개변수:
    • delimiter – 요소를 결합할 때 사용할 구분자.
    • elements – 결합할 문자열 요소들.
  • 반환값: 결합된 새로운 문자열.
  • 예시: String.join(“-“, “one”, “two”, “three”)는 “one-two-three”를 반환합니다.
contains(CharSequence s)
  • 설명: 문자열이 특정 시퀀스를 포함하는지 확인합니다.
  • 매개변수: s – 포함 여부를 확인할 문자 시퀀스.
  • 반환값: 포함하면 true, 그렇지 않으면 false.
  • 예시: “Hello World”.contains(“World”)는 true를 반환합니다.
startsWith(String prefix)
  • 설명: 문자열이 지정된 접두사로 시작하는지 확인합니다.
  • 매개변수: prefix – 확인할 접두사.
  • 반환값: 접두사로 시작하면 true, 그렇지 않으면 false.
  • 예시: “Hello World”.startsWith(“Hello”)는 true를 반환합니다.
startsWith(String prefix, int toffset)
  • 설명: 문자열의 지정된 인덱스에서 시작하여, 지정된 접두사로 시작하는지 확인합니다.
  • 매개변수:
    • prefix – 확인할 접두사.
    • toffset – 시작 인덱스.
  • 반환값: 접두사로 시작하면 true, 그렇지 않으면 false.
  • 예시: “Hello World”.startsWith(“World”, 6)는 true를 반환합니다.
endsWith(String suffix)
  • 설명: 문자열이 지정된 접미사로 끝나는지 확인합니다.
  • 매개변수: suffix – 확인할 접미사.
  • 반환값: 접미사로 끝나면 true, 그렇지 않으면 false.
  • 예시: “Hello World”.endsWith(“World”)는 true를 반환합니다.
toCharArray()
  • 설명: 문자열을 문자 배열로 변환하여 반환합니다.
  • 반환값: 문자열의 문자 배열.
  • 예시: “Hello”.toCharArray()는 [‘H’, ‘e’, ‘l’, ‘l’, ‘o’] 배열을 반환합니다.
format(String format, Object… args)
  • 설명: 지정된 형식 문자열과 인수를 사용하여 형식화된 문자열을 반환합니다.
  • 매개변수:
    • format – 형식 문자열.
    • args – 형식 문자열에 대한 인수들.
  • 반환값: 형식화된 새로운 문자열.
  • 예시: String.format(“Hello, %s!”, “World”)는 “Hello, World!”를 반환합니다.
valueOf(Object obj)
  • 설명: 지정된 객체의 문자열 표현을 반환합니다.
  • 매개변수: obj – 문자열 표현을 반환할 객체.
  • 반환값: 객체의 문자열 표현.
  • 예시: String.valueOf(123)는 “123”을 반환합니다.

결론

자바의 String 클래스는 프로그래밍에서 매우 중요한 역할을 하며, 문자열 조작을 위한 다양한 메소드를 제공합니다. 문자열의 불변성은 보안성, 성능 및 스레드 안전성을 높이는 데 기여합니다. 문자열 리터럴과 문자열 풀을 활용한 메모리 관리, 문자열 비교 및 조작을 위한 다양한 메소드들은 효율적이고 안전한 문자열 처리를 가능하게 합니다. 따라서, String 클래스의 특징과 메소드를 잘 이해하고 활용하는 것은 자바 프로그래밍의 기본이자 필수적인 요소입니다.

suover

Recent Posts

Java 자바 Set – HashSet, TreeSet, LinkedHashSet 정리

소개 자바에서 Set은 중복을 허용하지 않는 데이터 집합을 의미합니다. List와 달리 동일한 요소를 여러 번…

1개월 ago

Java 자바 Hash 해시 제대로 이해하기

해시(Hash)란 무엇인가? 해시(Hash)는 자바 프로그래밍에서 빠르고 효율적인 데이터 저장 및 검색을 위한 핵심적인 개념입니다. 이…

2개월 ago

Java 자바 리스트 (List) 정리

List란 무엇인가? List는 자바 컬렉션 프레임워크의 핵심 인터페이스 중 하나로, 순서가 있는 데이터를 다루는 데…

2개월 ago

Java 자바 LinkedList 동작 원리와 사용법

LinkedList란 무엇인가? LinkedList는 자바에서 유용하게 사용되는 자료구조 중 하나로, 연결 리스트 방식을 이용하여 데이터를 관리하는…

2개월 ago

Java 자바 ArrayList 동작 원리와 사용법

ArrayList란 무엇인가? ArrayList는 자바에서 가장 널리 사용되는 컬렉션 중 하나로, 가변 크기의 배열을 구현한 클래스입니다.…

2개월 ago

Java 자바 제네릭(Generic) 개념과 문법 알아보기

제네릭(Generic)이란? 자바 제네릭은 코드의 재사용성을 높이고 타입 안전성을 보장하는 중요한 개념입니다. 이 블로그 글에서는 자바…

2개월 ago