JAVA CLASS : String, StringBuffer, StringBuilder
<String, StringBuffer, StringBuilder >
* 문자열을 출력해주는 클래스
* String 클래스 :
- immutable 클래스(내용이 바뀌지 않는 클래스)
* StringBuffer 클래스
- mutable 클래스(내용을 바꿀 수 있는 클래스)
- Java 1.0 버전부터 사용하던 클래스
- 반드시 생성자를 사용해서 초기화해야함
- 문자열 리터럴(ex. "abc")로 초기화 불가능
- 속도가 느림
- Thread-safe: 쓰레드에 안전한 클래스
* StringBuilder
- Java 5 버전부터 사용하게 된 클래스
- 반드시 생성자를 사용해서 초기화
- 문자열 리터럴(ex. "abc")로 초기화 불가능
- 속도가 빠름
- Thread-safe: 쓰레드에 안전하지 않은 클래스
* 그 외에 모든 기능이 동일함(동일한 기능의 메소드들을 가지고 있음)
<프로그램 코드>
* StringMain01.java (String 클래스의 기본 사용)
package edu.java.string01; public class StringMain01 { public static void main(String[] agrs){ String str1 = "안녕하세요"; // literal로 초기화 System.out.println(str1); System.out.println("문자열 길이: " + str1.length());
String str2 = new String("안녕하세요"); // heap에 인스턴스 생성 System.out.println(str2);
if (str1 == str2){ System.out.println("같은 참조"); } else { System.out.println("다른 참조"); }
// String을 저장하는 참조 변수에는 문자열이 있는 주소값이 저장 // 비교연산자(==, !=)는 단순히 주소값만 비교 // -> 실제 문자열의 내용이 같더라도 '주소값이 다르다'라는 결과를 줄 수 있음 // 문자열의 내용이 같은지 비교하려면 equals() 메소드를 사용
if (str1.equals(str2)){ System.out.println("같은 참조"); } else { System.out.println("다른 참조"); }
// 문자열 literal은 먼저 같은 것이 있는지 검사하고 같은 문자열이 heap에 있으면 그대로 갖다 씀
} // end main() } // end class StringMain01 |
* 출력화면
안녕하세요 문자열 길이: 5 안녕하세요 다른 참조 같은 참조 |
* StringMain02.java (String 클래스의 생성자 호출)
package edu.java.string02; public class StringMain02 { public static void main(String[] args) { // String literal과 생성자 호출의 차이 // 생성자는 호출할 때마다 새로운 인스턴스가 생성됨. // -> 참조 변수(str1, str2)에는 다른 주소값이 저장됨 String str1 = new String("abc"); String str2 = new String("abc"); if (str1 == str2) { System.out.println("같은 참조"); } else { System.out.println("다른 참조"); }
// 문자열 리터럴을 사용해서 초기화하는 경우, // 이미 리터럴이 만들어져 있는 경우는 // 인스턴스를 새로 생성하지 않고, 기존의 인스턴스 재활용 // -> 참조 변수(str3, str4)은 같은 주소값이 저장 String str3 = "abc"; String str4 = "abc"; if (str3 == str4) { System.out.println("같은 참조"); } else { System.out.println("다른 참조"); } } // end main() } // end StringMain02 |
* 출력화면
다른 참조 같은 참조 |
* StringMain04.java (String 클래스의 메소드)
package edu.java.string04; public class StringMain04 { public static void main(String[] args) { // String 클래스의 메소드 // (API: Application Programming Interface)
// length(): 문자열의 길이를 리턴 String str1 = "abc"; String str2 = "안녕"; System.out.println(str1.length()); System.out.println(str2.length());
// equals(): 문자열의 내용을 비교 // Object 클래스의 equals() 메소드를 override함 System.out.println(str1.equals(str2)); System.out.println(); // equalsIgnoreCase() : 대소문자 구별 없이 비교 String str3 = "Hello"; String str4 = "hello"; System.out.println(str3.equals(str4)); System.out.println(str3.equalsIgnoreCase(str4));
System.out.println(); // charAt(int): 문자열 중에서 해당 인덱스의 문자 하나를 리턴 System.out.println(str3.charAt(1));
System.out.println(); // indexOf(): 해당 문자 또는 문자열이 몇번째 인덱스에 나오는지 리턴 // lastIndexOf(): 문자 또는 문자열이 가장 마지막으로 등장하는 인덱스 String str5 = "Hello, world!"; System.out.println(str5.indexOf('l')); System.out.println(str5.indexOf("world")); System.out.println(str5.lastIndexOf('l'));
System.out.println(); // startsWith(string): 특정 문자열로 시작하는지 확인하는 메소드 String str6 = "http://www.google.com"; System.out.println(str6.startsWith("http://"));
System.out.println(); // contains(string) : 특정 문자열을 포함하고 있는지 아닌지 확인 System.out.println(str6.contains("google"));
System.out.println(); // split() : 특정 구분자를 기준으로 배열 형태로 짤라줌 String str7 = "2017-01-05"; String[] result = str7.split("-"); for (String x : result) { System.out.println(x); }
String str8 = "04:44:44"; result = str8.split(":"); for (String x : result) { System.out.println(x); }
System.out.println(); String str9 = "2017-01-05 16:55:15"; result = str9.split("-|:| "); for (String x : result){ System.out.println(x); }
System.out.println(); // compareTo() // compareToIgnoreCase() String str10 = "abc"; String str11 = "Abc"; System.out.println(str10.compareTo(str11)); // 다른 부분의 유니코드 값의 차이를 리턴(str10 - str11) System.out.println(str10.compareToIgnoreCase(str11));
System.out.println(); // toUpperCase() : 대문자로 변경 // toLowerCase() : 소문자로 변경 String str12 = "Hello, Java!"; System.out.println(str12.toUpperCase()); System.out.println(str12.toLowerCase());
System.out.println(); // substring(begin, end): // begin 인덱스는 포함, end 인덱스는 포함되지 않음 System.out.println(str12.substring(1, 6));
System.out.println(); // concat(): 문자열을 이어주는 메소드 System.out.println(str12.concat("World!"));
} // end main() } // end class StringMain04 |
* 출력화면
3 2 false false true e 2 7 10 true true 2017 01 05 04 44 44 2017 01 05 16 55 15 32 0 HELLO, JAVA! hello, java! ello, Hello, Java!World! |
* StringMain05.java(문자열 삽입, 삭제 변경, 붙이기)
package edu.java.string05; public class StringMain05 { public static void main(String[] args) { // StringBuffer, StringBuilder 클래스 StringBuffer buff = new StringBuffer("abc"); // StringBuffer buffer = "abc"; // 컴파일 에러 // StringBuffer와 StringBuilder는 반드시 생성자를 사용해서 초기화(String과 다른점) // 문자열 리터럴로 초기화 할 수는 없음 System.out.println(buff); System.out.println(buff.hashCode()); // toString() 메소드가 override 되어서 문자열 내용만 출력(기존 String은 주소값이 출력됨)
// append(): 문자열을 덧붙이는 메소드 buff.append("def"); System.out.println(buff); // 주소값이 변하지 않고 문자 자체가 변하게 됨 System.out.println(buff.hashCode());
System.out.println(); String str = "abc"; System.out.println(str); System.out.println(str.hashCode()); str += "def"; System.out.println(str); System.out.println(str.hashCode());
System.out.println(); StringBuffer buff2 = new StringBuffer("ABCDEF"); // 문자열 삽입 buff2.insert(2, "abc"); System.out.println(buff2);
StringBuffer buff3 = new StringBuffer("ABCDEF"); // 문자열 삭제 buff3.delete(2, 4); System.out.println(buff3);
System.out.println(); StringBuffer buff4 = new StringBuffer("Hello, Java!"); // 문자열 변경 buff4.replace(0, 5, "안녕하세요"); System.out.println(buff4);
} // end main() } // end class StringMain05 |
* 출력화면
abc 366712642 abcdef 366712642 abc 96354 abcdef -1424385949 ABabcCDEF ABEF 안녕하세요, Java!
|