String 클래스
기존의 다른 언어에서는 문자열을 char형의 배열로 다루었으나 자바에서는 문자열을 위한 클래스를 제공한다. 그것이 바로 String클래스인데, String클래스는 문자열을 저장하 고 이를 다루는데 필요한 메서드를 함께 제공한다.
문자열 불변법칙이 있다.
String str = "abc"; 으로 선언 후
String str = "abc"+"def"; 으로 다시 선언한다면?
"abc"참조를 끊고 "abc+def"를 새로 만들어서 주소가 바뀐다.
이 때 끊어져서 호출할 수 없는 "abc"객체는 = 쓰레기 객체 = garbage collection의 대상이 된다.
(garbage collection: 사용되지않은 객체를 찾아 지우는역할)
객체를 생성시키고 소멸시키는 방법이 없어서 일정시간이 지나면 쓰레기 객체가 생기는데
그렇다고 garbage collector가 바로 지우지는 않는다.
그래서 쓰레기 객체가 너무 많이 생성이되면 메모리에 부담을 준다.
∴ 덧셈연산자‘+’를 사용해서 문자열을 결합하는 것은 매 연산 시 마다 새로운 문자열을 가진 String인스턴스가 생성되어 메모리공간을 차지하게 되므로 가능한 한 결합횟수를 줄이는 것이 좋다.
문자열의 비교
문자열을 만들 때는
문자열 리터럴을 지정하는 방법과 String클래스의 생성자를 사용해서 만드는 방법이 있다.
- 암시적 객체 생성 (문자열 리터럴 지정)
String str1 = "abc";
String str2 = "abc";
문자열 리터럴 "abc"의 주소가 str1에 저장됨
문자열 리터럴은 이미 존재하는 것을 재사용하는 것이다.
- 명시적 객체 생성 (원칙적으로는 명시적으로 객체 생성) (String클래스의 생성자를 생성)
String str3 = new String("abc");
String str4 = new String("abc");
새로운 Sring인스턴스를 생성해서 이용한 경우에는 new연산자에 의해서 메모리할당이 이루어지기 때문에 항상 새로운 String인스턴스가 생성된다
equals()를 사용했을 때는
두 문자열의 내용(“abc”)을 비교하기 때문에 위 두 경우 모두 true 를 결과로 얻는다.
하지만, 각 String인스턴스의 주소를 등가비교연산자 ‘==’로 비교했을 때는
두 문자열의 주소를 비교하기 때문에 결과가 다르다.
String클래스의 생성자와 메서드
문자열간의 결합이나 추출 등 문자열을 다루는 작업이 많이 필요한 경우에는 String클래스 대신
StringBuffer클래스를 사용하는 것이 좋다. StringBuffer인스턴스에 저장된 문자열은 변경이 가능하므로 하나의 StringBuffer인스턴스만으로도 문자열을 다루는 것이 가능하다.
join()과 StringJoiner
- join()은 여러 문자열 사이에 구분자를 넣어서 결합한다.
구분자로 문자열을 자르는 split()과 반대의 작업을 한다고 생각할 수 있다.
String animals = "dog,cat,bear";
//split
String[] arr = animals.split (","); // 문자열을 ','를 구분자로 나눠서 배열에 저장
//join
String str = String, join("-",arr); // 배열의 문자열을 '-'로 구분해서 결합
System.out.printin(str); // dog-cat-bear 가 출력된다.
StringJoiner 클래스
- java.util.StringJoiner클래스를 사용해서 문자열을 결합할 수도 있다.
Stringjoiner sj = new Stringjoiner ("구분자" , "접두사(앞)" , "접미사(뒤)");
Stringjoiner sj = new Stringjoiner ("," , "[" , "]");
String[] strArr = { "aaa”, "bbb", "ccc” };
for(String s : strArr)
sj. add (s.toUpperCase());
System.out.println(sj.toString()); // [AAA,BBB,CCC] 출력
StringUtil 클래스
자바의 String 클래스가 제공하는 문자열 관련 기능을 강화한 클래스.
- StringUtils 클래스만으로 거의 대부분의 문자열 처리를 수행.
- 파라미터 값으로 null을 주더라도 절대 NullPointException을 발생시키지 않음.
(null이 입력되는 경우, 메소드에 따라 알맞은 결과를 리턴.)
https://kmj1107.tistory.com/entry/Java-StringUtils
#.[Java] StringUtils
StringUtils □ 정의 - org.apache.commons.lang.StringUtils. - 자바의 String 클래스가 제공하는 문자열 관련 기능을 강화한 클래스. □ 특징 - StringUtils 클래스만으로 거의 대부분의 문자열 처리를 수행. -..
kmj1107.tistory.com
StringBuffer 클래스
그렇기 때문에 최종적으로 데이터를 추가하더라도 쓰레기객체가 안생기는 stringBuffer 문자열로 바꾼다.
문자열 반복을 안하는 한두번,열 번 정도는 String을 써도 메모리에 부담안가고 감당하지만,
몇백번, 몇천번 처럼 많을 경우에 stringBuffer를 하나의 객체에 모으고 작업이 끝나면 String으로 바꾼다.
즉 가공을 많이하면 string보다 stringBuffer쓰는게 적합하다.
stringBuffer는 기본패키지라서 import 안해도 쓸 수 있다.
public class StringBufferMain {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("여름 덥다!!");
System.out.println("1: " + sb); //(참조변수sb).toString과 똑같은 것
//근데 재정의 되어서 참조값이 안나온는 것
sb.insert(2, '이'); //원하는 인덱스에 문자를 끼워추가 (인덱스,추가하는문자)
System.out.println("2: "+sb);
sb.append("가을은 "); //기존 문자열 뒤에 문자열 추가
System.out.println("3: "+ sb);
sb.append("시원하다 ");
System.out.println("4: "+ sb);
//시작인덱스부터 끝인덱스 전(미만)까지의 문자열을 지정한 대체문자열로 바꾼다
sb.replace(0,3,"여행가자!!"); //(스타트인덱스, 엔드인덱스, 대체할문자열)
System.out.println("5: "+sb);
sb.deleteCharAt(0); //해당인덱스의 문자를 삭제
System.out.println("6: "+ sb);
sb.delete(0, 3); //(스타트인덱스, 엔드인덱스-1) 삭제
System.out.println("7: "+ sb);
//★StringBuffer -> String 변환★(타입만 바껴서 출력값은 같다)
String str = sb.toString();
System.out.println(str);
}
}
[Java] 💻StringBuffer의 생성자와 메서드
String클래스에서는 equals메서드를 오버라이딩해서 문자열의 내용을 비교하도록 구현되어 있지만,
StringBuffer클래스는 equals메서드를 오버라이딩하지 않아서
StringBuffer클래스의 equals()를 사용해도
두 문자열의 내용(“abc”)을 비교하지않고
‘==’로 비교(두 문자열의 주소를 비교)한 것과 같은 결과를 얻는다.
StringBuilder
StringBuffer에서 쓰레드의 동기화만 뺀 StringBuilder가 새로 추가되었다.
StringBuilder는 StringBuffer와 완전히 똑같은 기능으로 작성되어 있어서, 소스코드에 서 StringBuffer대신 StringBuilder를 사용하도록 바꾸기만 하면 된다.
StringBuffer도 충분히 성능이 좋기 때문에 성능향상이 반드시 필요한 경우를 제외하고는 기존에 작성한 코드에서 StringBuffer를 StringBuilder로 굳이 바꿀 필요는 없다.
이 클래스는 상속될 수 없다.
'Java > ✿object*객체' 카테고리의 다른 글
[ Java ] 💻 생성자와 메서드 (0) | 2021.11.04 |
---|---|
[ Java ] 💻 캡슐화 (0) | 2021.11.04 |
[Java] 💻접근제한자 (0) | 2021.11.04 |
댓글