-
String, StringBuilder, StringBufferComputer Science/JAVA 2021. 8. 20. 22:38
1️⃣ String 클래스
변경 불가능한 클래스(immutable 클래스)
String클래스에는 문자열을 저장하기 위해서 문자열 배열 참조변수 value를 인스턴스 변수로 정의하고 있습니다. 한 번 생성된 String 인스턴스가 갖고 있는 문자열은 읽어 올 수만 있고,
변경할 수는 없습니다
.'+'연산자를 이용해서 문자열을 결합하는 경우는 인스턴스 내의 문자열이 바뀌는 것이 아니라 새로운 문자열이 담긴 String 인스턴스가 생성되게 됩니다. 문자열 간의 결합이나 추출 등 문자열을 다루는 작업이 많이 필요한 경우 String 클래스 대신 StringBuffer클래스를 사용하는 것이 좋습니다.
문자열 비교
문자열을 만들 때는 문자열 리터럴을 지정하는 방법과 String 클래스의 생성자를 사용해서 만드는 방법이 있음.
String str1 = "abc"; // 문자열 리터럴 "abc"의 주소가 str1에 저장됨 String str2 = "abc"; String str3 = new String("abc"); // 새로운 String 인스턴스를 생성 String str4 = new String*("abc");
String 클래스의 생성자를 이용한 경우에는 new 연산자에 의해서 메모리할당이 이루어지기 때문에 항상 새로운 String 인스턴스가 생성이 됨. 하지만 문자열 리터럴은 이미 존재하는 것을 재사용하는 것.
public class StringEx1 { public static void main(String[] args) { String str1 = "abc"; String str2 = "abc"; System.out.println(str1 == str2); // true System.out.println(str1.equals(str2)); // true String str3 = new String("abc"); String str4 = new String("abc"); System.out.println(str3 == str4); // false System.out.println(str3.equals(str4)); // true } }
equals()를 사용했을 때는 두 문자열의 내용을 비교하기 때문에 두 경우 모두 true를 결과로 얻지만, 각 String 인스턴스의 주소를 등가비교연산자 '=='로 비교했을 때는 결과가 다름.
문자열 리터럴
자바 소스파일에 포함된 모든 문자열 리터럴은 컴파일 시에 클래스 파일에 저장됩니다. 이 때 같은 내용의 문자열 리터럴은 한번만 저장됩니다. 클래스 파일에는 소스파일에 포함된 모든 리터럴의 목록이 있습니다. 해당 클래스 파일이 클래스 로더에 의해 메모리에 올라갈 때, 이 리터럴의 목록에 있는 리터럴들이 JVM내에 있는 상수 저장소에 저장됩니다.
join(), Stringjoiner
join()은 여러 문자열 사이에 구분자를 넣어서 결합합니다. split()과 반대 역할
public class StringEx2 { public static void main(String[] args) { String animals = "dog,cat,bear"; String[] arr = animals.split(","); System.out.println(String.join("-", arr)); StringJoiner sj = new StringJoiner("/", "[", "]"); for(String s : arr) sj.add(s); System.out.println(sj); } }
기본형 값을 String으로 변환
int i = 100; String str1 = i + ""; // 간단한 방법 String str2 = String.valueOf(i); //성능이 좀 더 좋은 방법
참조 변수에 String을 더하면 참조변수가 가리키는 인스턴스의 toString()을 호출하여 String을 얻은 다음 결합합니다.
String을 기본형 값으로 변환
int i = Integer.parseInt("100"); int i2 = Integer.valueOf("100"); // valueOf 메서드 내에서 어차피 parseInt()를 사용
2️⃣ StringBuffer
String클래스는 인스턴스를 생성할 때 지정된 문자열을 변경할 수 없지만 StringBuffer클래스는 변경이 가능합니다. 내부적으로 문자열 편집을 위한 버퍼를 가지고 있고, StringBuffer 인스턴스를 생성할 때 그 크기를 지정할 수 있습니다.
StringBuffer는 equals 메서드를 오버라이딩하지 않아서 StringBuffer클래스의 equals 메서드를 사용해도 '=='연산자를 사용한 것과 같은 결과를 얻습니다.
그래서 StringBuffer 인스턴스에 담긴 문자열을 비교하기 위해서는 toString()을 호출해서 String 인스턴스를 얻은 다음, 여기에 equals 메서드를 사용해서 비교해야 합니다.
3️⃣ StringBuilder
StringBuffer는 멀티쓰레드에 안전하도록 동기화되어 있습니다. 멀티쓰레드로 작성된 프로그램이 아닌 경우에, StringBuffer의 동기화는 불필요하게 성능만 떨어뜨리게 됩니다.
그래서 StringBuffer에서 쓰레드의 동기화만 뺀
StringBuilder
가 추가되었습니다.'Computer Science > JAVA' 카테고리의 다른 글
열거형(enums) (0) 2021.08.20 Generics (0) 2021.08.20 Object 클래스 (0) 2021.08.20 예외 처리 (0) 2021.08.12 Maven vs Gradle (0) 2021.01.18