String 클래스에서 제공하는 메서드는 무엇이 있을까?
String 클래스
--
문자열을 다루기 위한 대표적인 클래스로,
문자열을 다룰 때 불변(immutable)성과 메모리 효율성을 제공하며, 다양한 편의 메서드를 제공한다.
불변(immutable)?
말 그대로 한 번 생성된 문자열 객체는 해당 값을 변경할 수 없다.
String 타입의 문자열 수정이 가능하던데?
외관상으로는 수정이 되는 것 처럼 보이지만
사실 새로운 String 타입의 객체를 새로 생성하고 이를 사용하도록 변경한 것이다.
기존에 사용하던 String 타입의 객체는 GC로 인해 제거된다.
String str1 = "Hello"; str1 = "world"; str1 = "Hello" + str1; // str1은 "Hello"에서 "world"로 변경되는데 // 사실 수정되는 것이 아닌 "world" 값을 가진 새로운 String 객체를 생성하여 // str1로 재생성한 것이다. (+연산자로 문자열을 결합하는 것도 동일)
만약 수정을 많이 해야하는 상황이라면
문자열 변경이 가능한 StringBuffer클래스를 사용하여 문자열을 구현하면 된다.
메모리 효율성?
문자열을 생성할 때 해당 값은 String Pool에 저장되며,
만약 이전에 생성한 동일한 문자열을 사용하게 된다면 기존에 생성한 객체를 재사용한다.
String str1 = "Hello"; String str2 = "Hello"; // (str1 == str2) = ture // str2에서 "Hello"를 할당 할 때 str1의 값을 재활용하여 할당 (즉, 같은 참조 주소를 가짐) String str3 = new String("Hello"); // (str1 == str3) = false // 다만 new키워드를 통해 새로운 객체를 생성하면 String Pool를 사용하지 않아 재사용 안함
String 타입으로 저장한 문자열은 해당 문자열 자체로 저장되는 것이 아니라
해당 문자열을 각 문자로 나누고 배열 형태로 저장한다.
Java 8까지는 문자열을 각 문자(char)로 나누고 char[] 배열로 저장했지만
Java 9부터는 메모리 효율성을 위해 각 문자를 char[] 대신 byte[]로 저장하여 인코딩에 따라 필요한 만큼만 메모리에 사용하므로 전체 메모리 사용량이 줄어들며, 메모리 캐시 효율을 높였다.
(LATIN1과 UTF-16 두 가지 인코딩 방식을 사용하여 각 문자를 byte[]배열로 저장한다.)
String str = "Hello";
// Java 8버전까지의 Stirng 내부 저장 형태
char[] value = {'H', 'e', 'l', 'l', 'o'};
// Java 9버전 이후의 String 내부 저장 형태 (LATIN1 인코딩 사용)
byte[] value = {72, 101, 108, 108, 111};
자주 사용하는 메서드 기능 (+ 예시 코드)
--
join()과 split() (+ StringJoiner 클래스)
--
- join() : 여러 문자열(문자열 배열) 사이에 구분자를 넣어 하나의 문자열로 결함
- split() : join()과 반대로 하나의 문자열에서 특정 구분자를 기준으로 문자열을 자르고 배열로 반환
예시 코드
String animals = "dog,cat,bear";
String[] arr = animals.split(","); // 문자열을 ','로 나눠서 배열에 저장
String str = String.join("-", arr); // 배열의 문자열을 '-'로 결합
System.out.println(str) // 결과 dog-cat-bear
StringJoiner 클래스
Java 8에서 도입된 유틸리티 클래스로,
문자열을 결합할 때 유용하게 사용할 수 있다.
String 클래스와 직접적인 관계는 없다.
기본 형식
StringJoiner 객체명 = new StringJoiner(구분자, 처음 문자열, 마지막 문자열);
예시 코드
StringJoiner sj = new StringJoiner("," , "[" , "]"); // (구분자, 처음 문자열, 마지막 문자열)
for (String s : arr) { // arr[0] = "dog", arr[1] = "cat", arr[2] = "bear"
sj.add(s.toUpperCase());
}
System.out.println(sj.toString()); // 결과 [DOG,CAT,BEAR]
--
String.format()
--
형식화된 문자열을 만드는 방법으로
pringf()와 사용법이 동일하다.
기본 형식
String 변수명 = String.format(형식, 값1, 값2, ...);
예시 코드
String str = String.format("$d 더하기 %d은 $d입니다.", 3, 10, 3+10);
// str = "3 더하기 10은 13입니다."
자주 사용하는 기본 형식 지정자
- %d : 정수형 (int)
- %f : 부동 소수점 숫자 (float, double)
- %s : 문자열 (String)
- %c : 문자 (char)
- %b : 불리언 (boolean)
- %n : 줄 바꿈
- %x : 16진수 정수
- %o : 8진수 정수
- %e : 지수
String str = String.format("Value: %5d", 42); // 최소 길이는 5, 나머지는 공백으로 채우고 우측 정렬
// str = "Value: 42"
String str = String.format("Value: %5d", 4212345);
// str = "Value: 4212345"
String str = String.format("Value: %-5d", 42); // 좌측 정렬
// str = "Value: 42 "
String str = String.format("Value: %05d", 42); // 우측 정렬 + 공백은 "0"으로 채움
// str = "Value: 00042"
String str = String.format("Value: %.3f", 142.55555); // 소수점 3자리까지만 반환 + 반올림
// str = "Value: 142.556
String str = String.format("Value: %2.4f", 142.55555); // 최소 길이 2, 나머지는 공백으로 채우고 우측 정렬
// str = "Value: 142.5556
String str = String.format("Value: %10.2f", 142.55555);
// str = "Value: 142.56"
--
valueOf() 반대 (String타입 -> 기본타입)
--
예시 코드
int i = 100;
String str1 = String.valueOf(i); // 기본형 -> String타입
// str1 = "100"
int result = Integer.parseInt(str1); // String타입 -> 기본형
// result = 100
--
'Language > Java' 카테고리의 다른 글
[java.lang] Wrapper 클래스 (기본형 객체 관련 클래스)(+오토박싱, 언박싱) (1) | 2024.11.04 |
---|---|
[java.lang] StringBuffer 클래스, StringBuilder 클래스 (가변 문자열 관련 클래스) (0) | 2024.11.03 |
[java.lang] Object 클래스 (객체 관련 클래스) (0) | 2024.10.31 |
java.lang 패키지 (1) | 2024.10.29 |
예외처리 (try-catch, finally, throw) (0) | 2024.10.24 |