String은 Java에서 가장 많이 사용되는 클래스 중 하나로, 문자열(텍스트 데이터)을 다루기 위해 설계된 불변(Immutable) 클래스입니다.
java.lang.String 클래스는 기본적으로 Java 프로그램에서 자동으로 임포트 되며, 문자열을 효율적으로 처리할 수 있도록 다양한 기능과 메서드를 제공합니다.
String의 특징
불변성 (Immutability)
String 객체는 한번 생성하고 나면 절대 변경할 수 없습니다. 따라서 문자열을 수정하려고 하면, 기존 문자열을 바꾸는 대신 새로운 String 객체를 생성합니다.
String str = "Hello";
str.concat("World"); // 새로운 문자열 생성, str은 여전히 "Hello"
System.out.println(str); // 출력: Hello
// 새로운 객체를 사용
str = str.concat("World");
System.out.println(str); // 출력: Hello World
String Pool
Java는 문자열을 String Pool이라는 메모리 공간에 저장해서 메모리 효율성을 높여줍니다.
즉, 동일한 값의 문자열이 여러 번 생성되더라도 중복을 방지하여 한번만 저장하게 됩니다.
String s1 = "Java";
String s2 = "Java";
System.out.println(s1 == s2); // true (같은 객체 참조)
String의 생성 방법
문자열 리터럴
위에서 설명한 String Pool 에 저장하는 방법이 문자열 리터럴입니다. 문자열을 " " 안에 작성하면 됩니다.
String s1 = "Java";
new 키워드
두번째 방법은 new 키워드를 사용하여 String을 생성하는 방법입니다. 이러한 방법은 String Pool을 사용하지 않고 새로운 객체를 힙 메모리에 생성합니다.
String s2 = new String("Java");
System.out.println(s1 == s2); // false (다른 객체)
String의 주요 메서드
문자열 길이
문자열의 길이를 반환합니다.
String str = "Hello";
System.out.println(str.length()); // 출력: 5
문자 추출
특정 인덱스의 문자를 반환합니다.
System.out.println(str.charAt(1)); // 출력: e
부분 문자열
문자열의 원하는 부분을 잘라 반환합니다.
- String substring(int beginIndex): 시작 인덱스부터 끝까지 반환.
- String substring(int beginIndex, int endIndex): 시작 ~ 끝 인덱스 사이를 반환 (끝은 제외)
String str = "Hello, World!";
System.out.println(str.substring(7)); // 출력: World!
System.out.println(str.substring(0, 5)); // 출력: Hello
문자열 연결
문자열을 연결해 줍니다. 단, + 연산자를 사용하는 것이 더 일반적입니다.
String s1 = "Java";
String s2 = "Programming";
System.out.println(s1.concat(" ").concat(s2)); // Java Programming
System.out.println(s1 + " " + s2); // Java Programming
문자열 비교
문자열의 내용이 같은지 비교합니다.
String a = "Java";
String b = "java";
System.out.println(a.equals(b)); // false
System.out.println(a.equalsIgnoreCase(b)); // true ( 대소문자 무시 )
문자열 수정
첫 번째 매개변수의 문자열을 찾아서 두 번째 매개변수의 문자열로 대치합니다.
String subject = "java Programming";
String newSub = subject.replace("java","JAVA");
// String 객체의 문자열은 변경이 불가능하다.
// 따라서, replace가 리턴하는 객체는 수정된 String 객체가 아니라 완전히 새로운 객체이다.
문자열 검색
- boolean contains(CharSequence s): 특정 문자열이 포함되어 있는지 확인.
- int indexOf(String str): 문자열의 첫 번째 위치 반환, 없으면 -1.
- int lastIndexOf(String str): 마지막으로 나타나는 위치 반환.
String str = "Hello, World!";
System.out.println(str.contains("World")); // true
System.out.println(str.indexOf("o")); // 4
System.out.println(str.lastIndexOf("o")); // 8
공백 제거
문자열 양쪽의 공백을 제거합니다.
String str = " Hello ";
System.out.println(str.trim()); // 출력: Hello
대소문자 변환
대문자로 변환하거나 소문자로 변환합니다.
String str = "Java";
System.out.println(str.toUpperCase()); // JAVA
System.out.println(str.toLowerCase()); // java
문자열 분할
특정 구분자로 문자열을 나눠 리스트 형식으로 저장합니다.
String str = "apple,banana,orange";
String[] fruits = str.split(",");
for (String fruit : fruits) {
System.out.println(fruit); // apple, banana, orange
}
String의 불변성의 장점과 단점
장점
변경이 불가능하여 멀티스레드 환경에서도 안전하며 같은 값의 문자열은 String Pool에서 재사용할 수 있어 메모리를 절약할 수 있다는 장점이 있습니다.
단점
문자열 변경이 빈번한 경우, 새로운 객체가 계속 생성되어 메모리와 성능에 부담이 될 수 있습니다.
그래서 나온 해결책이 StringBuilder , StringBuffer 입니다.
StringBuilder sb = new StringBuilder("Hello");
sb.append("World");
System.out.println(sb.toString()); // Hello World
String의 활용 예제
예제: 이메일 검증
public class StringExample {
public static void main(String[] args) {
String email = "user@example.com";
if (email.contains("@") && email.endsWith(".com")) {
System.out.println("Valid email");
} else {
System.out.println("Invalid email");
}
}
}
문자열 뒤집기
public class ReverseString {
public static void main(String[] args) {
String str = "Java";
String reversed = new StringBuilder(str).reverse().toString();
System.out.println(reversed); // avaJ
}
}
'Java' 카테고리의 다른 글
자바의 오류처리: 예외(Exception) 와 트랜잭션 처리 (0) | 2024.12.18 |
---|---|
자바의 toString 메서드 (1) | 2024.12.17 |
Java - Abstract (1) | 2024.12.11 |
업캐스팅 & 다운캐스팅 (1) | 2024.12.11 |
자바 공부할 때 도움이 되는 용어 설명 (0) | 2024.12.10 |