프로그래밍 언어/JAVA

String 클래스

· 코딩마이데이

String의 특징과 객체 생성

java.lang 패키지에 포함된 클래스로서 String 클래스는 문자열을 나타냅니다. 스트링 리터럴은 자바 컴파일러에 의해 모두 String 객체로 처리됩니다. String 클래스는 다양한 생성자를 통해 여러 가지 방법으로 String 객체를 생성할 수 있게 합니다.

// 스트림 리터럴로 String 객체 생성
String str1 = "abcd";

// String 클래스의 생성자를 이용하여 String 객체 생성
chat data[] = { 'a', 'b', 'c', 'd' };
String str2 = new String(data);
String str3 = new String("abcd"); // str2와 str3은 모두 "abcd" 문자열

 

생성자 설명
String() 빈 스트링 객체 생성
String(char[] value) char 배열에 있는 문자열을 스트링 객체로 생성
String(String original) 매개변수로 주어진 문자열과 동일한 스트링 객체 생성
String(StringBuffer buffer) 매개변수로 주어진 스트링 버퍼의 문자열을 스트링 객체로 생성

 

스트링과 리터럴과 new String()

스트링 리터럴과 new String()으로 생성된 스트링 객체는 서로 다르게 관리됩니다. 스트링 리터럴은 자바에서 리터럴 테이블로 특별히 관리하여, 동일한 리터럴을 공유시킵니다. 하지만, new String()으로 생성된 스트링은 new를 이용하여 생성되는 다른 객체와 동일하게 힙 메모리에 생성됩니다. 

스트림 리터럴과 new String()으로 생성된 객체 비교

 

스트링 리터럴 "Hello"와 "Java"는 자바 가상 기계의 스트링 리터럴 테이블에 생성되며 각각 a, b가 가리키고, c는 리터럴 테이블에서 a와 "Hello"를 공유합니다. 그러나 new String()에 의해 생성된 객체 d, e, f는 모두 힙 메모리에 독립적으로 생성됩니다.

 

스트링 객체는 수정이 불가능합니다.

또 한 가지 중요한 것으로서, 리터럴이든 new String()으로 생성했던, 일단 생성된 스트링 객체는 수정불가능합니다.

String s = new String("Hello");
Strint t = s.concat("Java"); // 스트링 s에 "Java"를 덧붙인 새로운 스트링 객체 리턴

 

 

한 번 만들어진 스트링을 수정이 불가능하기 때문에 스트링이 공유되어도 전혀 문제가 발생하지 않습니다. 만일 concat()로 문자열 s를 변경하려면 다음과 같이 해야 합니다.

s = s.concat("Java"); // s는 새로 리턴된 "HelloJava"를 가리킴

 

s는 s.concat("Java")가 리턴한 새로운 "HelloJava" 스트링 객체를 가리킵니다.

 

String 활용

메소드 설명
char chatAt(int index) index 인덱스에 있는 문자 값 리턴
int codePointAt(int index) index 인덱스에 있는 유니코드 값 리턴
int compareTo(String anotherString) 두 스트링을 사전 순으로 비교하여 같으면 0, 현 스트링이 anotherString보다 먼저 나오면 음수, 아니면 양수 리턴
String concat(String str) 현재 스트링 뒤에 str 스트링을 덧붙인 새로운 스트링 리턴
boolean contains(Charsequence s) s에 지정된 문자들을 포함하고 있으면 true 리턴
int length() 스트링의 길이(문자 개수) 리턴
String replace(Charsequence target,
Charsequence replacement)
target이 지정하는 일련의 문자들을 replacement가 지정하는 문자들로 변경한 스트링 리턴
String[] split(String regex) 정규식 regex에 일치하는 부분을 중심으로 스트링을 분리하고, 분리된 스트링들을 배열로 저장하여 리턴
String subString(int beginIndex) beginIndex 인덱스부터 시작하는 서브 스트링 리턴
String toLowerCase() 소문자로 변경한 스트링 리턴
String toUpperCase() 대문자로 변경한 스트링 리턴
String trim() 스트링 앞뒤의 공백 문자들을 제거한 스트링 리턴
char[] toCharArray() 스트링의 문자들을 배열로 만들어 리턴

 

문자열 비교. int compareTo(String anotherString)

compareTo() 메소드는 현재 스트링과 매개변수로 주어진 anotherString의 스트링을 사전 순으로 비교하여, 두 문자열이 같으면 0, 현재 문자열이 anotherString의 문자열보다 사전에서 먼저 나오면 음수를, 뒤에 나오면 양수를 리턴합니다.

String java = "Java";
String cpp = "C++";
int res = java.compareTo(cpp);
if (res == 0)
	System.out.println("the same");
else if (res < 0)
	System.out.println(java + " < " + cpp);
else
	System.out.println(java + " > " + cpp);

 

실행 결과

Java > C++

 

"Java"가 "C++"보다 사전에서 뒤에 나오려면 res는 양수가 되어, 앞과 같이 출력됩니다. 문자열이 같은지만 비교한다면 equals() 메소드를 쓰는 것이 좋습니다.

 

문자열 연결: String concat(String str)

자바에서는  + 연산자로 문자열을 연결할 수 있습니다. + 연산은 피연사자에 문자열이 하나라도 있으면 문자열 연결로 처리합니다.

System.out.print("abcd" + 1 + true + 3.13e-2 + 'E' + "fgh";

 

실행 결과

abcd1true0.0313Efgh

 

+연산자의 피연사자에 객체가 있는 경우는 '객체.toString()' 메소드를 호출하여 객체를 문자열로 변환한 후, 문자열 연결을 실행합니다. 만일 + 연산자의 피연산자로 기본 타입의 값이 있는 경우 이 값이 문자열로 변환한 후, 문자열 연결을 실행합니다.

String 클래스의 concat() 메소드를 이용해도 문자열을 연결할 수도 있습니다.

"I love ".concat("Java.")

 

concat()는 다음 결과를 리턴합니다.

"I Love Java."

 

공백 제거: String trim()

trim()은 문자열 앞뒤에 있는 공백 문자를 제거한 새로운 문자열을 리턴합니다.

String a = "      abcd   def     ";
String b = "      xyz\t";
String c = a.trim(); // c = "abcd    def". 문자열 중간에 있는 공백은 제거되지 않음
String d = b.trim(); // d = "xyz". 스페이스와 '\t' 제거됨

 

문자열의 문자: char charAt(int index)

charAt() 메소드를 이용하면 특정 위치에 있는 문자를 알아낼 수 있습니다.

String a = "class"
char c = a.charAt(2); // c = 'a'

 

charAt()을 다음과 같이 이용하면 "class"에 's'문자가 몇 개 있는지 알 수 있습니다.

int count = 0;
String a = "class";
for (int i = 0; i < a.length; i++) { // a.length()는 5
	if (a.charAt(i) == 's')
		count++;
}
System.out.println(count); // 2 출력

 

String 클래스 메소드 활용

public class StringEx {
	public static void main(String[] args) {
		String a = new String(" C#");
		String b = new String(",C++ ");
		
		System.out.println(a + "의 길이는 " + a.length()); // 문자열의 길이(문자 개수)
		System.out.println(a.contains("#")); // 문자열의 포함 관계
		
		a = a.concat(b); // 문자열 연결
		System.out.println(a);
		
		a = a.trim(); // 문자열 앞 뒤의 공백 제거
		System.out.println(a);
		
		a = a.replace("C#", "Java"); // 문자열 대치
		System.out.println(a);
		
		String s[] = a.split(","); // 문자열 분리
		for (int i = 0; i < s.length; i++)
			System.out.println("분리된 문자열" + i + ": " + s[i]);
		
		a = a.substring(5); // 인덱스 5부터 끝까지 서브 스트링 리턴
		System.out.println(a);
		
		char c = a.charAt(2); // 인덱스 2의 문자 리턴
		System.out.println(c);
	}
}

 

실행 결과

C#의 길이는 3

true

C#,C++

C#,C++

Java,C++

분리된 문자열0: Java

분리된 문자열1: C++

C++

+

 

String 클래스 메소드 활용 실행 과정

 

'프로그래밍 언어 > JAVA' 카테고리의 다른 글

StringTokenizer 클래스  (0) 2025.03.14
StringBuffer 클래스  (0) 2025.03.13
Wrapper 클래스  (0) 2025.03.09
Object 클래스  (0) 2025.03.06
자바 JDK에서 제공하는 패키지  (1) 2025.03.03