Java05_문자열01

2 minute read



문자열

  • 문자열은 기본자료형이 아닌 참조자료형이다.
  • Java에는 문자열을 받아주는 클래스가 3종 있다.
클래스명 설명
String 한 번 생성된 다음 변하지 않는 문자열에 사용된다.
StringBuffer 계속하여 변할 수 있는 문자열에 사용한다. 동기화에 적용.
StringBuilder 계속하여 변할 수 있는 문자열에 사용한다. 비동기화에 적용.
  • 변하는 문자열을 다룰 때에는 String Buffer또는 Builder을 사용하는 것이 좋다. (성능이 더 빠르기 때문)





String

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(); 

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