본문 바로가기

자바공부

자바 String 클래스 개념 공부

728x90
반응형

* String 클래스는 java.lang 패키지에 포함된 클래스로서 문자열을 나타낸다.

스티일 리터럴은 자바 컴파일러에 의해 모두 String 객체로 처리된다.

ex) String 클래스의 주요 생성자

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

 

* 스티링 리터럴과 new String()

문자열을 다루는 데에 있어 한 가지 중요한 점이 있다.

스트링 리터럴과 new String()으로 생성된 스트링 객체는 서로 다르게 관리된다.

1) 스트링 리터럴은 자바 내부에서 리터럴 테이블로 특별히 관리하여, 동일한 리터럴을 공유시킨다.

2) new String()으로 생성된 스트링은 new를 이용하여 생성되는 다른 객체와 동일하게 힙 메모리에 생성된다.

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

# 스트링 리터럴 "Hello"와 "Java"는 자바 가상 기계의 스트링 리터럴 테이블에 생성되어 각각 a, b가 가리키고, c는 리터럴 테이블에서 a와 "Hello"를 공유한다. 

# new String()에 의해 생성된 스트링 객체 d,e,f는 모두 힙 메모리독립적으로 생성된다.

즉, 스트링 리터럴 객체 - 스트링 리터럴 테이블에 생성 - 공유

new String() 객체 - 힙 메모리에 생성 = 독립적

 

* 스트링 객체는 수정이 불가능하다

리터럴이든 new String()으로 생성했던, 일단 생성된 스트링 객체는 수정이 불가능하다.

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

s.concat은 "Hello"에 "Java"를 결합한 새로운 "HelloJava"를 리턴하며 t가 가리킨다. 하지만 s는 변함없이 "Hello" 그대로이다. 한번 만들어진 스트링은 수정이 불가능하기 때문에 스트링이 공유되어도 문제가 발생하지 않는다.

 

* 스트링 비교시 반드시 equals()를 사용

 

* String 클래스의 주요 메소드

메소드 설명
char charAt(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() 스트링 앞뒤의 공백 문자들을 제거한 스트링 리턴

ex) 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는 #을 포함하므로 true를 return
		
		a=a.concat(b); // 문자열 연결, a = " c+" + ",c++";
		System.out.println(a);
		
		a = a.trim(); // 문자열 앞 뒤의 공백 제거 "c+" + ",c++";
		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부터 끝까지 서브 스트링 리턴, a = "C++"
		
		char c = a.charAt(2); // 인덱스 2의 문자 리턴, '+'
		System.out.println(c);
	}
}

String 클래스 메소드 활용 코드의 실행 결과

반응형