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 자바 Enum 열거형 사용법

Enum이란? Enum은 "enumeration"의 줄임말로, 특정 값들의 집합을 정의할 수 있는 특별한 클래스입니다. 예를 들어, 요일,…

3주 ago

Java 자바 래퍼 클래스(Wrapper Class)란? 래퍼 클래스의 필요성

래퍼 클래스(Wrapper Class)란? 자바에서 래퍼 클래스는 기본 데이터 타입(Primitive Data Type)을 객체(Object)로 감싸는 클래스입니다. 자바의…

4주 ago

Java 자바 StringBuilder 개념 및 특징 주요 메소드

서론 Java에서 문자열을 다룰 때, 문자열의 변경이 빈번하게 발생하는 경우라면 StringBuilder 클래스를 사용하는 것이 매우…

1개월 ago

웹 개발 FitOn 팀 프로젝트 회고

서론 현대인들은 점점 더 운동과 건강에 대한 관심을 가지고 있으며, 이를 체계적으로 관리하고 공유할 수…

1개월 ago

Java 자바 불변 객체(Immutable Object) 개념 정리

불변 객체란? 불변 객체(Immutable Object)는 생성된 이후 그 상태를 변경할 수 없는 객체를 의미합니다. 불변…

2개월 ago

Java 자바 Object 클래스와 메소드

Object 란? 자바에서 Object 클래스는 모든 클래스의 최상위 부모 클래스입니다. 모든 자바 클래스는 명시적으로 다른…

2개월 ago