카테고리 없음

자바의 클래스들 3. String / StringBuilder / StringBuffer / text block

코딩펭귄 2023. 12. 19. 23:37

String 클래스

 

String 선언하기

  사용방법 
  1. new 해서 사용 -> '힙'에 메모리가 생성됨
  String str1 = new String("abc");
  
  2. 직접 assign해서 사용 -> '상수pull'에 abc라는 string이 있고, 그 string에 address만 가리키는것
  String str2 = "abc";
  • 힙 메모리에 인스턴스로 생성되는 경우와 상수 풀(constant pool)에 있는 주소를 참조하는 두 가지 방법
  • 힙 메모리는 생성될때마다 다른 주소 값을 가지지만, 상수 풀의 문자열은 모두 같은 주소 값을 가짐
public class StringTest {

	public static void main(String[] args) {
		//힙에 집히는것
		String str1 = new String("abc");
		String str2 = new String("abc");
		System.out.println(str1 == str2); //false
		
		//상수pull에 잡히는것 ("abc라는 문자열을 가리키는 참조변수 2개(str3, str4))
		String str3 = "abc";
		String str4 = "abc";
		System.out.println(str3 == str4);//true
	}
}
  • 한번 생성된 String은 불변(immutable) : 상수값, new해서 만든값들 모두 다 변할 수 없음 (String은 final로 선언)
  • String을 연결하면 기존의 String에 연결되는 것이 아닌 새로운 문자열이 생성됨 ( 메모리 낭비가 발생할 수도 )

package ch03;

public class StringTest2 {

	public static void main(String[] args) {
		String java = new String("java");
		String android = new String("android");
		
		// 메모리 확인
		// System.out 으로 출력하면 오버라이딩된 값이 나옴 -> System.identityHashCode() 쓰기
		
		System.out.println(System.identityHashCode(java)); //1554547125

		//concat : 연결하는용도
		java = java.concat(android); // 앞선 java와는 다른 메모리 가리킴
		System.out.println(System.identityHashCode(java)); //617901222

		
		System.out.println(java); //javaandroid
		System.out.println(System.identityHashCode(java));
		
	}
}

-> 이렇게 계속 연결해서쓰면 메모리 garbage가 많이 생김

-> StringBuilder, StringBuffer 사용!

 

 

StringBuilder, StringBuffer

 

  • 내부적으로 가변적인 char[]를 멤버 변수로 가짐 (String은 final)
  • 문자열을 여러번 연결하거나 변경할 때 사용하면 유용함
  • 새로운 인스턴스를 생성하지 않고 char[] 를 변경함
  • StringBuffer는 멀티 쓰레드 프로그래밍에서 동기화(synchronization)을 보장 = 2개이상의 쓰레드가 같은메모리 접근할때 순서가 주어진다는것  -> 단인 쓰레드 프로그램에서는 StringBuilder 사용을 권장
  • 사용시) toString() 메서드로 String반환

 

public class StringBuilderTest {

	public static void main(String[] args) {
		String java = new String("java");
		String android = new String("android");
		
		StringBuilder buffer = new StringBuilder(java);
		System.out.println(System.identityHashCode(buffer)); //연결전 1554547125
		buffer.append("android");
		System.out.println(System.identityHashCode(buffer)); //연결후 1554547125(연결전과 동일)
		
		String test = buffer.toString();
		System.out.println(test); //javaandroid

	}
}

 

 

 

text block (java13)

 

  • 문자열을 """ """ 사이에 이어서 만들 수 있음
  • StringBuilder, StringBuffer 안쓰고 하나의 string을 연결할때 사용
  • html, json 문자열을 만드는데 유용하게 사용할 수 있음 ex)서버에서 클라인트쪽으로 데이터 접근할때

 

public class TestBlockTest {

	public static void main(String[] args) {
		
		String textBlocks= """
				This 
				is 
				text
				block
				test.""";
		System.out.println(textBlocks);
		System.out.println(getBlockOfHtml());
		
	}
	
	public static String getBlockOfHtml() {
		    return """
		            <html>

		                <body>
		                    <span>example text</span>
		                </body>
		            </html>""";
	}
}