Java05_문자열01
문자열
- 문자열은 기본자료형이 아닌 참조자료형이다.
- Java에는 문자열을 받아주는 클래스가 3종 있다.
클래스명 | 설명 |
---|---|
String | 한 번 생성된 다음 변하지 않는 문자열에 사용된다. |
StringBuffer | 계속하여 변할 수 있는 문자열에 사용한다. 동기화에 적용. |
StringBuilder | 계속하여 변할 수 있는 문자열에 사용한다. 비동기화에 적용. |
- 변하는 문자열을 다룰 때에는 String Buffer또는 Builder을 사용하는 것이 좋다. (성능이 더 빠르기 때문)
String
- String형은 변수에 값을 저장하지 않고 주소값을 저장한다.
- 문자열의 값은 Heap영역에 저장된다.
String str = new String();
char[] chars = {'A','B','C','D','E','F'};
str2 = new String(chars);
String str3 = new String(chars, 1,3); // 범위지정도 가능.
System.out.println("str : ["+ str +"]");
System.out.println("str : ["+ str2 +"]"); // ABCDEF
System.out.println("str : ["+ str3 +"]"); // BCD
- String은 배열을 인수로 받을 수도 있으며, 범위 지정도 가능하다.
byte[] bytes = {97,98,99,100,101};
String str4 = new String(bytes);
System.out.println("str : ["+ str4 +"]"); // ABCDE
- String은 byte배열 안의 숫자를 아스키코드 값으로 받아 문자로 입력하는 것이 가능하다.
StringBuffer
StringBuffer sb = new StringBuffer(); // 비어있는 문자열을 생성한다.
for(int i = 0; i<10; i++){
sb.append(i);
}
System.out.println(sb); // 0123456789
- 위의 식에서 StringBuffer를 String으로 바꾼다면 성능이 훨씬 느리다. (약 3배정도?)
Java에서 제공하는 문자열 관련 기능들
문자열길이
- length( )
String str = "Hello";
int length = str.length();
System.out.println(length); // 5
문자열 추출
- charAt( )
- getChars( )
String str = "Hello";
char[] chars = new char[str.length()];
for(int i = 0; i<str.length(); i++) {
chars[i] = str.charAt(i);
}
System.out.println(chars); // Hello
String str = "Hello";
char[] chars = new char[str.length()];
str.getChars(0, str.length(), chars, 0);
// str 배열의 0번지에서 ~str.length()-1번지(끝)까지를 chars배열 0부터 채워준다.
System.out.println(Arrays.toString(chars)); // Hello
문자열 비교
String str = new String("Hello");
String str2 = new String("hello"); // 주소만 비교함
if(str == str2) {
System.out.println("Str == str2");
}else {
System.out.println("Str != str2");
}
-
문자열을 위와 같이 if문으로 비교할 경우 주소 값만 비교하게 된다.
-
equals( )
- 문자열 str과 str2가 같은지 비교한다 같으면 true, 다르면 false반환.
String str = new String("Hello");
String str2 = new String("Hello");
boolean bool = str.equals(str);
if (bool) {
System.out.println("equals() : str == str2");
} else {
System.out.println("equals() : str != str2");
}
// equals() : str == str2
- equalIgnoreCase( )
- 문자열 str과 str2가 같은지 비교한다. (같으면 true, 다르면 false / 대소문자를 무시)
String str = new String("Hello");
String str2 = new String("HELLO");
boolean bool = str.equalsIgnoreCase(str2);
if (bool) {
System.out.println("equalsIgnoreCase() : str == str2");
} else {
System.out.println("equalsIgnoreCase() : str != str2");
}
// equalsIgnoreCase() : str == str2
- startsWith( )
- 문자열이 “hello”로 시작하면 true, 아니면 false
String str = "hello!!!";
String str2 = "hello world!";
String sub = "hello"; //찾고싶은 문자열
boolean bool = str.startsWith(sub);
if (bool) {
System.out.println("[" + str + "]은 ["+sub+"]문자열로 시작한다.");
} else {
System.out.println("[" + str + "]은 ["+sub+"]문자열로 시작하지 않는다.");
}
//[hello!!!]은 [hello]문자열로 시작한다.
- endsWith( )
- 문자열이 “.txt”로 끝나면 true, 아니면 false
String str = "hello.txt";
boolean bool = str.endsWith(".txt");
if (bool) {
System.out.println("[" + str + "]은 텍스트파일입니다.");
} else {
System.out.println("[" + str + "]은 텍스트파일이 아니다.");
}
//[hello.txt]은 텍스트파일입니다.
- compareTo( )
- str이 str2보다 크면 양수, 같으면 0, 작으면 음수 반환 ( 길이비교가 아닌 유니코드를 비교한다.)
String str= "boat";
String str2 = "board";
int compare = str.compareTo(str2);
if(compare == 0) {
System.out.println(str+ "==" + str2);
} else if(compare<0) {
System.out.println(str+ "<" + str2);
} else {
System.out.println(str+ ">" + str2);
}
//boat>board
- comtains( )
- “홍”이 포함된 값을 출력한다.
String[] names = {"강감찬", "박명수", "홍길동","윤길동","홍마떡","홍익점"};
System.out.println("< 홍이 포함된 사람 >");
for(String name : names) {
if(name.contains("홍")) {
System.out.print(name+" ");
}
} System.out.println();
/*
< 홍이 포함된 사람 >
홍길동 홍마떡 홍익점
*/