- 문자열 리터럴 (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