* 해당 블로그 포스팅은 필자가 개인적으로 공부하고 리뷰하는 용도로 작성되었습니다.
필자는 회사에서 문자열 데이터를 다룰 때가 많다.
그래서 자바를 공부할 때도 문자열 데이터 처리를 위주로 공부한다.
이번에는 자바에서 문자열을 자유자재로 유용하게 사용할 수 있는 문자열 관련 클래스들에 대해 공부하고 리뷰해본다.
String
String 클래스의 특징은 다음과 같다.
* 힙 메모리에 인스턴스로 생성되는 경우와 상수 풀에 있는 주소를 참조하는 두 가지 방법이 있다.
* 힙 메모리는 생성될때마다 다른 주소 값을 가지지만, 상수 풀의 문자열은 모두 같은 주소 값을 가진다.
소스를 보자.
public class StringTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//1. String 선언
String str1 = new String("String1");
String str2 = "String2";
System.out.printf("%s 와 %s 같은지 비교 \n", str1, str2); //C언어 printf 문과 동일
System.out.println(str1==str2);
String str3 = "kim";
String str4 = "kim";
System.out.printf("%s 와 %s 같은지 비교 \n", str3, str4);
System.out.println(str3==str4);
}
}
String은 char, int 와 같이 원래 존재하는 데이터 타입이 아니라 클래스이다.
자바에서 String은 문자열 타입이 아니고, 문자열 클래스임을 짚고 넘어가자.
자바에서도 C언어의 printf 문을 사용할 수 있다.
* 한번 생성된 String은 변하지 않는다.
* String을 연결하면 기존의 String에 연결되는 것이 아니라, 새로운 문자열이 생긴다. -> 메모리 낭비 될 수 있음.
소스를 보자.
public class StringTest2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String strJava = new String("JavaTest");
String strSpring = new String("SpringTest");
System.out.println(System.identityHashCode(strJava)); //1348949648
strJava = strJava.concat(strSpring);
System.out.println(strJava); //JavaTestSpringTest
System.out.println(System.identityHashCode(strJava)); //834133664
/*System.identityHashCode(Object o) : 객체의 고유한 hashcode를 리턴하는 메소드*/
}
}
* System.identityHashCode(strJava) : strJava 객체의 고유한 hash 코드를 리턴하는 메서드이다.
* strJava.concat(strSpring) : strJava 문자열 뒤에 strSpring 문자열을 + 한다.
StringBuilder
* StringBuilder의 특징은 다음과 같다.
* 내부적으로 가변적인 char []를 멤버 변수로 가진다.
* 문자열을 여러 번 연결하거나 변경할 때 사용한다.
* 새로운 인스턴스를 생성하지 않고, char []를 변경한다.
* StringBuffer는 멀티 스레드 프로그래밍에서 동기화를 보장한다.
* 단일 스레드 프로그램에서는 StringBuilder 사용을 권장한다.
소스를 보자
public class StringBuilderTest {
public static void main(String[] args) {
/*1. String 인스턴스 생성*/
String strApple = new String("Apple");
String strOrange = new String("Orange");
/*2. StringBuilder 인스턴스 생성 */
StringBuilder strBuf = new StringBuilder(strApple);
/*3. append 전 출력 */
System.out.println("strBuf hashCode 출력 : " + System.identityHashCode(strBuf));
System.out.println("strBuf 에 담긴 문자열 출력 : " + strBuf);
/*4. append : 버퍼 뒤 문자열 추가 */
System.out.println("======append======");
strBuf.append("먹고싶다.");
/*5. append 후 출력 */
System.out.println("strBuf hashCode 출력 : " + System.identityHashCode(strBuf));
System.out.println("strBuf 에 담긴 문자열 출력 : " + strBuf);
System.out.println("strBuf 에 있는 문자열을 strApple 로 반환 전 : "+ strApple);
/*6. strBuf에 있는 문자열을 strApple 로 반환. toString 메서드 이용*/
strApple = strBuf.toString();
System.out.println("strBuf 에 있는 문자열을 strApple 로 반환 후 : " + strApple);
System.out.println("strApple : " + strApple);
}
}
* 위를 자세히 보면 strApple에 있는 문자열을 strBuf에 담았다가 append 함수를 호출하여 뒤에 문자열을 추가로 버퍼에 strBuf에 담고, 그것을 toString() 메서드를 하여 strApple에 반환해준다.
(strBuf의 참조형은 StringBuilder이기 때문에,
String 형인 strApple에 대입해주기 위해서는toString() 메서드를 이용한다.)
String Text Block
* String Text Block은 JAVA 13 버전부터 사용할 수 있게 되었다.
* 문자열을 """ """ 사이에 이어서 만들 수 있게 되었다.
* html, json 문자열을 만드는데 유용하게 사용된다.
소스를 보자
public class TextBlockString {
public static void main(String[] args) {
// TODO Auto-generated method stub
String strTextBlock =
"""
Hello, World
My name is RunKim
This is Block Test
""";
System.out.printf("그냥 출력 %s \n", strTextBlock);
System.out.println("HTML 구문 호출");
System.out.println(getHtml());
}
//HTML형식으로 출력해주는 함수 정의
public static String getHtml() {
return """
<html>
<head>
<h1>Hello, Title<h1>
</head>
<body>
<span>
여기는 HTML
</span>
</body>
</html>""";
}
}
마무리
어떤가? 자는 유용한 클래스들을 많이 제공하여 개발자들을 편하게 해주는 강력한 언어이다.
필자는 자바 공부를 열심히 하여 대용량 데이터들을 다뤄보는 것으로 목표를 두고 있다.
잠 온다. 얼른 자야지..
그럼 안녕~
'Java' 카테고리의 다른 글
[Java] 연결 리스트(LinkedList) (0) | 2023.01.03 |
---|---|
[Java] 배열(Array) 구현 (0) | 2023.01.03 |
[JAVA] Collections Framework - Arrays (0) | 2022.04.01 |
[JAVA] Stack vs Queue (0) | 2022.03.29 |
[JAVA] Collection Framework - ArrayList 1 (0) | 2022.03.28 |