본문 바로가기

Back-End/JAVA

불변 String 클래스와 가변 StringBuilder

자바에서 문자를 다루는 대표적인 타입은 char, String 2가지가 있따.

하지만 char은 문자 하나를 다룰 때 사용하는데 만약 문자가 여러개(문자열)면 char[] 배열을 사용해야한다. 그러면 너무 불편해서 이에 대안으로 String이 나왔다.

"문자열 생성 방법"
String str1 = "Hello";
String str2 = new String("hello");

String은 클래스이다. 기본형아니다.. 참조형이다!

원래는 우리가 참조형 인스턴스를 만들면 보통 new 키워드를 사용한다.

하지만 String은 매우 많이 사용해서 Java에서 특별히 " "(쌍따움표)를 지원한다.

 

String 주요 메서드(이 부분은 String 주요 메서드 글로 또 업로드 예정)

  • length() : 문자열 길이를 반환
  • charAt(0) : 0번째 인덱스 문자를 반환한다.
  • substring(시작 인덱스, 끝 인덱스) : 원하는 부분의 문자열을 반환한다.
  • indexOf(String str) : 특정 문자열이 시작되는 인덱스를 반환한다.
  • toLowerCase(), toUpperCase() : 문자열을 소문자 또는 대문자로 변환한다.
  • trim() : 문자열 양 끝의 공백을 제거한다.
  • concat(String str) : 문자열을 더한다

주의!) 문자열 비교는 항상 equals()를 사용해서 동등성 비교를 해야한다.

 

String은 불변 객체이므로 생성 이후에 절대로 내부의 문자열 값을 변경할 수 없다.

String str = "hello";
str.concat(" java");
System.out.println("str = " + str);
// 결과
str = hello // 불변 객체라서 변경 절대 x

//리팩토링
String str2 = str.concat(" java");
System.out.println("str = " + str2);
//결과
str = hello java

당연한 결과다. 왜냐? 방금 위에서 String은 불변 객체라고 했다. 그래서 새로운 결과를 얻고 싶으면 새롭게 변수에 담아야 한다!!

 

불변인 String 클래스의 단점

String은 불변이라 만약 새로운 결과를 얻고 싶으면 또 새로운 객체를 만들어야 한다. 그러면 메모리 자원에서 손해가 난다 ㅠㅠ

 

이 문제를 해결하기 위해서 StringBuilder라는 가변 String을 제공한다.(가변의 경우는 사이드 이펙트에 항상 신경을 쓰자!)

 

StringBuilder 사용 예제

StringBuilder sb = new StringBuilder();
sb.append("A"); 
sb.append("B");
sb.append("C");
sb.append("D");
System.out.println("sb = " + sb); "ABCD 출력"

sb.insert(4, "Java") "4번째 인덱스에 "JAVA" 삽입"
System.out.println("sb = " + sb); "ABCDJAVA 출력"

sb.delete(4,8); "4번째 인덱스 부터 8번 전 인덱스까지 삭제"
System.out.println("delete = " + sb); "ABCD"

sb.reverse();
System.out.println("reverse = " + sb); "DCBA"

"StringBuilder -> String"
String string = sb.toString();
System.out.println("String = " + string);

 

 

정리

가변 vs 불변

- String은 불변이다. 즉, 한 번 생성되면 그 내용을 변경할 수 없다. 따라서 문자열에 변화를 주려고 할 때마다 새로운 String 객체가 생성되고, 기본 객체는 버려진다. 이 과정에서 메모리와 처리 시간을 더 많이 소모한다.

- 반면에, StringBulder는 가변적이다. 하나의 StringBuilder 객체 안에서 문자열을 추가, 삭제, 수정할 수 있으며, 이때마다 새로운 객체를 생성하지 않는다. 단 사이드 이펙트에 주의하자

StringBuilder는 보통 문자열을 변경하는 동안만 사용하다가 문자열 변경이 끝나면 안전한(불변) String으로 변환하는 것이 좋다.

 

StringBuilder는 메서드 체인 기법을 제공한다. 그래서 바로 위에 있는 코드를 가독성 좋고 간결하게 코드를 작성할 수 있다.

StringBuilder sb = new StringBuilder();

String str = sb.append("A").append("B").append("C").appned("D")
		.insert(4, "Java")
                .delete(4, 8)
                .reverse()
                .toString();

System.out.println("String = " + str); 
//출력 : String = DCBA

 

'Back-End > JAVA' 카테고리의 다른 글

Math, Random 클래스  (2) 2024.11.19
래퍼 클래스  (0) 2024.11.19
람다와 스트림  (1) 2024.11.19
불변 객체  (0) 2024.11.18
최상위 부모인 Object 클래스  (0) 2024.11.18