이번 포스팅에서는 Java에서 제공하는 문자열 관련
기능에 대해 적어보았다.
문자열
- 문자열은 기본자료형이 아닌 참조자료형이다.
- Java에는 문자열을 받아주는 클래스가 3종 있다.
String | 한 번 생성된 다음 변하지 않는 문자열에 사용된다. |
String Buffer | 계속하여 변할 수 있는 문자열에 사용한다. 동기화에 적용. |
String Builder | 계속하여 변할 수 있는 문자열에 사용한다. 비동기화에 적용. |
- 변하는 문자열을 다룰 때에는 String Buffer또는 Builder을 사용하는 것이 좋다. (성능이 더 빠르기 때문)
String
- String형은 변수에 값을 저장하지 않고 주소값을 저장한다.
- 문자열의 값은 Heap영역에 저장된다.
String str = new String();
char[] chars = {'A','B','C','D','E','F'};
String 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배열 안의 숫자를 아스키코드 값으로 받아 문자로 입력하는 것이 가능하다.
String Buffer
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
문자열 비교 : .equals( ) / equalsIgnoreCase( ) / .startsWith( ) / .endsWith( ) / .compareTo( ) / .contains( )
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");
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
- contains( )
: "홍"이 포함된 값을 출력한다.
String[] names = {"강감찬", "박명수", "홍길동","윤길동","홍마떡","홍익점"};
System.out.println("< 홍이 포함된 사람 >");
for(String name : names) {
if(name.contains("홍")) {
System.out.print(name+" ");
}
}System.out.println();
/*
< 홍이 포함된 사람 >
홍길동 홍마떡 홍익점
*/
'Java' 카테고리의 다른 글
[Java 기초 공부 07] 자바 객체지향 문법 (0) | 2021.03.29 |
---|---|
[Java 기초 공부 06] 문자열02 (0) | 2021.03.22 |
[Java 기초 공부 04] 연산자 (0) | 2021.03.20 |
[Java 기초 공부 03] 자바 자료형과 형변환 (0) | 2021.03.19 |
[Java 기초 공부 02] 자바 기본 명령어 (0) | 2021.03.18 |