본문 바로가기
Java/✿object*객체

[Java] 💻String과 StringBuffer,StringBuilder

by W_W_Woody 2021. 11. 9.

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클래스의 생성자와 메서드

[Java] 💻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

댓글