String, StringBuilder, StringBuffer

김하영·2023년 3월 23일
0

자바 쫌쫌따리

목록 보기
1/5

String

String은 자바에서 문자열을 나타내는 자료형이다.

// 방법 1 : 리터럴 표기
String str = "Hello World";
// 방법 2 
String str2 = new String("Hello World2");

문자열은 위과 같이 두가지 방식으로 표현할 수 있는데 가급적이면 방법 1을 사용하는게 좋다. 그 이유는 방법 1이 가독성이 좋고 컴파일 할 때 최적화에 도움이 되기 때문이다.

  • 리터럴 표기는 “Hello World”라는 문자열을 JVM의 intern pool이라는 메로리 공간에 저장하고 다음에 동일한 문자열이 선언될때 cache된 문자열을 리턴한다.
  • 방법2는 항생 새로운 String 객체를 만든다.

String 메소드

  • str1.equals(str2): str1과 str2가 동일한 문자열인지를 반환한다. 문자열의 비교는 ‘==’을 사용하지 않는다. ‘==’는 동일한 객체인지를 판별할 때 사용하는 연산자이다.
  • str1.indexOf(str2) : str1에서 str2 문자열이 시작되는 index를 반환한다.
String str1 = "Hello world";
System.out.println(str1.indexOf("world")) // 6 
  • str1.contains(str2) : str1에서 str2문자열이 포함되어있는지 여부를 반환한다.
String str1 = "Hello world";
System.out.println(str1.contains("world")) // true
  • str1.charAt(index): str1에서 index위치의 문자를 반환한다.
  • str1.replaceAll(before, after): str1에서 before문자열을 찾아 after문자열로 바꾸어준다.
String str1 = "Hello world";
str1.replaceAll("Hello", "Bye");
System.out.println(str1) // Bye world
  • str1.substring(start, end): 문자열을 start인덱스위치부터 end-1까지 잘라 반환한다.
String str1 = "Hello world";
System.out.println(str1.substring(0,5)) // Hello
  • str1.toUppercase() / str1.toLowercase(): 문자열 전체를 대문자/ 소문자로 바꾸어 나타낸다.
String str1 = "Hello WORld";
System.out.println(str1.toUppercase()); //HELLO WORLD
System.out.println(str1.toLowercase()); //hello world
  • str1.split(del): del을 기준으로 문자열을 나눠서 배열로 반환한다. 이때 여러가지 del을 사용하고 싶다면 regex를 사용하면 된다.
String str1 = "a&b&c%d*h";
String[] result = str1.spilt("&"); //{"a", "b&c%d*h"}
String[] result2 = str1.splint("[&%*]") //{"a", "b", "c", "d", "h"}
// regex에서[]은 or이다.
  • str1.startsWith(str2) / str1.endsWith(str2) : str1이 str2로 시작하는지 또는 끝나는지의 여부를 반환한다.
String str1 = "hello world";
System.out.println(str1.startsWith("he")); // true
System.out.println(str1.startsWith("Be")); // false

System.out.println(str1.endsWith("rld")); // true
System.out.println(str1.startsWith("ddd")); // false

String의 단점

String은 불변이므로 자주 추가나 삭제를 할 때는 사용하기 적합하지 않다. 따라서 문자열에 빈번한 수정이 일어날때는 가변적인 StringBuffer나 StringBuilder를 사용하는게 좋다.


String, StringBuffer, StringBuilder 비교

String vs StringBuilder, StringBuffer

String 객체는 한번 생성되면 할당된 공간이 변하지 않는 불변(immutable)이지만 StringBuffer나 StringBuilder는 객체의 공간이 부족할때 버퍼의 크기를 늘려주는 가변(mutable)이다.

String은 크기가 고정되어 있기 때문에 내부 문자열을 수정할 수 없다. 따라서 문자열을 수정할 때마다 새로운 문자열을 리턴한다. 이렇게 사용하지 않는 객체의 수가 늘어나면 프로그램 성능이 느려진다. 따라서 문자열의 수정이 빈번하게 일어나는 작업을 할 때에는 String 보다 StringBuffer나 StringBuilder를 사용하는게 좋다.

이 두 클래스는 내부 Buffer에 문자열을 저장해두고 그 안에서 추가/수정/삭제 작업을 하므로 새로운 객체를 만들지 않고도 문자열을수정할 수 있다.

StringBuilder와 StringBuffer 사용 예제

StringBuffer와 StringBuilder는 사용법이 같으므로 예시는 Buffer만 작성했다.

String s = "hello";
StringBuffer sb = new StringBuffer(s); // String->StringBuffer;
sb.toString(); // StringBuffer -> String
sb.append("world"); // 뒤에 문자열 추가 helloworld
sb.insert(2, "no"); // 인덱스부터 새로운 문자열 추가 henollo
sb.delete(2, 4); // 인덱스 시작부터 끝-1까지 문자 삭제 hello
sb.length(); // 문자열의 길이
sb.capacity(); // 용량의 크기
sb.reverse(); // 문자열 뒤집기

StringBuffer vs StringBuilder

두 클래스는 가변적인 특성을 갖고 있고 제공하는 메서드, 사용방법도 같다. 하지만 두 클래스는 동기화에서 차이를 보인다.

StringBuffer: 각 메소드별로 동기화 키워드가 존재해 멀티스레드 상의 동기화를 지원한다.

StringBuilder: 단일 스레드 환경에서만 사용하도록 설계되어 있으므로 동기화를 지원하지 않는다.

StringBuilder가 속도는 더 빠르지만 작성한 프로그램이 언제 멀티스레드 환경에서 돌아갈지 모르니 StringBuffer로 작성하는게 더 안전하다.


참고자료

https://wikidocs.net/205

https://coding-factory.tistory.com/546

https://jamesdreaming.tistory.com/86

profile
백엔드 개발자로 일하고 싶어요 제발

0개의 댓글