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
*/
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();
}
}
StringBuilder는 동기화를 지원하지 않는 반면, StringBuffer는 동기화를 지원하여 멀티 스레드 환경에서도 안전하게 동작할 수 있다.