* String?
String은 문자열이다. java에서 string 객체는 불변이므로 생성된 후에는 변경할 수 없다. 객체이니까 heap 영역에 생성된다.
java에서 문자열을 생성하는 방법에는 2가지가 있다.
// no.1
String s =“GeeksforGeeks”;
// no.2
String s = new String ( "GeeksforGeeks");
string은 불변의 성격을 가지고 있으므로 + 연산자를 사용하게 되면 기존의 문자열이 가지고 있는 메모리에 +로 추가하는 새 문자열을 추가하는 것이 아니라, 새로 메모리를 할당받아 새 string을 만들게 된다.
String str = "Don";
str += "John";
//
이렇게 되면 1번 라인 기존의 str이 가지고 있던 메모리에
john 문자열이 추가되는 것이 아니라
아예 새로운 영역에 "Don John"이라는 문자열을 새로 할당받는다.
왜냐하면 문자열은 불변의 성격을 지니기 때문이다.
따라서 문자열을 +연산자를 많이 사용하여 합치게 되면 그 때마다 메모리를 새로 할당받아와야 하기 때문에 성능의 저하가 일어난다.
string의 메소드
1. int length(): 문자열의 길이를 리턴한다.
2. char charAt(int i): 문자열의 i번째 문자(character)을 리턴한다.
3. String substring(int i): 문자열의 i번째부터 끝까지 일부 문자열을 리턴한다.
4. String substring(int i, int j): 문자열의 i부터 j - 1까지 일부 문자열을 리턴한다 .
5. String concat(String str): 기존 문자열의 끝에 매개변수로 들어온 문자열을 연결한다.
6. int indexOf(String s): 지정된 문자열이 처음 나타나는 문자열의 인덱스를 반환한다.
7. boolean equals(Object otherObj): 문자열을 매개변수로 들어오는 객체와 비교한다.
8. boolean equalsIgnoreCase(String anotherString): 대소문자를 무시하고 문자열을 다른 문자열과 비교한다.
9. String toLowerCase(): 문자열의 모든 문자를 소문자로 변환한다. 모든 문자를 대문자로 변환하는 toUpperCase()도 있다.
10. String trim(): 문자열의 시작과 끝의 공백을 제거하여 문자열의 복사본을 반환한다. 문자열 중간의 공백은 신경쓰지 않는다 .
11. String replace(char oldChar, char newChar): 문자열 내의 oldChar을 모두 0newChar로 변환한다.
더 많은 메소드들이 있으므로 자세한 것은 공식 문서 확인하자
* StringBuilder?
StringBuilder는 가변적인 성격을 지닌다. 따라서 문자열이 변경될 때마다 새로 메모리를 할당받는 string과는 달리, 버퍼를 통해 문자열을 저장해두었다가 toString() 메소드를 통해서 한번에 string 문자열 객체를 생성하게 된다.
StringBuilder의 문자열을 추가하는 메소드
-append()
기존 문자열의 끝에 추가한다.
StringBuilder sb = new StringBuilder("Butter");
sb.append("fly");
//
sb는 Bufferfly가 된다.
-insert()
원하는 위치에 문자열 추가한다.
StringBuilder sb = new StringBuilder("Buer");
sb.insert(2,"tt");
//
sb는 butter
* 요약
문자열은 불변의 성질을 가지고 있다. 따라서 문자열에 다른 문자열을 덧붙이는 등 수정이 일어나게 되면 새로 메모리를 받아와야 하므로 성능의 저하가 일어날 수 있다. StringBuilder는 가변적이므로 buffer에 문자열을 담고 수정하고 뭐 그러다가 toString() 메소드로 한번에 string을 생성한다. 그러므로 문자열의 수정이 잦은 경우에는 StringBuilder를 사용하는 것이 성능상 유리하다.
+ ) 그러나 StringBuilder는 멀티 쓰레드 환경에서 문자열을 변경해야 하는 경우에는 동기화 문제가 발생할 수 있다고 한다... thread-safe하지 않기 때문 -> 멀티 쓰레드 환경에서는 StringBuffer를 사용해야 한다. (StringBuffer는 멀티쓰레드 환경에서 각각의 메소드에 대해 동기화를 보장하기 때문에 동기화 문제가 발생하지 않는다고 한다.)
출처 - https://www.geeksforgeeks.org/string-class-in-java/
https://readystory.tistory.com/141?category=784159
'JAVA' 카테고리의 다른 글
Collection Framework (0) | 2021.07.05 |
---|---|
Interface(인터페이스) (0) | 2021.06.30 |
메모리 구조(Stack, Heap) (0) | 2021.06.20 |
JDBC: executeQuery VS excuteUpdate (0) | 2021.04.25 |
상속(Inheritance) (0) | 2021.01.29 |