본문 바로가기
Java/Java Basic

문자열 타입 (String)

by 키모형 2023. 2. 22.

자바에서는 문자열을 저장하기 위해 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