코드일기장

[Java] String 클래스 본문

Java

[Java] String 클래스

won_hyeok2 2022. 2. 5. 01:26

 

String클래스

 

String Class= 데이터(char [] + 메서드 (문자열 관련)

 

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

 

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

 

 

 

한번 생성된 String 인스턴스가 갖고 있는 문자열은 읽어 올 수는 있다, 반대로 변경은 불가능하다.

 

예를 하나 들어보자

public static void main(String[] args) {
		String str1="aa";
		String str2="bb";
		str1=str1+str2;
}

 

 

위 코드는 '+' 연산자로 문자열을 결합하는 경우이다. 위 코드는 str1의 인스턴스 내의 문자열이 수정되는 것이 아니라 새로운 문자열 ("aabb")을 가진 String 인스턴스가 생생된다

 

이처럼 덧셈연사자를 이용해 문자열을 결합하면 새로운 String 인스턴스가 생성되어 메모리 공간이 차지된다. 결합 횟수를 줄이는 것이 올바른 코드라고 볼 수 있다.

 

보통 문자열 결합이 많은 작업을 하는 경우에는 StringBuffer 인스턴스에 저장된 문자열을 변경한다. 

 

 


 

문자열을 만드는 방법은 두 가지 방법이 있다. 문자열 리터럴을 지정하는 방법과 String클래스 생성자를 사용하는 방법이다.

 

public class Main {

	public static void main(String[] args) {
		String str1="aa"; //문자열 리터럴 "aa"의 주소가 str1에 저장 
		String str2="bb"; //문자열 리터럴 "bb"의 주소가 str2에 저장
		//
		String str3 = new String("cc"); //새로운 String인스턴스를 생성
		String str4 = new String("dd"); //새로운 String인스턴스를 생성
		
	}
}

 

 

 

public class Main {

	public static void main(String[] args) {
		String str1="abc"; //문자열 리터럴 "aa"의 주소가 str1에 저장 
		String str2="abc"; //문자열 리터럴 "bb"의 주소가 str2에 저장
		
		System.out.println("str1==str2? "+(str1==str2)); //같은 주소에 저장된 것으로 유추
		System.out.println("str1.equals(str2)? "+str1.equals(str2));
		
		String str3 = new String("cba"); //새로운 String인스턴스를 생성
		String str4 = new String("cba"); //새로운 String인스턴스를 생성
		
		System.out.println("str3==str4? "+(str3==str4));  //주소 각기 다른 인스턴스
		System.out.println("str3.equals(str4)? "+str3.equals(str4)); //문자열 
	}
}

 

str1==str2? true
str1.equals(str2)? true
str3==str4? false
str3.equals(str4)? true

출력 결과

 

 

위 코드를 더 자세히 설명하자면  str1, str2 참조변수는 둘 다 리터럴이 같다 리터럴이 같아 하나의 객체에 여러 참조변수들이 공유하는 것이 가능하다. 그러므로 str1==str2는 true가 나온 것이다. 공유된 객체를 비교한 것이기 때문

 

위에서 "+"연사자를 설명한 것을 다시 생각해보면 문자열은 수정이 불가능하다. 수정이 불가능하다는 것은 한번 생성된 객체를 각기 다른 참조변수들이 객체를 공유할 때 유용한 것 이다.

 

반대로 new Stirng()을 사용하면 새로운 객체를 생성하는 것 이다. str3와 str4의 리터럴은 같지만 서로 다른 객체이므로 str3==str4는 false가 나온 것 이다.

 

문자열이 같은지 다른지 즉, 리터럴을 비교하는 것은 등가 비교 연산자("==")를 사용하는 것이 바람직하지 않다. equals()를 사용해야 문자열의 내용을 비교할 수 있고 내용에 따라 true와 false를 return 하게 해야 한다.

 

위 코드를 보고 등가 비교 연산자("==")는 객체 주소를 비교했고 .equals()는 문자열을 비교했다.

 

 

자바 소스파일에 포함된 모든 문자열 리터럴은 컴파일 시에 클래스 파일에 저장된다. 이때, 같은 내용의 문자열 리터럴

들은 한 번만 저장된다. 한번 생성되면 수정이 불가능하여, 하나의 인스턴스를 공유할 수 있는 것이다.

 

 

 


 

 

빈 문자열

 

빈 문자열은 말 그래도 문자열에 아무것도 없다는 말이다. 

예를 들어

public class Main {

	public static void main(String[] args) {
		char[] c1= new char[0]; //길이가0인 char c1 배열
		char[] c2= {};			//위 코드와 동일한 빈 문자배열
		
		String str=""; //empty string
		//char ch='' //불가능 
		char ch='\u0000'; //char형 변수는 반드시 하나의 문자를 지정해야함.!
		
		System.out.println("c1.length="+c1.length);
		System.out.println("empty string"+str);
	}
}

 

c1.length=0
empty string

출력 결과

 

 

char 배열은 길이가 0인 배열을 생성할 수 있다. 이 배열은 내부적으로 가지고 있는 문자열이 바로 빈 문자열이다.

str은 빈 문자열이므로 c1, c2와 같은 객체를 공유하고 있다.

 

String str="" String 변수는 빈 문자열을 이렇게 표현 가능 하지만, char형 변수에는 반드시 하나의 문자를 지정해야 한다. 기본 값 '\u0000'  

 

String의 기본 값은 null이다. 하지만 보통 String은 빈 문자열로 ("") char형은 '\u0000'대신 공백(' ')으로 초기화한다

 

 

 

 

 

Comments