- 패키지 :
java.lang
- 하나의 문자열을 표현할 때 사용
- byte[], char[], String, StringBuilder 등 여러 매개변수를 이용해서 생성
문자열 "hello"를 만들기
1. String str = "hello";
2. char[] data = {'h', 'e', 'l', 'l', 'o'};
String str = new String(data);
3. String str = new String("hello");
4. byte[] bytes = "hello".getBytes();
String str = new String(bytes);
5. StringBuilder sb = new StringBuilder();
sb.append("hello");
String str = new String(sb);
문자열을 동등 비교할 때 ==로 할 경우에는 반환값이 이상하게 나온다.
str1과 str2는 값을 저장한 주소가 같아서 true가 반환된다.
str3와 str4는 저장값이 동일하지만, 주소가 달라서 false가 반환된다.
String str1 = "hello";
String str2 = "hello";
System.out.println(str1 == str2); // true
JVM에 의해서 생성된 문자열 "hello"를 공유하므로 true
반환
/*
|---------|
str1 | 0x123 |
|---------|
str2 | 0x123 |
|---------|
| "hello" | 0x123
|---------|
*/
- 개발자 명령에 의해서 힙(Heap) 영역에 새로운 문자열이 생성된다.
- 항상 새로 생성하므로 동일한 문자열도 여러 개 생성될 수 있다
String str3 = new String("hi");
String str4 = new String("hi");
System.out.println(str3 == str4); // false
서로 다른 두 개의 "hello"가 생성되므로 false
반환
/*
|---------|
str3 | 0x123 |
|---------|
str4 | 0x456 |
|---------|
| "hello" | 0x123
|---------|
| "hello" | 0x456
|---------|
*/
문자열 동등 비교할 떄는 equals 메소드를 사용해야 한다.
equals 메소드를 호출해서 문자열 동등 비교를 하게 되면 ==로 했을 때보다 정확하게 값이 반환 되는걸 볼 수 있다.
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hi");
String str4 = new String("hi");
boolean result1 = str1.equals(str2);
boolean result2 = str3.equals(str4);
System.out.println(result1); // true
System.out.println(result2); // true
if(str1.equals(str2)) {
System.out.println("str1과 str2는 같다");
} else {
System.out.println("str1과 str2는 다르다");
} // str1과 str2는 같다
// 가급적이면 부정!은 사용하지 않는다 (잘보이지 않고, 흐름이 어색하다)
if(!str3.equals(str4)) {
System.out.println("str3과 str4는 다르다");
} else {
System.out.println("str3과 str4는 같다");
} // str3과 str4는 같다
- equalsIgnoreCase();
String str5 = "Hello World";
String str6 = "hELLO wORLD";
boolean result3 = str5.equalsIgnoreCase(str6);
// Upper Case, Lower Case
System.out.println(result3); // true
- length();
String name = "우영우";
int length = name.length();
System.out.println("글자수 : " + length); // 글자수 : 3
- charAt(위치숫자);
- 인덱스 (Index)
배열의 요소마다 붙여진 일련번호로 각 요소를 구별할 수 있다.
쉽게 말하면 글자마다 부여된 정수값이며, 0부터 시작한다.
범위 :0 ~ (배열길이 -1)
String name = "우영우";
System.out.println(name.charAt(0)); // 우
System.out.println(name.charAt(1)); // 영
System.out.println(name.charAt(2)); // 우
- substring(begin) : 인덱스 begin(포함)부터 끝까지 반환
- substring(begin, end) : 인덱스 begin(포함)부터 인덱스 end(불포함)까지 반환
String name = "우영우";
System.out.println(name.substring(0, 1)); // 우
System.out.println(name.substring(1)); // 영우
- indexOf
- 첫 번째 문자열의 인덱스를 반환
- 문자열이 없는 경우 -1을 반환- lastIndexOf
- 마지막 문자열의 인덱스를 반환
- 문자열이 없는 경우 -1을 반환
String name = "우영우";
int idx1 = name.indexOf("우");
int idx2 = name.indexOf("영");
int idx3 = name.lastIndexOf("우");
int idx4 = name.lastIndexOf("영");
System.out.println(idx1); // 0
System.out.println(idx2); // 1
System.out.println(idx3); // 2
System.out.println(idx4); // 1
- startsWith(문자열)
String name = "우영우";
if(name.startsWith("민")) {
System.out.println("민씨입니다.");
} else {
System.out.println("민씨가 아닙니다.");
} // 민씨가 아닙니다.
- endWith(문자열)
String filename = "image.jpg"; // jpg, png로 끝나면 이미지로 가정
if(filename.endsWith("jpg") || filename.endsWith("png")) {
System.out.println("이미지입니다.");
} else {
System.out.println("이미지가 아닙니다.");
} // 이미지입니다.
- contains(특정패턴)
String email = "jw_17@naver.com";
if(email.contains("@") && email.contains(".")) {
System.out.println("이메일입니다.");
} else {
System.out.println("이메일이 아닙니다.");
} // 이메일입니다.
- trim()
String message = " 안녕 하세요 ";
System.out.println(message.trim()); // 안녕 하세요
System.out.println(message.trim().length()); // 7
- toUpperCase() : 대문자로 변환하기
- toLowerCase() : 소문자로 변환하기
String source = "best of best";
System.out.println(source.toUpperCase()); // BEST OF BEST
System.out.println(source.toLowerCase()); // best of best
- replace(old, new) : old를 new로 변환하기
- replaceAll(regex, reply) 메소드는 특정 문자열을 찾아서 변환하는 것이 아니다.
String source = "best of best";
String replaced = source.replace("best", "worst");
System.out.println(source); // best of best
System.out.println(replaced); // worst of worst
String ip = "192.168.101.91";
String replacedIp = ip.replaceAll(".", "_"); // 192_168_101_91 를 기대
System.out.println(replacedIp); // ______________
String replacedIp2 = ip.replaceAll("\.", "_");
System.out.println(replacedIp); // 192_168_101_91
"."은 모든것을 의미한다.
백슬래시를 앞에 붙여주거나 대괄호로 감싸서 해결할 수 있다.
- isEmpty() : 공백도 문자열로 인식한다.
String id = " ";
if(id.isEmpty()) {
System.out.println("빈 문자열");
} else {
System.out.println("빈 문자열 아님");
} // 빈 문자열 아님
빈 문자열로 인식하려고 할 때는 trim( )을 같이 사용해주면 된다.
isBlank( )는 공백을 무시한다. 그래서 trim( )을 사용하지 않아도 되지만, JDK 11에 출시된 신기술이라 사용을 지양하는게 좋다.
String id = " ";
if(id.trim().isEmpty()) {
System.out.println("빈 문자열");
} else {
System.out.println("빈 문자열 아님");
} // 빈 문자열
파일이름을 파일명과 확장자로 분리하시오
jpg, git, png 이미지인 경우에만 작업을 진행
String fullName = "apple.jpg";
String fillName = ""; // apple
String extName = ""; // jpg
int idxOfDot = fullName.lastIndexOf("."); // .을 기준으로 apple과 jpg 분리
fillName = fullName.substring(0, idxOfDot);
extName = fullName.substring(idxOfDot+1);
System.out.println(fillName); // apple
System.out.println(extName); // jpg
문자열 "abc12345def67890ghijk"에서 아라비아 숫자 1234567890을 제외하고 한 글자씩 화면에 출력하시오.
String str = "abc12345def67890ghijk";
for(int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if(ch >= '0' && ch <= '9') {
continue;
}
System.out.println(ch);
} /* a
b
c
d
e
f
g
h
i
j
k */