String : 문자열을 나타내는 자료형
String 인스턴스는 한 번 생성되면 그 값을 읽기만 가능하고 변경할 수는 없다. 이러한 객체를 불변 객체(immutable object) 라고 한다.
즉, 덧셈(+) 연산자를 이용해 문자열을 결합하는 경우 기존 문자열이 변경되는 것 X
문자열이 합쳐진 새로운 String 인스턴스가 생성되는 것

| 메소드 | 설명 |
|---|---|
| charAt() | 해당 문자열의 특정 인덱스에 해당하는 문자를 반환한다. 인덱스는 0부터 시작하는 숫자 체계를 의미하며 인덱스를 벗어난 정수를 인자로 전달하는 경우에는 IndexOutOfBoundsException이 발생한다. |
| compareTo() | 인자로 전달된 문자열과 사전 순으로 비교를 하여 두 문자열이 같다면 0 을 반환, 인자로 전달된 문자열보다 작으면 음수를, 크면 양수를 반환한다. 단, 이 메소드는 대소문자를 구분하여 비교한다. |
| compareToIgnoreCase() | 대소문자를 구분하지 않고 비교한다 |
| concat() | 문자열에 인자로 전달된 문자열을 합치기해서 새로운 문자열을 반환한다. 원본 문자열에는 영향을 주지 않는다. |
| indexOf() | 문자열에서 특정 문자를 탐색하여 처음 일치하는 인덱스 위치를 정수형으로 반환한다. 단, 일치하는 문자가 없는 경우 -1을 반환한다. |
| lastIndexOf() | 문자열 탐색을 뒤에서부터 하고 처음 일치하는 위치의 인덱스를 반환한다. 단, 일치하는 문자가 없는 경우 -1을 반환한다. |
| trim() | 문자열의 앞 뒤에 공백을 제거한 문자열을 반환한다. |
| toLowerCase() | 모든 문자를 소문자로 변환시킨다. 원본에는 영향을 주지 않는다. |
| toUpperCase() | 모든 문자를 대문자로 변환시킨다. 원본에는 영향을 주지 않는다. |
| substring() | 문자열의 일부분을 잘라내어 새로운 문자열을 반환한다. 원본에 영향을 주지 않는다. |
| replace() | 문자열에서 대체할 문자열로 기존 문자열을 변경해서 반환한다. 원본에 영향을 주지 않는다. |
| length() | 문자열의 길이를 정수형으로 반환한다. |
| isEmpty() | 문자열의 길이가 0이면 true를 반환, 아니면 false를 반환한다. 길이가 0인 문자열은 null과는 다르다. |
| split() | 정규표현식을 이용하여 문자열을 분리한다. |
해당 인덱스에 있는 문자를 반환한다.
Application
public class Application1 {
public static void main(String[] args) {
String str1 = "apple";
for (int i = 0; i < str1.length(); i++) {
System.out.println("charAt(" + i + ") = " + str1.charAt(i));
}
}
}

인자로 전달된 문자열과 사전 순으로 비교를 하여 두 문자열이 같다면 0 을 반환, 인자로 전달된 문자열보다 작으면 음수를, 크면 양수를 반환한다.
단, 이 메소드는 대소문자를 구분하여 비교한다.
Application
public class Application1 {
public static void main(String[] args) {
String str1 = "apple";
for (int i = 0; i < str1.length(); i++) {
System.out.println("charAt(" + i + ") = " + str1.charAt(i));
}
String str2 = "java";
String str3 = "java";
String str4 = "JAVA";
String str5 = "mariaDB";
System.out.println(str2.compareTo(str3));
System.out.println(str2.compareTo(str4));
System.out.println(str4.compareTo(str2));
System.out.println(str2.compareTo(str5));
System.out.println(str5.compareTo(str2));
}
}

(int) j : 106, (int) J : 74 라서 32 차이가 나는 것이다.
대소문자 비교 안 할거면
compareToIgnoreCase()사용하기
concat() : 문자열 합치기
System.out.println("concat : " + str2.concat(str5));

indexOf() : 문자열에서 특정 문자를 탐색하여 처음 일치하는 인덱스 위치를 정수형으로 반환한다. 단, 일치하는 문자가 없는 경우 -1을 반환한다.
lastIndexOf() : 문자열 탐색을 뒤에서부터 하고 처음 일치하는 위치의 인덱스를 반환한다. 단, 일치하는 문자가 없는 경우 -1을 반환한다.
String indexOf = "java mariaDB";
System.out.println("indexOf('a') = " + indexOf.indexOf('a'));
System.out.println("indexOf('b') = " + indexOf.indexOf('b'));

trim() : 문자열 앞, 뒤의 공백을 제거한 문자열 반환
String trimStr = " java ";
System.out.println("trimStr = #" + trimStr + "#");
System.out.println("trim() = #" + trimStr.trim() + "#");

toLowerCase() : 모든 문자를 소문자로 변환
toUpperCase() : 모든 문자를 대문자로 변환
String caseStr = "javamariaDB";
System.out.println("toLowerCase() = " + caseStr.toLowerCase());
System.out.println("toUpperCase() = " + caseStr.toUpperCase());
System.out.println("caseStr : " + caseStr);

substring : 문자열의 일부분을 잘라내 새로운 문자열을 반환하는 것
String javamariaDB = "javamariaDB";
System.out.println("substring(3, 6) : " + javamariaDB.substring(3, 6));
System.out.println("substring(3) : " + javamariaDB.substring(3));
System.out.println("javamariaDB : " + javamariaDB);
substring(start, end) : start번째부터 (end - 1)번째 인덱스까지 자른다.
즉, substring(3, 6) -> 3 ~ 5 인덱스까지 자르기
substring(start) : start 인덱스부터 끝까지

replace() : 문자열에서 대체할 문자열로 기존 문자열을 변경
System.out.println("replace() : " + javamariaDB.replace("java", "python"));
System.out.println("javamariaDB : " + javamariaDB);

length() : 문자열의 길이를 정수형을 반환
System.out.println("length() : " + javamariaDB.length());
System.out.println("빈 문자열 길이 :" + "".length());

isEmpty() : 문자열의 길이가 0이면 true, 아니면 false
System.out.println("isEmpty() : " + javamariaDB.isEmpty());
System.out.println("isEmpty() : " + "abc".isEmpty());
System.out.println("isEmpty() : " + "".isEmpty());

split() : 특정 문자열을 기준으로 기존 문자열 분리
String emp1 = "100/홍길동/서울/영업부";
String emp2 = "200/유관순//총무부";
String emp3 = "300/이순신/경기도/";
String emp4 = "400/우왕우?마라도/";
위와 같은 데이터들을 특정 문자열을 기준으로 나눠보자.
split()을 활용해서 배열에 저장하기String[] empArr1 = emp1.split("/");
String[] empArr2 = emp2.split("/");
String[] empArr3 = emp3.split("/");
String[] empArr4 = emp4.split("[/?]"); // 이건 / 하고 ? 2개의 기준으로 split 한다.
System.out.println(Arrays.toString(empArr1));
System.out.println(Arrays.toString(empArr2));
System.out.println(Arrays.toString(empArr3));
System.out.println(Arrays.toString(empArr4));

String colors = "red, yellow, green, purple, blue";
StringTokenizer colorStringTokenizer = new StringTokenizer(colors, ", ");
while (colorStringTokenizer.hasMoreTokens()) {
// System.out.println(colorStringTokenizer.nextToken());
// nextToken은 한 번 저장하고 다음 커서로 이동하기 때문에 연달아 사용하고 싶으면 아래처럼 사용해야 한다.
String token = colorStringTokenizer.nextToken();
System.out.println(token);
}
"," 문자열 기준으로 토큰 단위로 저장한다.

아래와 같은 코드가 있을 때 어떻게 출력될까?
public class Application2 {
public static void main(String[] args) {
String str1 = "java";
String str2 = "java";
String str3 = new String("java");
String str4 = new String("java");
System.out.println("str1 == str2 : " + (str1 == str2));
System.out.println("str2 == str3 : " + (str2 == str3));
System.out.println("str3 == str4 : " + (str3 == str4));
}
}
나는 기존에 String 클래스는 == 비교 연산자로 하면 false가 나온다고 알고 있었기에 셋 다 false라고 생각했지만

str1 == str2 에서 주소값을 비교하는데 true? -> str1, str2 는 객체가 1개라는 뜻이다.
str1, str2, str3, str4 가 생긴다.str1, str2는 리터럴 문자열 형태로 받는 경우에 상수 풀 (constant pool)에 "java"라는 동일한 값의 인스턴스가 들어가고, 그 데이터에 대한 주소 값은 str1, str2가 얕은 복사와 같이 되는 것이다.new 연산자로 만든 str3, str4 는 각각 다른 주소값을 가진 다른 객체인 것이다.Application2
public class Application2 {
public static void main(String[] args) {
String str1 = "java";
String str2 = "java";
String str3 = new String("java");
String str4 = new String("java");
System.out.println("str1 == str2 : " + (str1 == str2)); // 주소값을 비교하는데 true? -> str1, str2 는 객체가 1개라는 뜻이다.
System.out.println("str2 == str3 : " + (str2 == str3));
System.out.println("str3 == str4 : " + (str3 == str4));
System.out.println("str1.equals(str3) : " + (str1.equals(str3)));
System.out.println("str1.hashCode() == str3.hashCode() : " + (str1.hashCode() == str3.hashCode()));
}
}

즉, 문자열을 비교하고 싶으면 equals() 를 쓰자.
문자열은 불변객체로 변화를 주면 항상 새로운 객체를 생성한다.
String str = "apple";
System.out.println(System.identityHashCode(str));
str += ", banana";
System.out.println(System.identityHashCode(str));
System.out.println("fruit : " + str);

이스케이프 문자 : 문자열 내에서 사용하는 특수기능을 위한 문자
\n : 개행\t : 탭\' : 작은 따옴표\" : 큰 따옴포\\ : 역슬래시 표기System.out.println("안녕하세요 \n저는 홍길동입니다.");
System.out.println("안녕하세요 \t저는 홍길동입니다.");
System.out.println("안녕하세요 저는 '홍길동'입니다.");
System.out.println("안녕하세요 저는 \"홍길동\"입니다.");
System.out.println("역슬래시(\\)입니다.");

/* %.2f : 소수점 둘째자리까지 실수를 표현하며 셋째자리에서 반올림 */
/* %d : 정수형에서 표현 */
System.out.printf("원주율은 %.2f입니다. 우린 %d로 하죠", 3.141592, 3);

byte b = Byte.valueOf("1");
short s = Short.valueOf("2");
int i = Integer.valueOf("4");
long l = Long.valueOf("8");
float f = Float.valueOf("4.0");
double d = Double.valueOf("8.0");
boolean isTrue = Boolean.valueOf("true");
char c = "abc".charAt(0); // Character가 제공하지 않아 String의 charAt() 사용
반대로 기본 자료형을 문자열로 바꾸기
public class Application3 {
public static void main(String[] args) {
String b = Byte.valueOf((byte)1).toString();
String s = Short.valueOf((short)2).toString();
String i = Integer.valueOf(4).toString();
String l = Long.valueOf(8L).toString();
String f = Float.valueOf(4.0f).toString();
String d = Double.valueOf(8.0).toString();
String isTrue = Boolean.valueOf(true).toString();
String ch = Character.valueOf('a').toString();
/* 기본 자료형을 문자열로 바꿀 때는 간단히 ""을 더해준다 */
String floatString = 4.0f + "";
}
}