Java String Methods
String은 Reference Type이지만 기본형 처럼 사용합니다.
literal 방식(Primitive Type을 사용하듯이)으로 선언하기도 하고, new 연산자를 이용해서 새로운 객체를 만든 후 사용하기도 합니다. 두가지 방법으로 생성된 문자열은 같아보이지만, 차이가 있습니다.
밑에 예제의 결과를 보면 알 수 있듯이 literal 방식으로 생성을 하게되면 string pool 이라는 곳에 저장하고 다음에 다시 동일한 문자열이 선언될때는 cache 된 문자열을 return 합니다. 객체를 생성하는 방법은 같은 문자열이라도 계속 새로 생성해야되기 때문에 메모리를 낭비하게됩니다. 그러므로 String을 사용할 때에는 literal 방식으로 선언하는 것이 좋습니다.
String t1 = "minseok";
String t2 = "minseok";
String t3 = new String("minseok");
t1==t2; // result is true
t1==t3; // result is false
String Class는 유용한 메소드들이 많이있는데 알아보도록 하겠습니다.
Method List
chatAt - 지정된 인덱스에 있는 char값을 return합니다.
compareTo - 두 개의 String을 사전적으로 비교합니다.
concat - 지정된 문자열을 이 문자열의 끝에 연결합니다.
contains - 지정된 문자열을 포함하고 있는 경우에만 true를 리턴합니다.
contentEquals - 지정된 문자열과 순서가 같을 때에만 true를 return합니다.
copyValueOf - 지정된 배열 내의 문자 시퀀스를 나타내는 문자열을 반환합니다.
endsWith, startWith - 문자열이 지정된 접미어로 끝나는 지, 접두어로 시작하는 지 여부를 검사합니다.
equals - 문자열을 지정된 객체와 비교합니다.
format - 지정된 위치에 값을 대입해서 문자열을 만들어내는 용도로 사용합니다.
indexOf, lastIndexOf - 문자열 내에서 지정된 Charater가 최초로 출현하는 위치의 인덱스를 return 합니다.
matches - 문자열이 지정된 정규표현에 일치할지 어떨지를 판단해서 boolean값을 return 합니다.
replace, replaceAll, replaceFirst - 문자열내에 일부를 원하는 문자열로 바꿉니다.
split - 문자열을 정규표현(특정 구분자)에 따라 String[]로 return 합니다.
substring - 문자열을 시작점(지정)부터 끝점(지정)까지 잘라서 return 합니다.
charAt
public char charAt(int index)
- 지정된 인덱스에 있는 char값을 return합니다.
소스
String str = "abc123";
str.charAt(2); // result is 'c';
str.charAt(6); // java.lang.StringIndexOutOfBoundsException 발생
compareTo
public int compareTo(String anotherString)
- 두 개의 String을 사전적으로 비교해서 int값을 return 합니다.
- equals와 비슷하지만 차이점이 있습니다. (return값이 다름)
- compareToIgnoreCase(String str) method는 대소문자를 무시합니다.
반환되는 값 설명
---------------------------------------------------------------------------------
0 두 문자열이 같음
r>0 r = string1.compareTo(string2) 일 경우 string1 > string2 일경우
r<0 r = string1.compareTo(string2) 일 경우 string1 < string2 일경우
소스
String a = "abc";
String b = "abc";
String c = "bcd";
String d = "abcde";
a.compareTo(b); // result is 0;
a.compareTo(c); // result is -1;
a.compareTo(d); // result is -2;
c.compareTo(a); // result is 1;
d.compareTo(a); // result is 2;
설명
1. a.compareTo(b)의 경우 (문자열이 같을 떄) a.charAt(0) - b.charAt(0) = 0
2. a.compareTo(c)의 경우 (글자수만 같을 때) a.charAt(0) - c.charAt(0) = 'a' - 'b' = -1
3. a.compareTo(d)의 경우 (글자수도 다를 때) a.length() - d.length() = 3 - 5 = -2
4. c.compareTo(a)의 경우 (글자수만 같을 때) c.charAt(0) - a.charAt(0) = 'b' - 'a' = 1
5. d.compareTo(a)의 경우 (글자수도 다를 때) d.length() - a.length() = 5 - 3 = 2
concat
:/} `public String concat(String str)` - 지정된 문자열을 이 문자열의 끝에 연결합니다. - 지정된 문자열의 길이가 0일 경우 기존 String 값을 return합니다. ```java "cares".concat("s") // result is "caress" "to".concat("get").concat("her") // result is "together" ``` --- {::nomarkdown}contains
public boolean contains(CharSequence c)
- CharSequence1을 구현한 클래스로 생성된 객체(문자열)를 포함하고 있는 경우에만 true를 리턴합니다.
String str = "hearth Stone";
StringBuilder sb = new StringBuilder();
sb.append("hearth");
StringBuffer sbf = new StringBuffer();
sbf.append("stone");
str.contains(sb); // result is true
str.contains(sbf); // result is false 대소문자 구별
str.contains("h St"); // result is true
contentEquals
public boolean contentEquals(CharSequence c)
public boolean contentEquals(StringBuffer sb)
- StringBuffer나 CharSequence로 지정된 문자열과 순서가 같을 때에만 true를 return합니다.
- String끼리 비교하는 equals method와 다르게 StringBuffer나 CharSequence로 지정된 문자열과 비교 할 때 사용합니다.
String str1 = "Not immutable";
String str2 = "Strings are immutable";
StringBuffer str3 = new StringBuffer("Not immutable");
str1.contentEquals(str3); // result is true
str2.contentEquals(str3); // result is false
copyValueOf
public static String copyValueOf(char[] data)
public static String copyValueOf(char[] data, int offset, int count)
- 지정된 배열 내의 문자 시퀀스를 나타내는 문자열을 반환합니다.
- 시작과 끝을 정해서 반환할 수 있습니다. (char[] data, 시작점, 길이)
char[] charArr = {'h', 'e', 'a', 'r', 't', 'h', 's', 't', 'o', 'n', 'e'};
str.copyValueOf(charArr); // result is "hearthstone"
strcopyValueOf(charArr, 2 , 6) // result is "arthst"
endsWith, startWith
public boolean endsWith(String suffix)
public boolean startWith(String prefix)
- 문자열이 지정된 접미어로 끝나는 지 여부를 검사합니다.
- 문자열이 지정된 접두어로 시작하는 지 여부를 검사합니다.
String str = "hearth stone";
str.endsWith("one"); // result is true;
str.endsWith("stone"); // result is true;
str.endsWith(""); //result is true;
str.endsWith(" "); //result is false;
str.startWith("hearth"); // result is ture;
str.startWith("hea"); // result is true;
str.startWith(""); // result is true;
equals
public boolean equals(Object anObject)
- 문자열을 지정된 객체와 비교합니다. 인수가 null이 아니고 문자 시퀀스를 나타내는 String 객체인 경우에만 true를 리턴합니다.
- equalsIgnoreCase(String anotherString) 메소드는 대소문자를 무시합니다.
String str = "hearth stone";
String str2 = "hearth stone";
String str3 = "hearth";
char[] arr = {'h','e','a','r','t','h'};
StringBuilder sb = new StringBuilder();
sb.append(str2);
str.equals(str2); // result is true;
str3.equals(String.copyValueOf(arr)); // result is true;
str2.equals(sb); // result is false;
str.equals(sb.toString()); // result is true;
format
public static String format(Locale l, String format, Object... args)
- 지정된 위치에 값을 대입해서 문자열을 만들어내는 용도로 사용합니다.
- %[argument_index$][flags][width]conversion 형식입니다.
- %와 conversion은 필수 항목이지만 대괄호로 되어있는 [argument_index$][flags][width] 부분은 생략 가능합니다. 즉, %conversion 형식으로 사용할 수 있고 나머지 부분은 옵션이라는 뜻입니다. conversion위치에는 출력되는 데이터의 타입을 입력하는데 s(문자열), d(정수), x(16진수), o(8진수), f(실수)가 들아갈 수 있습니다. %는 필수이므로 코드는 %s, %d, %x, %o, %f로 사용됩니다.
1. 문자열 format
String.format("%s %s.", "Heart", "Stone");
result:
Hearth Stone
- 두개의 문자열이 %s 위치에 대입되고 %s를 제외한 쉼표나 공백은 그대로 출력 됩니다.
- [width] 옵션
String.format("%10s%10s", "Hearth", "Stone");
String.format("%3s %3s.", "Heart", "Stone");
result:
Hearth, Stone
Hearth Stone.
- %와 s 사이에 원하는 길이를 지정할 수 있습니다.
- 10으로 했을경우 Hearth를 제외한 4칸의 공백이 생깁니다.
- width가 s의 길이보다 작아도 s는 그대로 출력됩니다.
- [argument_index$] 옵션
String.format("%2$s %1$s", "Heart", "Stone");
String.format("%1$s %1$s %s %s", "Heart", "Stone");
result:
Stone Hearth
Hearth Hearth Hearth Stone
- %와 s 사이에 2$, 1$ 을 볼 수 있는데, 1$은 첫번째 문자열, 2$은 두번째 문자열을 뜻합니다.
- 1$, 2$을 제외하고 %s 추가로 썼을 때는 문자열이 순서대로 출력됩니다.\
- [flags] 옵션
String.format("%-10s%-10s", "Hearth", "Stone");
String.format("%-3s%-3s", "Hearth", "Stone");
result:
Hearth Stone
Heart Stone.
- [flags]는 [argument_index]와 [width]사이에 위치합니다.
- -flag 를 입력하면 오른쪽에서 정렬 합니다.
2. 정수 format
String.format("%d, %d", 12345, 67890);
String.format("%10d, %10d", 12345, 67890);
String.format("%2$10d, %1$10d", 12345, 67890);
String.format("%-10d, %-10d", 12345, 67890);
String.format("%2$-10d, %1$-10d", 12345, 67890);
String.format("%010d, %010d", 12345, 67890);
String.format("%+10d, %+10d", 100, -100);
String.format("%(10d, %(10d", 100, -100);
String.format("%,10d, %10d", 10000, -10000);
result:
12345, 67890
12345, 67890
67890, 12345
12345 , 67890
67890 , 12345
0000012345, 0000067890
+100, -100
100, (100)
10,000, -10000
- 정수의 경우 %d를 붙여서 사용합니다.
- 문자열과 같이 옵션을 사용할 수 있습니다.
- [flags]에 0을 넣으면 공백에 0이 추가됩니다.
- [flags]에 +를 넣으면 부호를 표시합니다.
- [flags]에 (를 넣으면 음수의 경우에면 ()를 표시합니다.
- [flags]에 ,를 넣으면 해당 국가에서 사용되는 기호로 숫자를 그룹지어 줍니다.
3. 16진수 format
String.format("%10x%10x", 2047, 2047);
String.format("%10X%10X", 2047, 2047);
result:
7ff 7ff
7FF 7FF
- 16진수의 경우 %x를 붙여서 사용합니다.
- %x를 사용하면 소문자로, %X를 사용하면 대문자로 출력됩니다.
4. 8진수 format
String.format("%10o%10o", 2047, 2047);
result:
3777 3777
- 8진수의 경우 %o를 붙여서 사용합니다.
5. 실수 format
String.format("%f, %f", 3.14523, 0.666455);
String.format("%.2f, %.4f", 3.14523, 0.666455);
String.format("%10.2f%10.2f", 100000.999f, 200000.999f);
result:
3.145230, 0.666455
3.15, 0.6665
100001.00 200001.00
- 실수의 경우 %f를 붙여서 사용합니다.
- . 을 사용해서 정밀도를 조절할 수 있습니다.
- .2를 사용하면 소수점 두자리까지 반올림해서 표현합니다.
indexOf, lastIndexOf
public int indexOf(int ch)
public int indexOf(int ch, int fromIndex)
public int indexOf(String str)
public int indexOf(String str, int fromIndex)
- 문자열 내에서 지정된 Charater가 최초로 출현하는 위치의 인덱스를 return 합니다.
- char, int(유니코드), String형을 parameter로 받습니다.
- 원하는 결과를 찾지 못했을 경우 -1 을 return 합니다.
- parameter를 2개받는 경우에는 첫번째에는 찾을 문자, 두번째에는 찾을 문자의 시작점을 지정합니다.
- lastIndexOf 메소드는 역순으로 지정된 Charater를 찾아서 위치의 인덱스를 return 합니다.
String str1 = "AbcdeA";
String str2 = "0123453";
str1.indexOf('A'); // result is "0"
str1.indexOf('A', 4); // result is "5"
str2.indexOf("3"); // result is "3"
str2.indexOf("3", 5); // result is "6"
matches
public boolean matches(String regex)
- 문자열이 지정된 정규표현에 일치할지 어떨지를 판단해서 boolean값을 return 합니다.
- 정규표현식 참조
String str1 = "012345";
String str2 = "abcdef";
String str3 = "messi@real.com";
str1.matches("^[0-9]+$"); // return is true
str2.matches("^[a-zA-Z]{3,7}$"); // return is true
str3.matches("^[\\w]+@?[\\w]+.?[\\w]+$"); // return is true
replace, replaceAll, replaceFirst
public String replace(char oldChar, char newChar)
public String replace(CharSequence target, CharSequence replacement);
public String replaceAll(String regex, String replacement)
public String replaceFirst(String regex, String replacement)
- replace 메소드는 문자열의 oldChar를 newChar로 모두 바꿔 String을 return 합니다.
- replaceAll 메소드는 정규표현에 일치하는 부분을 지정한 문자열로 모두 바꿔서 return 합니다.
- replaceFirst 메소드는 정규표현에 일치하는 최초 부분을 지정한 문자열로 바꿔서 return 합니다.
String str1 = "ABCDEAFGAAB";
String str2 = str1.replace('A', '?'); // result is "?BCDE?FG??B"
String str3 = str1.replace("A", "에이"); // result is "에이BCDE에이FG에이에이B"
String str4 = str1.replaceAll("AB", "영어"); // result is "영어CDEAFGA영어"
String str5 = str1.replaceFirst("AB", "영어"); // result is "영어CDEAFGAAB"
String str6 = str1.replaceAll("^[A-Z]+", "123"); // result is "123"
split
public String[] split(String regex)
public String[] split(String regex, int limit)
- 문자열을 정규표현(특정 구분자)에 따라 String[]로 return 합니다.
- return 되는 배열의 String의 갯수를 조정할 수도 있습니다.
-
를 이용해서 구분자를 여러개 사용할 수 있습니다.
String str1 = "abc:bbc:cbc:dbc";
String str2 = "abc:bbc,cbc:dbc,ebc";
String str3 = "abc"
str1.split(":"); // result is {"abc, "bbc", "cbc", dbc"}
str1.split(":", 2); // result is {"abc", "bbc:cbc:dbc}
str3.split(":|,"); // result is {"abc, "bbc", "cbc", dbc", "ebc"}
str4.aplit(":"); // result is {"abc"}
substring
public String substring(int beginIndex)
public String substring(int beginIndex, int endIndex)
- 문자열을 시작점부터 문자열의 끝까지 잘라서 return 합니다.
- 문자열의 시작점과 끝점을 정해서 문자열을 잘라서 return 합니다.
String str1 = "unhappy";
String str2 = "Sweet Christmas";
String str3 = "McDonald Duck Burger";
str1.substring(2); // result is "happy"
str2.substring(6); // result is "Christmas"
str1.substring(7); // result is "" (empty)
str3.substring(2, 13); // result is "Donald Duck"
-
CharSequence는 인터페이스입니다. 이 인터페이스를 구현한 클래스로는 CharBuffer, String, StringBuffer, StringBuilder가 있으며 StringBuffer나 StringBuilder로 생성한 객체를 전달할 때 사용됩니다. StringBuffer나 StringBuilder로 값을 만든 후 굳이 toString을 수행하여 필요 없는 객체를 만들어서 넘겨주기 보다는 CharSequence로 받아서 처리하는 것이 메모리 효율에 더 좋습니다. ↩