String vs StringBuffer / StringBuilder

YongJun·2023년 8월 31일

JAVA

목록 보기
11/24
post-thumbnail

String

  • String은 불변(immutable)하기 때문에 기존 것을 버리고 새로 할당하는 식으로 사용(문자열 편집(수정)을 할 수 없다.)

  • 문자열

  • literal("") 생성 가능

  • 비교시 == 사용하면 reference(참조값)(주소)을 비교 한다.
    equals() 사용하면 문자열의 내용을 비교한다.

package jun;

public class StringMain {

	public static void main(String[] args) {
		String a= "apple"; //literal 생성(but 모든 class는 new 생성자로 생성해야 한다)
		String b= "apple";
		if(a==b) { //주소 비교
			System.out.println("a와 b의 참조값은 같다.");
		}
		else {
			System.out.println("a와 b의 참조값은 다르다.");
		}
		
		if(a.equals(b)) { //문자열 비교
			System.out.println("a와 b의 문자열은 같다.");
		}
		else {
			System.out.println("a와 b의 문자열은 다르다.");
		}
		System.out.println();
		
		
		String c = new String("apple");
		String d = new String("apple");
		if(c==d) { //주소 비교
			System.out.println("c와 d의 참조값은 같다.");
		}
		else {
			System.out.println("c와 d의 참조값은 다르다.");
		}
		
		if(c.equals(d)) { //문자열 비교
			System.out.println("c와 d의 문자열은 같다.");
		}
		else {
			System.out.println("c와 d의 문자열은 다르다.");
		}
		System.out.println();
		
		
		String e = "오늘 날짜는 "+2023+2+10; 
		System.out.println(e);
		String f = "오늘 날짜는 "+(2023+2+10);
		System.out.println(f);
		//문자열은 편집이 안된다.(한번 만들어진 문자열은 불변!) -> 메모리에 4번의 생성이 일어난다 <-> StringBuffer(편집가능)
		
        
		//String 클래스의 메소드 정리
		System.out.println("문자열 크기 = "+ e.length());
		
		for(int i=0; i<e.length(); i++) {
			System.out.println(i+" : "+ e.charAt(i));
		}
		System.out.println("부분 문자열 추출="+e.substring(7));
		System.out.println("부분 문자열 추출="+e.substring(7,11));
		
		System.out.println("대문자 변경="+"Hello".toUpperCase());
		System.out.println("소문자 변경="+"Hello".toLowerCase());
		
		System.out.println("문자열 검색="+e.indexOf("짜"));
		System.out.println("문자열 검색="+e.indexOf("날짜"));
		System.out.println("문자열 검색="+e.indexOf("개바부"));
        
		//indexOf("찾을 특정 문자", "시작할 위치")
        System.out.println(e.indexOf("짜", 0));
        
		System.out.println("문자열 치환="+e.replace("날짜","일자"));
	}

}
/*
a와 b의 참조값은 같다.
a와 b의 문자열은 같다.

c와 d의 참조값은 다르다.
c와 d의 문자열은 같다.

오늘 날짜는 2023210
오늘 날짜는 2035
문자열 크기 = 14
0 : 오
1 : 늘
2 :  
3 : 날
4 : 짜
5 : 는
6 :  
7 : 2
8 : 0
9 : 2
10 : 3
11 : 2
12 : 1
13 : 0
부분 문자열 추출=2023210
부분 문자열 추출=2023
대문자 변경=HELLO
소문자 변경=hello
문자열 검색=4
문자열 검색=3
문자열 검색=-1
4
문자열 치환=오늘 일자는 2023210
*/

StringBuffer / StringBuilder

  • 문자열
  • StringBuffer, StringBuilder는 변하기(mutable)하기 때문에 기존 것에서 append를 사용해서 값 변경 가능(문자열 편집(수정)이 가능)
package jun;

import java.util.Scanner;


public class StringBufferMain {
	private int dan;
	
	public void input() {
		Scanner sc = new Scanner(System.in);
		
		System.out.print("원하는 단을 입력 : ");
		dan = sc.nextInt();
	}
	
	public void output() {
		StringBuffer buffer = new StringBuffer(); 
//		StringBuffer buffer = " " // X
		
		//append() : 추가, delete() : 제거
		for(int i=1; i<10; i++) {
			//System.out.println(dan+"*"+i+"="+(dan*i));
			buffer.append(dan);
			buffer.append("*");
			buffer.append(i);
			buffer.append("=");
			buffer.append(dan*i);
			System.out.println(buffer.toString()); //StringBuffer -> String 변환
			
			//StringBuffer는 값이 사라지지 않고 보관됨
			// 2*1=2 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18 -> delete() 필요
			buffer.delete(0,buffer.length());
		}
	}
	
	
	public static void main(String[] args) {
		StringBufferMain sbm = new StringBufferMain();
		sbm.input();
		sbm.output();

	}

}

StringBuffer vs StringBuilder

StringBuilder는 동기화를 지원하지 않는 반면, StringBuffer는 동기화를 지원하여 멀티 스레드 환경에서도 안전하게 동작할 수 있다.

profile
개(발자어)린이

0개의 댓글