String

Soobin Kim·2024년 4월 5일

Java

목록 보기
26/47

String

문자열은 자바에서 객체로 취급된다.
따라서 String 클래스에서 제공하는 method를 이용하여 문자열을 의도에 맞게 처리할 수 있다.


문자열 생성하기

🔶 new 연산자를 통해 String 객체 생성

  • 새로운 메모리 공간에 새로운 String 객체가 Heap Memory 공간에 만들어지고, Stack Memory에 그 주소값이 할당된다.
  • 매번 새로운 객체가 생성되므로 메모리 사용량이 늘어난다.

🔶 ""을 사용하여 String 객체를 생성

  • 먼저 Literal Pool Memory를 확인하여 동일한 문자열이 이미 있는지 확인한다.
  • 동일한 문자열이 이미 Literal Pool Memory에 존재한다면, 새로운 객체를 생성하지 않고 이미 있는 객체를 재사용한다.

🔶 Literal Pool Memory(String Constant Pool)

  • JVM(Java Virtual Machine)의 메모리 중 하나로 문자열 상수들이 저장되는 풀(pool)이다.
  • Java에서 문자열 리터럴을 생성하면, 해당 문자열이 Literal Pool Memory에 저장된다. 이때, 동일한 문자열이 이미 Literal Pool Memory에 존재한다면, 새로운 객체를 만들지 않고 이미 있는 객체를 재사용한다.
  • Java는 Literal Pool Memory를 활용하여 문자열의 중복을 방지하고 메모리를 효율적으로 절약 및 관리한다.

String의 method

  String str1 = new String("new String");

  // String Methods
  // charAt -> w
  System.out.println(str1.charAt(2));

  // length -> 10
  System.out.println(str1.length());

  // replaceAll -> New StriNg
  System.out.println(str1.replaceAll("n", "N"));

  // indexOf -> 4
  System.out.println(str1.indexOf("S")); // 없으면 -1 반환

  // toLowerCase, toUpperCase -> new string, NEW STRING
  System.out.println(str1.toLowerCase());
  System.out.println(str1.toUpperCase());

  // substring -> new S, tring
  System.out.println(str1.substring(0,5)); // 0이상 5미만 문자열 가져옴
  System.out.println(str1.substring(5)); // 5이상 문자열 가져옴
  • length와 charAt을 사용하여 문자 하나씩 출력
  String str = "new String";
  for(int i=0;i<str.length();i++){
      System.out.println(str.charAt(i));
  }
  • 문자열 비교

    • 문자열은 객체이므로 비교연산자 ==를 통해 비교할 수 없고, 객체 비교 메서드인 equals()를 활용하여 비교하여야 한다.

    • 같은 맥락에서 사전순 비교는 compareTo()메서드를 활용한다. compareTo()는 비교 대상들의 아스키 코드 값의 차를 이용하여 그 값을 반환하므로 비교 대상 문자열이 기준 문자열보다 작으면 음수를, 크면 양수를, 같으면 0을 반환한다.

         // (a의 아스키코드 값) - (c의 아스키코드 값)
      	int result = "a".compareTo("c"); 
      
      	if(result == 0){
        		System.out.println("같은 문자열");
          } else if(result < 0){
        		System.out.println("a가 c보다 사전순으로 앞에 있음");
          } else{
        		System.out.println("a가 c보다 사전순으로 뒤에 있음");
          }
  • 구분자(delimiter)를 기준으로 문자열 분리

    • split()메서드를 활용한다.
    • 메서드에 인자는 구분자를 가리키며, 해당 구분자로 하여 문자열을 분리하고 배열의 형태로 반환
    • 정규 표현식 "\s+"를 활용하여 공백(whitespace character | 스페이스, 탭, 개행 모두 포함)을 구분자로 할 수 있다. 구분자를 " "로 활용하면 연속된 공백 문자를 처리하지 못하고 각각 공백 문자가 구분자로 취급되지만, "\s+"를 구분자로 하면, 연속된 공백문자도 하나의 구분자로 취급하여 모든 공백을 제거한 뒤 남은 문자열들을 요소로 하는 배열을 반환할 수 있다.
      // [new, String]
      System.out.println(Arrays.toString("new String".split("\\s+")));

특징

  • 불변성 (Immutability)
    문자열은 한 번 생성되면 수정할 수 없다. 즉, String 객체의 값을 변경하는 것은 불가능하며, 값을 변경하려면 새로운 String 객체를 생성해야 한다.
String str = "String";
// str[2] 접근 불가능.
// str[3] = 'I'; 수정 불가능

// 인덱스로 접근 가능하지만 여전히 부분적인 수정이 불가능
System.out.println(str.charAt(2)); 

// ∴ 새 String을 만들어야 한다.
String alphabet = "ABCDFFG";
alphabet = alphabet.substring(0,4) + 'E' + alphabet.substring(5,7);
  • char 배열로 변경 후 새 String 객체 생성
    문자열을 수정하려면, char[] 배열로 변환한 후 변경을 하고, 그 후 String 객체로 다시 생성해야 한다.
String alphabet = "ABCDFFG";
char[] tempArr = alphabet.toCharArray();
tempArr[4] = 'E';
alphabet = new String(tempArr);
  • ""로 생성한 문자열과 new로 생성한 문자열의 차이
    ""로 생성한 문자열은 literal pool에 저장되고, new로 생성한 문자열은 heap memory에 저장된다. 따라서 두 문자열이 같은 내용이라도 == 연산자를 사용하여 비교하면 결과가 달라질 수 있다.
    • ""는 Literal Pool에 저장되므로 같은 문자열이 있으면 참조값이 동일하고, new로 생성한 문자열은 별도의 객체로 메모리에 저장된다.
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");

System.out.println(str1 == str2);  // true
System.out.println(str1 == str3);  // false

주요 메서드

Method nameReturn valueDescription
charAt(int index)char주어진 인덱스 위치의 문자를 반환
length()int문자열의 길이를 반환
equals(Object anObject)boolean두 문자열 값이 동일한지 비교
compareTo(String anotherString)int두 문자열을 사전순으로 비교한 결과
toCharArray()char[]문자열을 문자 배열로 변환
toLowerCase()String문자열을 모두 소문자로 변환한 새 문자열
toUpperCase()String문자열을 모두 대문자로 변환한 새 문자열
contains(CharSequence s)boolean문자열이 특정 부분 문자열을 포함하는지 확인
replace(CharSequence target, CharSequence replacement)String문자열 내 target을 모두 replacement로 바꾼 새 문자열
split(String regex)String[]정규 표현식에 맞는 부분으로 문자열을 분할한 배열 반환
substring(int beginIndex, int endIndex)String지정된 인덱스 범위에 해당하는 부분 문자열 반환
indexOf(int ch, int fromIndex)int주어진 인덱스부터 특정 문자가 나타나는 첫 번째 인덱스를 반환

0개의 댓글