본문 바로가기

Java

[Java 기초 공부 05] 문자열01

이번 포스팅에서는 Java에서 제공하는 문자열 관련

기능에 대해 적어보았다.

 

 

문자열

-  문자열은 기본자료형이 아닌 참조자료형이다.

- Java에는 문자열을 받아주는 클래스가 3종 있다.

String 한 번 생성된 다음 변하지 않는 문자열에 사용된다.
String Buffer 계속하여 변할 수 있는 문자열에 사용한다. 동기화에 적용.
String Builder 계속하여 변할 수 있는 문자열에 사용한다. 비동기화에 적용.

- 변하는 문자열을 다룰 때에는 String Buffer또는 Builder을 사용하는 것이 좋다. (성능이 더 빠르기 때문)

 

String

이해를 돕기 위한 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();

/*
<  홍이 포함된 사람 >
홍길동 홍마떡 홍익점 
*/