Java의 String에 대해 정리한다.
잘 이해하려면 사전지식을 알고 가자.
∨ 사전지식 : 문자열 리터럴 vs 문자열 객체
- 문자열 리터럴 객체
: heap의 상수풀(String constant pool)에 담긴다 (java7 이상 : 상수풀이 heap영역에 위치)
: 문자열은 상수풀에 하나만 생성된다. 상수풀에는 동일 문자열이 중복으로 생성될 수 없다.
: 문자열 변수가 동일한 문자열을 가리킨다면, 그것은 상수풀 내의 같은 문자열을 참조한다.
- 문자열 객체 (리터럴x)
: heap에 담긴다
: 동일 문자열이 서로 다른 객체로 존재한다.
String 더하기
여러 String을 더할 때 "기본"은 이렇다.
그냥 String 객체끼리 더해주는 것이다.
String str1 = "aaaaaa";
String str2 = "bb";
String result = str1 + str2;
일단 위와 같이 String 객체끼리 더해주면 새로운 String 객체가 생성된다.
자바의 String 객체는 한 번 생성되면 내용을 바꾸지 못한다.
더해서 String을 만들 때마다 계속 새로운 String이 생성되는 것이다.
만일 정말 많은 문자열들을 위와 같이 덧셈연산으로 연결연결 해나갈 경우 비효율적이다.
수많은 중간 String 객체가 생성되고, 메모리는 그 부산물들을 저장하므로 비효율적이다.
이것은 String 객체가 변경 불가능하다는 특징 때문에 생기는 문제다.
그렇다면 String 객체가 "변경 가능"하다면 메모리 효율이 좋지 않을까?
"변경 가능한 String 객체"가 이미 존재한다. StringBuilder 객체를 쓰면 된다!
StringBuilder를 사용하는 방법은 단순하다.
new로 StringBuilder 객체를 생성한 후 append()를 연속적으로 사용하여 문자열들을 쭉 이어주면 된다.
StringBuilder와 String은 다르기 때문에, StringBuilder를 String으로 변경하려면 toString() 쓰면 된다.
그런데 System.out.println() 문에서는 그냥 StringBuilder 넣어도 무관하다.
StringBuilder sb = new StringBuilder();
sb.append("aaaa").append("bb");
String str = sb.toString();
그냥 StringBuilder 객체에 계속 append() 해주면 문자열이 연결연결 되는 것이다!
마음에 든다.
참고!
StringBuilder의 reverse()는 문자열을 완전히 뒤집어준다.
아예 char 하나하나 뒤집는다.
예시는 아래와 같다.
public class Main {
public static void main(String[] args){
StringBuilder sb = new StringBuilder();
sb.append("여러분 ");
sb.append("오늘").append("날씨짱좋아욥");
System.out.println(sb);
System.out.println(sb.reverse());
}
}
출력
여러분 오늘날씨짱좋아욥
욥아좋짱씨날늘오 분러여
'JAVA' 카테고리의 다른 글
[JDBC] DB Connection을 얻어서 query 실행 | DriverManager과 DataSource를 통하여 (+ Connection Pool 개념) (0) | 2023.01.11 |
---|---|
[JAVA] Iterator의 remove() 이해하기 (0) | 2022.09.08 |
웹개발 집중학습용으로 블로그 개설 (0) | 2022.07.19 |
오버라이딩 반환타입 불일치? 상속관계면 반환타입이 달라도 된다 (0) | 2022.07.19 |
실전 JAVA 소프트웨어 개발 | 입출금 내역 분석기 확장 실습하기 (0) | 2022.04.06 |