[Java] 문자열

Ogu·2023년 5월 7일
0

Java

목록 보기
2/5

기존의 다른 언어에서는 문자열을 chat형의 배열로 다루었으나, 자바에서는 문자열을 위한 클래스를 String 클래스를 제공합니다. String클래스와 메서드에 대해 알아봅시다.

String 클래스

변경 불가능한(immuatble) 클래스

String 클래스에서는 문자열을 저장하기 위해 문자형 배열 참조 변수(char[]) value를 인스턴스 변수로 정의해놓고 있습니다. 인스턴스 생성 시 생성자의 매개변수로 입력받는 문자열은 이 인스턴스 변수(value)에 문자형 배열(char[])로 저장됩니다.

public final class String implements java.io.Serializable, Comparable {
	private char[] value;
    ...

한번 생성된 String 인스턴스가 갖고 있는 문자열은 읽어 올 수만 있고, 변경할 수 없습니다.
예를들어 + 연산자를 이용한 문자열 결합은 새로운 문자열이 담긴 String 인스턴스가 생성되는 것입니다.

따라서 문자열 간의 결합이나 추출 등 문자열을 다루는 작업이 많이 필요한 경우에는 String 클래스 대신 StringBuffer 클래스를 사용하는 것이 좋습니다. StringBuffer 인스턴스에 저장된 문자열은 변경이 가능하므로 하나의 인스턴스로 문자열을 다루는 것이 가능합니다.

문자열 리터럴

문자열을 만드는 방법에는 다음 두가지 방법이 있습니다.

  • 문자열 리터럴 지정
  • String 클래스의 생성자를 사용하여 인스턴스 생성
String str1 = "abc";  // 문자열 리터럴 "abc"의 주소가 str1에 저장
String str2 = "abc";  // 문자열 리터럴 "abc"의 주소가 str2에 저장
String str3 = new String("abc");  // 새로운 String인스턴스 생성
String str4 = new String("abc");  // 새로운 String인스턴스 생성

String 클래스의 생성자를 이용한 경우 new 연산자에 의해 메모리 할당이 이루어지므로 항상 새로운 String 인스턴스가 생성됩니다.
그러나 문자열 리터럴은 이미 존재하는 것을 재사용 하는 것입니다. 자바 소스파일에 포함된 모든 문자열 리터럴은 컴파일 시에 클래스 파일에 저장됩니다. 이 때 같은 내용의 문자열 리터럴은 한번만 저장됩니다. 이 클래스 파일이 클래스 로더에 의해 메모리에 올라갈 때, 클래스 파일의 리터럴들이 JVM 내에 있는 상수 저장소(constant pool)에 저장됩니다.

문자열(String)의 비교

equals()는 두 문자열의 내용("abc")를 비교합니다. 아래의 예시의 경우 equals()를 사용할 경우 모두 true를 반환하지만, String 인스턴스의 주소를 등가비교연산자==로 비교하면 다르게 나타납니다.

String str1 = "abc";
        String str2 = "abc";
        System.out.println("str1 == str2 ?" + (str1 == str2));
        System.out.println("str1.equals(str2) ?" + (str1.equals(str2)));
        System.out.println();

        String str3 = new String("abc");
        String str4 = new String("abc");

        System.out.println("str3 == str4 ? " + (str3 == str4));
        System.out.println("str3.equals(str4) ? " + str3.equals(str4));

String 생성자

String(String s)

주어진 문자열(s) 를 갖는 String인스턴스를 생성합니다.

String s = new String("Hello");

String(char[] value)

주어진 문자열(value)을 갖는 String 인스턴스를 생성한다.

char[] c = {'H', 'e', 'l', 'l', 'o'};
String s = new String(c);

String(StringBuffer buf)

StringBuffer 인스턴스가 갖고 있는 문자열과 같은 내용의 String 인스턴스를 생성한다.

StringBuffer sb = new StringBuffer("Hello");
String s = new String(sb);

String 메서드

int length()

문자열의 길이를 알려줍니다.

String s = "Hello";
int length = s.length();  // length = 5

boolean equals(Object obj)

매개변수로 받은 문자열(obj)과 String 인스턴스의 문자열(내용)을 비교합니다. obj가 String이 아니거나 문자열이 다르면 false를 반환합니다.

String s = "Helo";
boolean b = s.equals("Hello");   // b = true
boolean b2 = s.equals("hello");  // b2 = false
  • boolean equalsIgnoreCase(String str) : 대소문자 구분 없이 비교합니다.

int compareTo(String str)

문자열(str)과 사전 순서로 비교합니다. 반환값은 다음과 같습니다.

  • 같으면 0
  • 사전순으로 이전이면 음수
  • 사전순으로 이후면 양수
int i = "aaa".compareTo("aaa");  // 0
int i2 = "aaa".compareTo("bbb);  // -1
int i3 = "bbb".compareTo("aaa"); // 1

String concat(String str)

문자열(str)을 뒤에 덧붙입니다.

String s = "Hello";
String s2 = "s.concate(" world);  // s2 = "Hello world"

boolean contains(CharSequence s)

지정된 문자열(s)이 포함되었는지 검사합니다.

String s = "abcedfg";
boolean b = s.contains("bc");  // b = true

char charAt(int index)

저장된 위치(index)에 있는 문자를 알려줍니다. (index시작 위치 = 0)

String s = "Hello";
String n = "0123456";
char c = s.charAt(1);  // c = 'e'
char c2 = n.charAt(1);  // c2 = '1'

String substring(int begin) / substring(int begin, int end)

주어진 시작 위치(begin)부터 끝 위치(end)범위에 포함된 문자열을 얻습니다. 단, (begin<= x < end)

String s = "java.lang.Object";
String c = s.substring(10);  // c = "Object"
String p = s.substring(5,9);  // p = "lang"

int indexOf(int ch)

문자 ch가 문자열에 존재하는지 확인하여 index를 알려줍니다. 못찾으면 -1을 반환합니다. (index 시작 = 0)

String s = "Hello";
int idx1 = s.indexOf('o'); // idx1 = 4;
int idx2 = s.indexOf('k'); // idx2 = -1;

int indexOf(int ch, int pos)

문자 ch가 문자열에 존재하는지 지정된 위치(pos)부터 확인하여 index를 알려줍니다. 못찾으면 -1을 반환합니다. (index 시작 = 0)

String s = "Hello";
int idx1 = s.indexOf('e', 0); // idx1 = 1;
int idx2 = s.indexOf('e', 2); // idx2 = -1;

int indexOf(String str)

문자열 str이 문자열에 존재하는지 확인하여 index를 알려줍니다. 못찾으면 -1을 반환합니다. (index 시작 = 0)

String s = "ABCDEFG";
int idx = s.indexof("CD");  // idx = 2

String replace(CharSequence old, CharSequence nw)

문자열 중의 문자열(old)을 새로운 문자열(nw)로 모두 바꾼 문자열 반환

String s = "Hellollo";
 
String s1 = s.replace("ll", "LL");  // HeLLoLLo
  • String replaceAll(String regex, String replacement)
  • String replaceFirst(String regex, String replacement)

String[] split(String regex)

문자열을 지정된 분리자(regix)로 나누어 문자열 배열에 담아 반환합ㄴ니다.

String animals = "dog,cat,bear";
String[] arr = animals.split(",");  // arr[0]="dog", arr[1]="cat", arr[2]="bear"
  • String[] split(String regex, int limit) : 문자열 전체를 지정된 수(limit)로 자릅니다.

String toString()

String 인스턴스에 저장되어있는 문자열을 반환합니다.

String s = "Hello";
String s1 = s.toString();  // "hello"

String trim()

문자열의 왼쪽 끝과 오른쪽 끝에 있는 공백을 없앤 결과를 반환합ㅂ니다. 문자열 중간에 이쓴 공백은 제거되지 않 습니다.

String s = "   Hello World   ";
String s1 = s.trim();  // "Hello World"

static String valueOf(type t)

지정된 값을 문자열로 변환하여 반환합니다.
참조변수의 경우, toString()을 호출한 결과를 반환합니다.

  • static String valueOf(boolean b);
  • static String valueOf(char c);
  • static String valueOf(int i);
  • static String valueOf(long l);
  • static String valueOf(float f);
  • static String valueOf(doubld d);
  • static String valueOf(Object o);

참고 - 자바의 정석 basic

profile
私はゲームと日本が好きなBackend Developer志望生のOguです🐤🐤

0개의 댓글