
- 문자열 리터럴 (String Literal) 사용 (권장): Heap 영역의 String constant pool에 저장, 공유 가능
 - 문자열 생성자 (String Constructor) 사용: Heap 영역에 저장, 공유 불가
 
1) 문자열 리터럴(String Literal) 사용

package lesson08;
public class Ex01 {
	public static void main(String[] args) {
    	String str1 = "Hello";
		String str2 = "Hello";
		String str3 = "Class";
	}
}
2) 문자열 생성자(String Constructor) 사용

package lesson08;
public class Ex01 {
	public static void main(String[] args) {
    	String str1 = new String("John");
		String str2 = new String("Doe");
	}
}
주의: 변수, 참조값, 실제 문자열 데이터가 저장되는 곳
- 변수(str1, str2, str3)와 해당 변수가 참조하는 문자열 객체의 참조값은 stack에 저장된다.
 - 실제 문자열 데이터는 heap에 저장된다.
 
equals사용
equals로 비교한다. ==로 비교하면 주소값 비교이므로 결과가 의도와 다르게 나올 수 있다.
package lesson08;
public class Ex01 {
	public static void main(String[] args) {
		String a = "안녕";
		String b = new String("안녕");
		
		System.out.println(a == b); // false
		System.out.println(a.equals(b)); // true
	}
}
1) 숫자 -> String
- String.valueOf() 메소드 사용(권장)
 +연산자 사용
package lesson08;
public class Ex02 {
	public static void main(String[] args) {
		int number1 = 3;
		
		// String.valueOf() 메소드 사용(권장)
		String str1 = String.valueOf(number1);
		
		// + 연산자 사용
		String str2 = number1 + "";
	}
}
2) String -> 숫자
- Integer.valueOf() 메소드 사용
 - Integer.parseInt() 메소드 사용
 
package lesson08;
public class Ex02 {
	public static void main(String[] args) {
		String str1 = "5";
		
		// Integer.valueOf() 메소드 사용
		int number1 = Integer.valueOf(str1);
		
		// Integer.parseInt() 메소드 사용
		int number2 = Integer.parseInt(str1);
	}
}
| 메소드명 | 설명 | 반환값 | 
|---|---|---|
| charAt(index) | 문자열의 index번째 문자(char)를 얻는다. | char | 
| contains(특정 문자열) | 특정 문자열이 포함되어 있는지 확인 | boolean | 
| startsWith(특정 문자열) | 특정 문자열로 시작하는지 확인 | boolean | 
| endsWith(특정 문자열) | 특정 문자열로 끝나는지 확인 | boolean | 
| length() | 문자열의 길이 | int 알파벳의 개수  | 
| replace(수정할 문자열, 새로운 문자열) | 문자열 중 일부를 교체 | String 바뀐 문자열 전체  | 
| split(특정 구분자) | 구분자를 기준으로 문자열을 잘라서 배열에 넣는다. | String[] | 
| substring(index) | 문자열을 index번째부터 맨 뒤까지 자른다. | String 잘린 문자열  | 
| substring(s_index, e_index) | s_index번째부터 e_index - 1번째까지 자른다. | String 잘린 문자열  | 
- next(): 공백 문자 전까지의 읽음, 한 단어
 - nextLine(): 개행 문자 전까지 읽음, 한 줄
 
1) next()
package lesson08;
import java.util.Scanner;
public class Ex04 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		System.out.print("문자열을 입력하세요: ");
		String word = scan.next();
		System.out.println(word);
		scan.close();
	}
}

2) nextLine()
package lesson08;
import java.util.Scanner;
public class Ex04 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		System.out.print("문자열을 입력하세요: ");
		String line = scan.nextLine();
		System.out.println(line);
		scan.close();
	}
}

next(), nextLine()를 연달아 사용 시, 사용자 입력 버퍼에서 next()가 읽고 남아있는 개행 문자를 nextLine()이 자동으로 읽으므로, nextLine()의 입력을 받을 수 없다.
package lesson08;
import java.util.Scanner;
public class Ex04 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		System.out.print("문자열을 입력하세요: ");
		String word = scan.next();
		System.out.println(word);
		
		System.out.print("문자열을 입력하세요: ");
		String line = scan.nextLine();
		System.out.println(line);
		scan.close();
	}
}

해결
- next()와 nextLine() 사이에 개행 문자를 소비하는 코드를 삽입한다.
 - nextLine()만 사용한다.
 
1) next()와 nextLine() 사이에 개행 문자를 소비하는 코드를 삽입한다.
package lesson08;
import java.util.Scanner;
public class Ex04 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		System.out.print("문자열을 입력하세요: ");
		String word = scan.next();
		System.out.println(word);
		
		scan.nextLine(); // 개행 문자 소비
		
		System.out.print("문자열을 입력하세요: ");
		String line = scan.nextLine();
		System.out.println(line);
		scan.close();
	}
}

2) nextLine()만 사용한다.
package lesson08;
import java.util.Scanner;
public class Ex04 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		System.out.print("단어를 입력하세요: ");
		String word = scan.nextLine();
		System.out.println(word);
		
		System.out.print("문자열을 입력하세요: ");
		String line = scan.nextLine();
		System.out.println(line);
		scan.close();
	}
}

🔗 https://www.geeksforgeeks.org/string-constant-pool-in-java
🔗 https://www.javatpoint.com/string-pool-in-java
🔗 https://deveric.tistory.com/123