String도 복수데이터. 복수데이터를 다루는 방식으로 사용할 수 있다.
문자(character) + 열(순서O 복수데이터)
String implements interface Serializable, interface CharSequence, interface Comparable<String>
사실 문자열은 interface CharSequence
를 의미한다.
String이 CharSequence
를 구현하는 대표 클래스이므로 일반적으로 String을 문자열이라고 부르는 것이며, 정확한 표현이 아니다.
String은 상수다. (Strings are constant for being shared)
(class StringBuffer
은 변화가능한 String을 지원한다.)
일반적으로 String을 생성하는 방식은 "abc"
인데, 이것의 진짜 의미는new String("abc").intern()
이다.
String 객체는 생성되면 String Pool에 들어간다.
intern()은 컴퓨터는 해당 String이 String Pool 안에 있는지 확인하고, 이미 존재하면 String을 새로 생성하는 대신 기존 String을 사용한다.
만약 'new String("abc")'를 사용하여 생성한다면(즉 intern()없이 생성된다면) String Pool를 확인하지 않는다.
String str1 = "abc";
String str2 = new String("abc").intern();
String str3 = new String("abc");
Integer is constant???
호출을 표현하는 두 단어
- call : 명시적 호출 - 참조연산자 등
- invoke : 명시적 호출 없이 자동으로 불리는 것
- callback : 시스템 차원에서 자동으로 호출됨(invoked)
ex)main(String[] args)
(자동호출)
ex)finalize()
(called by garbage collector)
charAt(int index)
: index번 문자를 반환length()
: 문자열의 글자수를 반환toUpperCase()
: 대문자로 변환toLowerCase()
: 소문자로 변환compareTo(String str)
compareToIgnoreCase(String str)
: 대소문자 구분없이 비교equals(String str)
equalsIgnoreCase(String str)
: 대소문자 구분없이 일치여부 판단trim()
: 문자열에서 앞뒤 여백을 제거한 새 문자열을 반환 (중간 여백은 제거되지 않음)concat(String str)
: 기존 문자열에 패러미터 문자열을 더한 새 문자열을 반환contains(String str)
: 문자열이 str을 포함하는지 확인 indexOf(String str)
: 문자열에서 str을 찾아 index 반환indexOf(String str, int fromIndex)
: indexOf()
에 시작점 추가lastIndexOf(String str, int fromIndex)
: indexOf()
역방향 검색substring(int biginIndex)
: biginIndex부터 끝까지 반환substring(int biginIndex, int endIndex)
: biginIndex부터 endIndex - 1까지 반환replace(CharSequence target, CharSequence replacement)
: 문자열 찾아서 교체startsWith(String str)
: 해당 문자열로 시작하는지 확인 (return : boolean)endsWith(String str)
: 해당 문자열로 끝나는지 확인 (return : boolean)split(String 구분자)
: 구분자 기준으로 문자를 잘라 String[]로 반환'indexOf()로 인덱스 찾고, substring으로 자른다.' <- 둘은 한 세트, 매우 중요
메서드의 다양한 활용
ex) lastIndexOf() 사용하여 확장자만 떼어오기, startWith(), endsWith()으로 저장 경로, 확장자 구별하기
어떤 메서드를 사용하더라도 기존 String은 변경되지 않는다. ('String is constant')
- Integer.toHexString(int num) : num을 16진수(String)으로 변환
(16진수는 자릿수 없이 숫자만 읽는다.)
append(String str)
: 문자열 뒤에 추가insert(int offset, String str)
: 문자열의 offset번째 자리에 추가append()
와 insert()
는 패러미터로 기본데이터형이 모두 가능)delete(int start, int end)
: 문자열의 start에서 end - 1까지 제거reverse()
: 문자열을 뒤집어 반환toString()
: String 객체로 변환 the space character (), the tab character (t), the newline character (n),
the carriage-return character (r), and the form-feed character (f).
StringTokenizer(String line, String delim)
- 생성자countTokens()
: 토큰 개수 (int) 반환nextToken()
: 다음 token(String)을 반환hasMoreTokens()
: 다음 token이 존재하는지 확인import java.util.*;
class StringTokenizerEx {
public static void main(String[] args) {
String line = "이/또한@흘러#가리 라!";
StringTokenizer st = new StringTokenizer(line, "/@#");
// 구분자 기준으로 (default 구분자 = " ", /t, /n) 문자열을 나누어 토큰으로 저장함
// 구분자를 따로 입력해주면 디폴트 구분자는 적용되지 않는다!
System.out.println(st.countTokens());
// countTokens() : 보유한 토큰의 개수를 알려줌
// '꺼내기 전부터 개수를 알 수 있다' = 배열로 사용할 수 있다
while(st.hasMoreTokens()) {
String token = st.nextToken();
// iterator와 비슷한 방식이지만, iterator가 아닌 <interface> Enumeration 방식을 사용함
System.out.println(token);
// 우리는 찾는 내용에 따라 자른거고, 이건 구분자 기준으로 자른 것. (기존에 사용한 방식이 훨씬 정교하게 사용 가능)
// 사용법이 간단할수록 활용폭은 좁다는 법칙
}
st = new StringTokenizer(line, "/@#");
String[] tokens = new String[st.countTokens()];
int idx = 0;
while(st.hasMoreTokens()) {
String token = st.nextToken();
tokens[idx] = token;
idx++;
}
System.out.println(Arrays.toString(tokens));
}
}
split()
메서드 사용을 권장한다.