Java & Kotlin

[Java 클래스] 자바의 문자열 관련 클래스

Sue 2022. 2. 3. 20:41

String 클래스

  • String 선언
String str1 = new String("abc");	// 힙 메모리에 객체 생성
String str2 = "abc";	// 상수 pool에 문자열 저장
  • 힙메모리에 인스턴스로 생성되는 경우와 상수 풀에 있는 주소를 참조하는 두가지 방법이 있다.
  • 인스턴스는 생성될 때마다 다른 주소값을 가지지만, 상수풀의 문자열은 모두 같은 주소값을 가진다.

 

StringTest.java
  • System.identityHashCode() 메서드는 객체의 고유한 해쉬 코드 리턴
  • Object 클래스의 hashCode() 메서드 또한 해쉬 코드를 리턴하지만 오버라이딩이 가능하다.
  • String을 연결하면 기존의 String에 연결되는 것이 아닌 메모리를 새로 할당받아 새로운 문자열이 생성된다.
  • 기존의 String은 계속 남아있게 되어 메모리 낭비가 발생할 수 있다. → StringBuffer or StringBuilder로 해결
package ch03;

public class StringTest {

	public static void main(String[] args) {
		
		String java = new String("java");
		String android = new String("android");
		
		System.out.println(System.identityHashCode(java));
		
		java = java.concat(android);	// 두 String 연결
		System.out.println(System.identityHashCode(java));	// 새로운 주소 할당됨
	}

}

 

수행 결과

문자열을 연결하기 전과 후의 주소값이 다르다는 것은 후에 새로운 인스턴스가 생성되어 새로운 주소를 할당받았다는 것을 의미한다.

925858445
798154996

 

StringBuilder와 StringBuffer 클래스

  • String 클래스와 달리 character array가 final로 선언되지 않아서 array를 늘리고 줄이는 것이 가능하다. (가변적)
  • 문자열을 여러 번 연결하거나 변경할 때 유용하게 사용된다.
  • 새로운 인스턴스를 생성하지 않고 기존의 character array를 변경한다.
  • StringBuffer는 멀티 쓰레드 프로그래밍에서 동기화가 적용된다. ( 두 개 이상의 쓰레드가 메모리를 access할 때 순서가 정해진다.)
  • StringBuilder는 단일 쓰레드 프로그램에서 사용이 권장된다.

 

StringBuilderTest.java
  • StringBuilder 생성자에 String 객체를 넣어 생성할 수 있다.
  • 문자열 연결은 append() 메서드로 할 수 있다.
  • 생성한 인스턴스는 toString() 메서드로 String 인자로 반환해준다.
package ch03;

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));
		
		buffer.append(android);	// 문자열 연결
		System.out.println(System.identityHashCode(buffer));	// 새로운 인스턴스가 생긴 것이 X
		
		String test = buffer.toString();	// String 인자로 변환
		System.out.println(test);
	}
	
}

 

수행 결과

문자열을 연결하기 전과 후의 주소값이 같다는 것은 같은 인스턴스에 문자열이 연결되었다는 것을 의미한다.

925858445
925858445
javaandroid

 

text block (java 13 부터)

  • 아직 실무에서 많이 사용되지는 않는다.
  • 여러 줄의 문자열을 잇는데 유용하게 사용된다. e.g. html, json
String textBlock = """
		<html>
                    <body>
                    	<p>Hi</p>
                    <body>
                </html>""";