Study/java

[Java] String 선언 및 초기화, 생성자 사용

 

선언 및 초기화

자바에서 문자열 객체를 생성할 때

String str = "string";
String str = "";

위와 같이 텍스트를 쌍따옴표로 감싸서 초기화하는 경우가 많습니다.

해당 방법이 메모리를 아낄수 있어서 많이 사용됩니다.

 

그 외에 String객체를 생성하는 여러 방법들이 존재합니다.

 

생성자 사용

import java.nio.charset.Charset;

public class StringConstructor {

	public static void main(String[] args) throws Exception {
		//빈문자열
		String s = new String();
		System.out.println("1. new String() : " + s + "***");
		
		//String(byte[] bytes)
		byte[] ascii = {101, 108};
		String s2 = new String(ascii);
		System.out.println("2. new String(ascii) : " + s2 + "***");
		
		//String(byte[] bytes, Charset charset)
		String s3 = new String(ascii, Charset.defaultCharset());
		System.out.println("3. new String(ascii, charset) : " + s3 + "***");
		
		//String(byte[] ascii, int hibyte)
		String s4 = new String(ascii, 8);
		System.out.println("4. new String(ascii, hibyte) : " + s4 + "***");
		
		//String(byte[] bytes, int offset, int length)
		String s5 = new String(ascii, 0, 1);
		System.out.println("5. new String(ascii, offset, length) : " + s5 + "***");
		
		//String(byte[] bytes, int offset, int length, Charset charset)
		String s6 = new String(ascii, 0, 1, Charset.defaultCharset());
		System.out.println("6. new String(ascii, offset, length, charset) : " + s6 + "***");
		
		//byte[] ascii, int hibyte, int offset, int count
		String s7 = new String(ascii, 8, 0, 1);
		System.out.println("7. new String(ascii, 8, 0, 1) : " + s7 + "***");
		
		//String(byte[] bytes, int offset, int length, String charsetName)
		String s8 = new String(ascii, 0, 1, "utf-8");
		System.out.println("8. new String(ascii, offset, length, string charset) : " + s8 + "***");
		
		//String(byte[] bytes, String charsetName)
		String s9 = new String(ascii, "utf-8");
		System.out.println("9. new String(ascii, charset) : " + s9 + "***");
		
		//char[] value
		char[] value = {'a', 'b', 'c'};
		String s10 = new String(value);
		System.out.println("10. new String(value) : " + s10 + "***");
		
		//char[] value, offset, count -> offset부터 count개수만큼 문자열로 변환
		String s11 = new String(value, 0, 2);
		System.out.println("11. new String(value, 0, 2) : " + s11 + "***");
		
		//String
		String s12 = new String("s2");
		System.out.println("12. new String(\"s2\") : " + s12 + "***");
				
		//int[] codePoints, offset, count
		int[] codePoints = {s2.codePointAt(0), s2.codePointAt(1)};
		String s13 = new String(codePoints, 0, 2);
		System.out.println("13. new String(codePoints, 0, 2) : " + s13 + "***");
		
		//StringBuffer
		StringBuffer sf = new StringBuffer("Hello");
		String s14 = new String(sf);
		System.out.println("14. new String(sf) : " + s14 + "***");
		
		//StringBuilder
		StringBuilder sb = new StringBuilder("world");
		String s15 = new String(sb);
		System.out.println("15. new String(sb) : " + s15 + "***");
		
		
		//result
//		1. new String() : ***
//		2. new String(ascii) : el***
//		3. new String(ascii, charset) : el***
//		4. new String(ascii, hibyte) : ࡥ࡬***
//		5. new String(ascii, offset, length) : e***
//		6. new String(ascii, offset, length, charset) : e***
//		7. new String(ascii, 8, 0, 1) : ࡥ***
//		8. new String(ascii, offset, length, string charset) : e***
//		9. new String(ascii, charset) : el***
//		10. new String(value) : abc***
//		11. new String(value, 0, 2) : ab***
//		12. new String("s2") : s2***
//		13. new String(codePoints, 0, 2) : el***
//		14. new String(sf) : Hello***
//		15. new String(sb) : world***

	}

}

 

공식문서 기준 String클래스에는 15가지의 생성자가 존재합니다.

byte[], char[], StringBuffer, StringBuilder, codePoint 배열 등을 생성자의 변수로 사용하여 문자열로 만들수 있습니다. 

그 중 byte배열로 생성하는 생성자 중에 hibyte값을 사용하는 생성자는 deprecated(권장하지않음)하다고 합니다.

 

초반에 언급했듯이 대부분 쌍따옴표로 문자열 객체를 생성하기때문에 이 생성자들을 억지로 사용할 필요는 없습니다.

new로 객체를 생성하면 할수록 메모리를 많이 사용하게 됩니다.

하지만 특정한 경우에는 생성자를 사용하여 문자열을 초기화하는것이 효율적일 수도 있습니다.

 

 

 

new String(char[] value)

문자 배열의 원소들을 합쳐 하나의 문자열로 만들어주는 생성자입니다.

char객체와 String객체를 함께 사용하는 경우가 종종 있는데, 그때 사용하기 좋은 생성자입니다.

 

String의 메소드 중에 toCharArray() 메소드가 존재합니다.

해당 메소드는 String 개체를 char 배열로 만들어주는 메소드이다.

 

문자열 알고리즘 문제를 풀 때 이 메소드를 많이 사용하게 되는데, char배열 자체가 정답인 경우보다는 로직을 실행하여 하나의 문자열을 반환하는 경우가 더 많기때문에 char배열을 문자열로 바꾸는 과정을 거치게 됩니다.

흔하게 생각할수 있는 로직은 반복문을 돌려서 String 변수에 더하는 방법이 있습니다.

String s = "abcde";
char[] arr = s.toCharArray();
String otherStr = "";
for(char c : arr){
	otherStr += c;
}

이 방법 말고 생성자를 사용할수도 있습니다.

 

String str = "abcde";
char[] arr = str.toCharArray();
String otherStr = new String(arr);

 

두 로직의 결과는 같지만 메모리상 결과는 다릅니다.

생성자를 사용하면 메모리를 좀 더 사용하기 때문입니다.

하지만 메모리가 크게 낭비되지 않는다면 생성자를 사용하여 더 짧게 코드를 짤수도 있습니다.