자바에서는 문자열을 저장하기 위해 String 타입을 제공한다.
String 타입은 기본 타입이 아닌 참조 타입이다.
String 타입에 값을 저장할 때는 쌍따움표("문자열") 사이에 문자열을 입력하여 대입한다.
String var1 = "A";
String var2 = "홍길동";
문자열 내부에 역슬래쉬(\)가 붙은 문자를 사용할 수 있는데 이를 이스케이프 문자라고 한다.
이스케이프 문자 | |
\" | " 문자를 포함 |
\' | ' 문자를 포함 |
\\ | \ 문자를 포함 |
\u16진수 | 16진수 유니코드에 해당하는 문자 포함 |
\t | 출력 시 탭만큼 띄움 |
\n | 출력 시 줄바꿈(라인피드) |
\r | 출력 시 캐리지 리턴 |
문자열을 기본 타입으로 변환
프로그램에서 문자열을 숫자 타입으로 변환하는 경우가 많이 발생한다.
문자열을 기본 타입으로 변환하는 방법은 다음과 같다
변환타입 | 사용 예 |
String -> byte | String str = "10"; byte value = Byte.parseByte(str); |
String -> short | String str = "200"; short value = Short.parseShort(str); |
String -> int | String str = "300000"; int value = Integer.parseInt(str); |
String -> long | String str = "4000000000"; long value = Long.parseLong(str); |
String -> float | String str = "12.345"; float value = Float.parseFloat(str); |
String -> double | String str = "12.345"; double value = Double.parseDouble(str); |
String - > boolean | String str = "true"; boolean value = Boolean.parseBoolean(str); |
반대로 기본 타입을 문자열로 변경화는 경우에는 String.valueOf()메소드를 이용한다.
String str = String.valueOf(기본타입값);
리터럴 문자열과 new 연산자 (타입 비교 vs 값 비교)
String a = "abc";
String b = new String("abc");
String c = "abc";
System.out.println(a==b); // false
System.out.println(a.equals(b)); // true
System.out.println(a==c); // true
System.out.println(a.equals(c)); // true
System.out.println(b==c); // false
System.out.println(b.equals(c)); // true
1. 자바 스트링 풀
자바 스트링 풀은 JVM에 의해 스트링이 저장되는 특별한 메모리 영역 이다.
2. String Interning
Java에서 문자열의 불변성 덕분에 JVM은 풀에 각 리터럴 문자열의 복사본을 하나만 저장 하여 문자열에 할당된 메모리 양을 최적화할 수 있다. 이 과정을 interning이라고 한다.
String 변수를 만들고 값을 할당하면 JVM은 풀에서 동일한 값의 String을 검색한다.
발견되면 Java 컴파일러는 추가 메모리를 할당하지 않고 단순히 메모리 주소에 대한 참조를 반환한다.
찾을 수 없으면 풀에 추가되고(interned) 해당 참조가 반환된다.
위의 경우 a에 사용된 메모리 주소를 c에서도 동일하게 이용하게 되어 a==b 는 true 가 된다.
3. 생성자를 사용하여 할당된 문자열
new 연산자를 통해 문자열을 생성하면 Java 컴파일러는 새 객체를 생성하고 JVM용으로 예약된 힙 공간에 저장한다.
이와 같이 생성된 모든 문자열은 고유한 주소를 가진 다른 메모리 영역을 가리킨다.
b의 경우와 같이 new 연산자로 문자열을 생성한 경우 유일한 객체가 된다.
a==b, b==c 결과는 flase 가 된다.
equals
equals는 두개의 문자열이 동일한지를 비교하여 결과값을 리턴한다.
위의 예제에서 a.equals(b), a.equals(c) 는 "abc"라는 문자열 값이 동일한 값을 가지고 있으므로 true 가 된다.
indexOf
indexOf는 문자열에서 특정 문자열이 시작되는 위치(인덱스)를 리턴한다.
문자열 중 "Java"라는 문자열이 시작되는 위치를 알고 싶은 경우 indexOf를 다음과 같이 사용할 수 있다.
String a = "Hello Java";
System.out.println(a.indexOf("Java")); // 6 출력
"Hello Java" 라는 문자열에서 "Java"라는 문자열은 일곱번째 문자('J')부터 시작이다. 결과값이 7이 아닌 6으로 나온 이유는 자바는 숫자를 0부터 세기 때문이다.
contains
contains는 문자열에서 특정 문자열이 포함되어 있는지의 여부를 리턴한다.
String a = "Hello Java";
System.out.println(a.contains("Java")); // true 출력
charAt
charAt은 문자열에서 특정 위치의 문자(char)를 리턴한다.
"Hello Java" 문자열에서 "J"라는 문자는 6번째 인덱스에 위치한 문자이다. 6이라는 숫자로 "J"라는 문자를 얻기 위해서는 다음과 같이 charAt을 사용한다.
String a = "Hello Java";
System.out.println(a.charAt(6)); // "J" 출력
replaceAll
replaceAll은 문자열 중 특정 문자열을 다른 문자열로 바꾸고자 할 때 사용한다.
String a = "Hello Java";
System.out.println(a.replaceAll("Java", "World")); // Hello World 출력
substring
substring은 문자열 중 특정 부분을 뽑아낼 경우에 사용한다.
String a = "Hello Java";
System.out.println(a.substring(0, 4)); // Hell 출력
toUpperCase
toUpperCase는 문자열을 모두 대문자로 변경할 때 사용한다. (모두 소문자로 변경할때는 toLowerCase를 사용한다.)
String a = "Hello Java";
System.out.println(a.toUpperCase()); // HELLO JAVA 출력
split
split 메서드는 문자열을 특정 구분자로 나누어 문자열 배열로 리턴하는 메서드이다.
String a = "a:b:c:d";
String[] result = a.split(":"); // result는 {"a", "b", "c", "d"}
'Java > Java Basic' 카테고리의 다른 글
콘솔로 변수값 출력 - print(), println(), printf() (0) | 2023.02.24 |
---|---|
타입 변환 (0) | 2023.02.22 |
변수 및 기본 타입 (0) | 2023.02.22 |
Java 입문 (0) | 2023.02.21 |