[Java] String 클래스

Yujeong·2024년 5월 19일
0

Java

목록 보기
4/22
post-thumbnail

String 클래스 구조

  • java9 전: private final char[] value;
  • java9 이후: private final byte[] value;
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence,
               Constable, ConstantDesc {

    @Stable
    private final byte[] value;
    ...

char는 2byte를 차지하지만, 영어나 숫자는 보통 1byte로 표현이 가능하다.
즉, char[]에서 byte[]로 바뀌면서 메모리를 더 효율적으로 사용하고 있다.

String 문자열 풀

String 클래스를 비교할 때는 == 비교가 아니라, 항상 equals()로 비교해야 한다.

  • 동일성(Identity): == 연산자를 사용해서 두 객체의 참조가 동일한 객체를 가리키고 있는지 확인
  • 동등성(Equality): equals() 메서드를 사용해서 두 객체가 논리적으로 같은지 확인
String str1 = new String("hello java");
String str2 = new String("hello java");
System.out.println(str1 == str2); // false
System.out.println(str1.equals(str2); // true

new String()을 사용해서 인스턴스를 각각 생성해주면, 동일성 비교를 했을 때 false의 결과가 나온다.
하지만, 문자열 리터럴을 사용하는 경우는 다르다. 문자열 리터럴을 사용할 때, 자바는 메모리 효율성과 성능 최적화를 위해 "문자열 풀(String pool)"을 사용한다.

  1. 문자열 리터럴이 있으면, 문자열 풀에 String 인스턴스를 미리 만들어둔다.
  2. 문자열 리터럴을 사용하면, 문자열 풀에서 문자를 가진 String 인스턴스를 찾는다.
  3. 찾은 인스턴스의 참조를 반환한다.

String str3 = "hello java";
String str4 = "hello java";
System.out.println(str3 == str4); // true
System.out.println(str3.equals(str4); // true
  • 풀(Pool): 공용 자원을 모아둔 곳
  • 성능과 메모리 최적화 가능: String 인스턴스를 미리 만들어두고 재사용
  • 힙 사용
  • 문자 찾을 때, 해시 알고리즘 사용

String은 불변 객체

String은 불변 객체기 때문에 변경이 필요하다면, 새로운 결과를 만들어서 반환해야 한다.

String str1 = "hello";

str1.concat(" world");
System.out.println(str1); // hello

str2 = str1.concat(" world");
System.out.println(str2); // hello world

String 클래스 메서드

String 클래스는 다양한 메서드를 제공한다.

1. 문자열 정보 조회

  • isEmpty(): 길이가 0인지 확인
  • length(): 문자열 길이 반환
  • isBlank(): 길이가 0이거나 공백인지 확인
  • charAt(int index): 특정 인덱스의 문자 반환

2. 문자열 비교

  • equals(Object anObject): 특정 object와 동등여부 반환
  • equalsIgnoreCase(String anotherString): 두 문자열을 대소문자 구분없이 비교
  • compareTo(String anotherString): 두 문자열을 사전 순으로 차이 비교
    ex1. "b".compareTo("a") → 1
    ex2. "Hello, Java".compareTo("Hello, World") → -13
  • compareIgnoreCase(String str): 두 문자열을 대소문자 구분없이 사전 순으로 비교
  • startsWith(String prefix): 문자열이 특정 접두사로 시작하는지 확인
  • endsWith(String suffix): 문자열이 특정 접미사로 끝나는지 확인

3. 문자열 검색

  • contains(CharSequence s): 문자열이 특정 문자열을 포함하고 있는지 확인
  • indexOf(String ch), indexOf(String ch, int fromIndex): 문자열이 처음 등장하는 위치 반환
  • lastIndexOf(String ch): 문자열이 마지막으로 등장하는 위치 반환

4. 문자열 조작 및 변환

  • substring(int beginIndex, int endIndex): 문자열의 부분 문자열 반환
    ex1. "Hello, Java".substring(4) → o
    ex2. "Hello, Java".substring(7,11) → Java
  • concat(String str): 문자열 합치기
  • replace(CharSequence target, CharSequence replacement): 특정 문자열을 새 문자열로 대체
  • replaceAll(String regex, String replacement): 문자열에서 정규 표현식과 일치하는 부분을 새 문자열로 대체
  • replaceFirst(String regex, String replacement): 문자열에서 정규 표현식과 일치하는 첫 번째 문자열을 새 문자열로 대체
  • toLowerCase(): 문자열을 소문자로 변환
  • toUpperCase(): 문자열을 대문자로 변환
  • trim(): 문자열 양 끝의 whitespace 제거
  • strip(): whitespace, 유니코드 공백 제거

5. 문자열 분할 및 조합

  • split(String regex): 문자열을 정규 표현식 기준으로 분할
  • join(CharSequence delimiter, CharSequence... elements): 주어진 구분자로 여러 문자열을 결합

6. 기타

  • valueOf(Object obj): 기본형 값, 다양한 타입을 문자열로 변환
    ex1. String.valueOf(100) → 100
    ex2. String.valueOf(true) → true
    ex3. String.valueOf(new Object()) → java.lang.Object@a09ee92
  • toCharArray(): 문자열을 문자 배열로 변환
  • format(String format, Object ... args): 형식 문자열과 인자를 사용해서 새로운 문자열 생성
    ex1. String.format("num: %d, bool: %b, str: %s", 10, true, "java")
    → num: 10, bool: true, str: java
    ex2. System.out.printf("number: %.3f\n", 10.1234)
    → number: 10.123
  • matches(String regex): 문자열이 정규 표현식과 일치하는지 확인
  • hashCode(): 해시코드 반환
  • getBytes(String charsetName): 문자 인코딩 변환
    ex1. byte[] strToUtf = "가".getBytes("UTF-8") → [EA:B0:80]
    ex2. String UtfToStr = new String(strToUtf, "UTF-8") → 가

참고
Class String
Java의 정석
김영한의 실전 자바 - 중급 1편

profile
공부 기록

0개의 댓글

관련 채용 정보