리터럴 사용하여 직접 문자열 생성하거나 new 연산자 사용한 인스턴스 생성 시 생성자에 문자열 전달하여 생성
-> 리터럴 사용 시 해당 문자열 존재 여부 상수 풀에서 검사 후 중복되는 문자열 없으면 생성, 중복일 경우 주소값 리턴하므로 메모리 공간 낭비 줄어듦
-> new 연산자 사용 시 문자열 중복 여부와 무관하게 문자열 객체 생성
equals()
메서드 사용문자열 생성하면 String 클래스 내부적으로 char[]로 관리됨
-> 개발자의 편의 위해 별도의 String 클래스 만들어서 제공
-> 배열 형태이므로 배열 인덱스와 동일한 인덱스 번호 사용
문자열 수정, 검색, 치환 등 다양한 작업 수행하는 메서드 제공
String 객체는 불변 객체이므로 원본 문자열 수정X, 각종 작업 수행할 경우 수정된 데이터를 문자열로 새로 생성
-> 문자열 수정이 빈번할 경우 메모리 낭비 심하므로 StringBuilder
또는 StringBuffer
클래스 활용
toString()
: 저장된 문자열 리턴
⭐ 입력
String s1 = "Java Programming";
System.out.println(s1.toString());
System.out.println(s1); // toString() 메서드는 출력문에서 생략 가능함
📌 출력
Java Programming
Java Programming
length()
: 문자열 길이(문자열을 분리해놓은 배열 크기)리턴
- 공백도 길이에 포함됨
⭐ 입력
System.out.println(s1.length());
📌 출력
16
equals()
: 문자열 비교(대소문자 구별)
⭐ 입력
System.out.println(s1.equals("JAVA PROGRAMMING"));
📌 출력
false
equals()
: 문자열 비교(대소문자 구별)
⭐ 입력
System.out.println(s1.equals("JAVA PROGRAMMING"));
📌 출력
false
equalsIgnoreCase()
: 문자열 비교(대소문자 구별X)
⭐ 입력
System.out.println(s1.equals("JAVA PROGRAMMING"));
📌 출력
true
equalsIgnoreCase()
: 문자열 비교(대소문자 구별X)
⭐ 입력
System.out.println(s1.equals("JAVA PROGRAMMING"));
📌 출력
true
charAt()
: 특정 인덱스에 위치한 문자 1개 리턴
⭐ 입력
System.out.println(s1.charAt(5));
// 인덱스는 0번부터 시작함
📌 출력
P
< 특정 범위 문자열 추출>
subString(int beginIndex)
: 시작 인덱스부터 끝까지 문자열 추출
subString(int beginInex, int endIndex)
: 시작 인덱스 ~ 끝 인덱스 -1 까지 추출
⭐ 입력
System.out.println(s1.charAt(5));
System.out.println(s1.substring(5, 11));
📌 출력
Programming
Progra
concat()
: 문자열 결합
- 연결 연산자보다 연산 속도 빠름
⭐ 입력
System.out.println(s1.concat("!"));
📌 출력
Java Programming!
indexOf()
: 특정 문자 또는 문자열의 인덱스 리턴
- 문자열의 앞쪽부터 탐색
- 탐색할 문자 또는 문자열 존재하지 않을 경우 -1 리턴
lastIndexOf()
: 문자열 탐색 시 뒤에서부터 탐색하여 인덱스 리턴
⭐ 입력
System.out.println(s1.indexOf('a'));
System.out.println(s1.indexOf('x'));
System.out.println(s1.indexOf("Program"));
System.out.println( s1.lastIndexOf('a'));
📌 출력
1 // 1번 인덱스에 위치
-1 // 없어서 -1 리턴
5 // 시직인덱스인 5 리턴
10 // 뒤에서부터 탐색하므로 인덱스 10 리턴됨
replace()
: 특정 문자 또는 문자열 치환
- 동일한 문자 또는 문자열 존재할 경우 모두 치환
⭐ 입력
System.out.println(s1.replace('a', '@'));
// 'a' 대신 문자열 "a"도 가능
📌 출력
J@v@ Progr@mming
toUpperCase()
: 알파벳 대문자 변경
toLowerCase()
: 알파벳 소문자 변경
⭐ 입력
System.out.println(s1.toUpperCase());
System.out.println(s1.toLowerCase());
📌 출력
JAVA PROGRAMMING
java programming
trim()
: 문자열 앞뒤 불필요한 공백 제거
⭐ 입력
String s2 = " 김 경민 ";
System.out.println("이름은 " + s2.trim() + "입니다.");
📌 출력
이름은 김 경민입니다.
// 안타깝게도 문자열 사이의 공백은 안 지워줌...
contains()
: 문자열 포함 여부
⭐ 입력
System.out.println(s2.contains("김"));
System.out.println(s2.contains("이"));
📌 출력
true
false
split()
: 특정 기준으로 문자열 분리
⭐ 입력
String s3 = "자바/JSP/안드로이드";
String[] subjectArr = s3.split("/");
for(int i = 0; i < subjectArr.length; i++) {
System.out.println(subjectArr[i]);
}
📌 출력
자바
JSP
안드로이드
.
기호를 구분자로 지정하는 경우 모든 문자가 분리 기준이 되어 제거됨
->\\.
를 사용함String s4 = "안녕하세요. 자바프로그래밍입니다." String[] subjectArr = s3.split("\\.");
format()
: 특정 문자열을 형식 지정문자와 결합하여 형식을 갖춘 문자열로 리턴
⭐ 입력
String name = "홍길동";
int age = 20;
double height = 180.5;
String formatStr = String.format("이름 : %s, 나이 : %d, 키 : %.1f\n", name, age, height);
System.out.println("생성된 회원 정보는 " + formatStr);
📌 출력
생성된 회원 정보는 이름 : 홍길동, 나이 : 20, 키 : 180.5
toCharArray()
: 문자열을 char[] 배열로 리턴
⭐ 입력
String s5 = "admin123!";
char[] chArr = s5.toCharArray();
for(int i = 0; i < chArr.length; i++) {
System.out.println(chArr[i]);
}
System.out.println("==================");
System.out.println(Arrays.toString(chArr));
📌 출력
a
d
m
i
n
1
2
3
4
!
==================
[a, d, m, i, n, 1, 2, 3, 4, !]
String 클래스는 한번 생성되면 내부의 문자열 변경X
String 클래스 사용하여 문자열 계속 연결하거나 변경하는 프로그램 사용 시 메모리 낭비 심함
StringBuffer
와 StringBuilder
클래스 활용하여 문자열 변경하거나 연결
-> 두 클래스 크게 차이X
문자열의 안전한 변경 보장
스레드 동작하는 멀티프레스 환경 프로그램에 사용
실행 속도가 StringBuffer
에 비해 더 빠름
스레드 동작하지 않는 프로그램에 사용
결합 연산자를 사용해서 문자열을 변경했을 때
String str = new String("Java");
System.out.println(System.identityHashCode(str));
// str 문자열의 주소 : 41903949
str = str + " and";
System.out.println(System.identityHashCode(str));
// 연결 후 str 문자열의 주소 : 488970385
// 주소 바뀌었음 -> 메모리 영역 새로 생성됨
str = str + " android";
System.out.println(System.identityHashCode(str));
// 연결 후 str 문자열의 주소 : 1209271652
// 또 바뀜
StringBuilder 사용해서 문자열을 변경했을 때
StringBuilder buffer = new StringBuilder(str);
System.out.println(System.identityHashCode(str));
// str 문자열의 주소 : 41903949
buffer.append(" and");
System.out.println(System.identityHashCode(str));
// str 문자열의 주소 : 41903949
// 바뀌지 않고 그대로임 -> 메모리 영역 그대로
buffer.append(" android");
System.out.println(System.identityHashCode(str));
// str 문자열의 주소 : 41903949
// 또 그대로
tr = buffer.toString();
System.out.println(str);
System.out.println(System.identityHashCode(str));
// str 문자열의 주소 : 93122545
// 이제 바뀌었음!