1. String 클래스
String 선언하기(사용하는 방법)
String str1 = new String("abc"); //1.첫 번째 방법 : 힙 메모리에 잡힌다
String str2 = "abc"; //2.두 번째 방법 : 상수 풀에 잡히며,
//abc라는 string이 있고, 그 곳의 주소만 가리킨다
- 힙 메모리에 인스턴스로 생성되는 경우와 상수 풀(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 리턴
String str3 = "abc"; //상수 풀에 있는 애들을 부르는 것이다
String str4 = "abc";
System.out.println(str3 == str4); //true 리턴
}
}
- 한번 생성된 String은 char array에 들어가게 되는데, String은 Final로 선언되어있다 -> 불변(immutable)
- String을 연결하면 기존의 String에 연결되는 것이 아닌 새로운 문자열이 생성됨 (메모리 낭비가 발생할 수도)
package ch3;
public class StringTest2 {
public static void main(String[] args) {
String java = new String("java");
String android = new String("android");
System.out.println(System.identityHashCode(java)); //그냥 sysout(java) 출력하면 hashcode 오버라이딩 된 값 나옴
java = java.concat(android); //java에 assign을 했다(배정, 연결을 했다)
System.out.println(java); //javaandroind에 연결이 됐다.
System.out.println(System.identityHashCode(java));
}
}

다시 자바에 concat 으로 assign 하더라도, java가 가리키는 것은 다른 address를 가리키게 된다.
이렇게 String을 연결하게 되면 메모리를 새로 계속 생성하게 된다.
메모리 낭비 발생을 막기 위해
2. StringBuilder, StringBuffer 활용하기
- 내부적으로 가변적인 char[]를 멤버 변수로 가짐 (Final이라고 선언되어있지 않음!)
- 문자열을 여러번 연결하거나 변경할 때 사용하면 유용함
- 새로운 인스턴스를 생성하지 않고 char[] 를 변경함
- StringBuffer는 멀티 쓰레드 프로그래밍에서 동기화(synchronization)을 보장(두 개의 이상의 스레드가 같은 메모리를 access할 때 순서가 정해진다는 말이다. )
- 단인 쓰레드 프로그램에서는 StringBuilder 사용을 권장
- 활용하고 나서 toString() 메서드로 String을 반환해주면 된다.
package ch3;
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));//연결 후의 값
String test = buffer.toString();
System.out.println(test);
}
}
3. text block 사용하기 (java 13) -> 13버전 쓰는 경우 흔치 않음
StringBuilder, StringBuffer를 안쓰고 하나의 String을 쭉 연결할 때 유용
- 문자열을 """ """ 사이에 이어서 만들 수 있음
- html, json 문자열을 만드는데 유용하게 사용할 수 있음
package ch3;
public class TextBlockTest {
public static String getBlockOfHtml() {
return """
<html>
<body>
<span>example text</span>
</body>
</html>""";
}
public static void main(String[] args) {
String textBlocks="""
Hello,
Hi,
How r u
""";
System.out.println(textBlocks);
System.out.println(getBlockOfHtml());
}
}

만약 textBlock 클래스가 적용되지 않는다면 아래의 사진을 따라하며 설정을 바꿔주면 된다.
혹시 빨간 줄이 뜨는게 불편한 사람은 Ignore로 변경!
'JAVA' 카테고리의 다른 글
5-2.배열(Array) (0) | 2022.02.06 |
---|---|
5-1.자료구조 (0) | 2022.02.04 |
4-2.Object 클래스의 다른 메서드들 활용하기 (0) | 2022.01.26 |
4-1.Object 클래스 (0) | 2022.01.26 |
3-15.객체 지향 핵심 - 여러 인터페이스 구현하기, 인터페이스의 상속 (0) | 2022.01.24 |