Java 입문 | java.lang 패키지 | String 클래스

String 클래스는 문자열을 생성하고 조작할 수 있도록 다양한 생성자와 메소드를 있다. (C언어와 비교해서는 메모리 관련 연사자를 사용하지 않기 때문에 문자열의 생성 및 조작이 편하다.)

String 생성자

생성자 설명
String() 디폴트 생성자. 문자열이 없는 객체를 생성한다.
String(String original) 다른 String 객체를 이용하여 문자열 생성한다.
String(char value[]) 문자 배열을 이용한 객체 생성한다.
String(char value[], int offset, int count) 문자 배열의 내용 중 첫 번째 인덱스부터 두번째 인덱스의 수 만큼의 내용을 객체로 생성한다.
String(int[] codePoints, int offset, int count) (J2SE5) 유니코드 포인트를 포함하는 배열을 이용하여 객체 생성한다.
String(byte bytes[]) 바이트 배열을 이용해서 객체 생성한다.
String(byte bytes[], String charsetName) 바이트 배열의 내용을 지정된 Charset명을 이용하여 객체로 생성한다.
String(byte bytes[], Charset charset) 바이트 배열의 내용을 지정된 Charset을 이용하여 객체로 생성한다.
String(StringBuffer buffer) StringBuffer 객체를 이용해서 객체 생성
String(StringBuilder builder) (J2SE5) StringBuilder 객체를 이용해서 객체 생성한다.

문자열 생성 - 생성자를 사용하지 않는다.

자바에서는 String 객체는 다른 객체와 다르게 생성자를 이용하지 않고도 문자열 객체를 생성할 수 있다.

다음은 new 사용하지 않고 리터럴을 사용하여 문자열을 생성하는 예제이다.

예제

package com.devkuma.tutorial.string;

public class StringJava {

    public static void main(String[] args) {
        String str = "This is java.";
        System.out.println(str);
    }
}

결과는 아래와 같다.

This is java.

자바의 클래스 중에 유일하게 String 클래스만 이런 특수성을 띄고 있다. String 클래스가 이런다고 해서 다른 클래스도 이럴 수 있다는 생각은 버려야 한다. 이와 비슷한 클래스도 없고 만들 수도 없다.

문자열 생성 - 왜 생성자를 사용하지 않는가?

위에서 String 객체는 생성을 할 시에 따로 new를 사용하지 않고도 리터럴 대입만으로 생성이 된다고 했다. 물론 new를 사용하여 리터럴을 파라미터로 넣어서도 가능 하다. 하지만 일반적으로 리터럴을 사용한 문자열을 생성하지 않는다. 왜? 그런 것인가? 코드를 줄이는 것이 좋아서도 있지만 내부적으로도 다른 이유도 있다.

아래 예제는 new 사용하여 리터럴을 대입하여 문자열 객체를 생성하였다.

예제

package com.devkuma.tutorial.string;

public class StringJava2 {

    public static void main(String[] args) {
        String str = new String("This is java.");
        System.out.println(str);
    }
}

먼저 제시한 예제와 동일하게 결과는 같다.

This is java.

결과는 같아도 내부적으로 메모리 주소는 2개가 생길 수 있다. 먼저 “This is Java.“로 생기고 new String(“This is java”)로 생길 수 있다는 것이다. 한번의 동작만으로 객체를 생성 할수 있는데 구지 2번의 작업을 하여 2개의 메모리 주소를 만든 필요는 없는 것이다. 물론 가비지콜렉터에서 메모리적으로 처리를 해주긴 하겠지만, 이것도 미세한 성능 관련이기에 될 수 있으면 피하도록 하자.

문자열 결합 - 메소드를 사용하지 않는다.

String 객체는 메소드 사용하지 않아도 문자열 연자자 “+” 연산자를 이용하여 결합시킬 수 있다.

package com.devkuma.tutorial.string;

public class StringConcat2 {

    public static void main(String[] args) {
        String age = "30";
        System.out.println("He is " + age + " years old");
    }
}

문자열이 아닌 다른 데이터 타입과도 결합이 가능하다.

package com.devkuma.tutorial.string;

public class StringConcat3 {

    public static void main(String[] args) {
        int age = 30;
        System.out.println("He is " + age + " years old");
    }
}

기존의 문자열이 변경될 때마다 변경된 문자열의 새로운 String 객체가 생성된다. 원래의 문자열은 변경되지 않은 채로 그대로 남아 있다. 이는 가비지콜렉터에 의해서 관리될 것이다.

String 주요 메소드

메소드 설명

문자열 길이

문자열 길이는 문자열에 포함되어 있는 문자들의 수를 말한다. 문자열의 길이는 length() 메소드를 이용하여 알아 낼수 있다.

준비중...

문자열에서 문자열 추출

  • char charAt(int index)
  • void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin)

문자열 비교

  • boolean equals(Object anObject)
  • boolean startsWith(String prefix, int toffset)
  • boolean startsWith(String prefix)
  • boolean endsWith(String suffix)
  • int compareTo(String anotherString)

문자열 검색

문자열에 포한된 서브 문자열을 검색하기 위해서 사용한다.

  • int indexOf(int ch)
  • int indexOf(int ch, int fromIndex)
  • int lastIndexOf(int ch)
  • int lastIndexOf(int ch, int fromIndex)
  • int indexOf(String str)
  • int indexOf(String str, int fromIndex)
  • int lastIndexOf(String str)
  • int lastIndexOf(String str, int fromIndex)

문자열 변환

  • String substring(int beginIndex)
  • String substring(int beginIndex, int endIndex)
  • String concat(String str)
  • String replace(char oldChar, char newChar)
  • String replaceAll(String regex, String replacement)
  • String replace(CharSequence target, CharSequence replacement)
  • String trim()
  • String toLowerCase()
  • String toUpperCase()

형변환

  • String valueOf(Object obj)
  • String valueOf(char data[])
  • String valueOf(char data[], int offset, int count)
  • String valueOf(boolean b)
  • String valueOf(char c)
  • String valueOf(int i)
  • String valueOf(long l)
  • String valueOf(float f)
  • String valueOf(double d)