728x90
13.1 문자 시퀀스
- String 객체는 불변성을 가지고 있기 때문에 문자열이 변경될 수 있다면 StringBuilder 클래스를 사용해야 한다.
- public char charAt(int index)
- 현재 시퀀스에서 지정된 index에 있는 char를 반환한다.
- public CharSequence subSequence(int start, int end)
- start부터 end까지로 구성된 시퀀스의 char값을 포함하는 CharSequence를 새로 생성해서 반환한다.
13.2 String 클래스
- 문자열은 불변성을 가진 문자 시퀀스이다. 그래서 문자열은 생성된 이후에는 절대 변경할 수 없다.
- indexOf 메소드의 오버로드 메소드들은 문자열의 앞에서부터 검색을 시도하고 lastIndexOf 메소드의 오버로드 메소드들은 문자열의 뒤에서부터 검색을 시도한다.
- 만약 특정 문자열이 포함된 문자열 위치가 아닌 포함 여부만 알고 싶다면 contains메소드를 사용해야 한다. 만약 CharSequence의 인덱스를 찾고 싶다면 CharSequence 상에서 toString 메소드를 호출한 후에 indexOf를 사용해야 한다.
- equals 메소드는 전달된 String 객체의 참조와 내용이 같다면 true를 반환한다. 즉, 두 문자열의 길이가 같아야 하고 유니코드 문자도 정확히 같아야 한다. 만약 비교하는 객체가 String이 아니거나 내용이 다르다면 String.equals는 false를 반환한다.
- 대소문자에 상관없이 문자열을 비교하기 위해서는 equalsIgnoreCase를 사용해야 한다.
- contentEquals 메소드를 사용하면 String과 CharSequence를 서로 비교할 수 있다. 이 메소드는 두 객체가 정확히 같은 문자 시퀀스를 가지고 있다면 true를 반환한다.
- compareTo 메소드는 문자열들을 순서화하는데 유용하다.
- 문자열의 전체뿐만 아니라 문자열의 일부분도 비교할 수 있다. 이를 위한 메소드에는 regionMatches가 있으며 이 메소드는 두 가지 형식이 있다.
- public boolean regionMatches(boolean ignoreCase, int start, String other, int ostart, int count)
- 현재 String의 일부분이 지정된 문자열 other의 일부분과 유니코드 문자가 동일하다면 true를 반환한다. 현재 String에서는 start 위치부터, other 문자열에서는 ostart에서부터 지정된 count 만큼 비교한다. 맨앞은 true면 대소문자 상관 안한다.
- 문자열의 시작이나 끝 부분을 검사하고 싶을 때에는 startsWith, endsWith를 사용
- public boolean startsWith(String prefix, int start)
- 지정된 문자열 prefix를 현재 문자열의 start 위치부터 비교했을 때 같다면 true를 반환
- public boolean startsWith(String prefix)
- 이 메소드는 startsWith(prefix, 0)과 동일하다.
- public boolean endsWith(String suffix)
- 현재 문자열이 지정된 suffix로 끝난다면 true를 반환
- 일반적으로 ==를 사용해 문자열을 비교하면 잘못된 결과를 얻을 수 있다.
- str은 문자열 리터럴로 설정되었기 때문에, 이를 다른 문자열 리터럴과 비교하는 것은 동일한 내용을 가진 문자열들을 비교하는 것과 같다고 볼 수 있다. 하지만 주의할 것이 있는데 이러한 비교는 모든 문자열 참조가 문자열 리터럴을 참조하는 경우에만 동작한다는 것이다.
- intern메소드는 이 메소드를 호출한 String 객체의 내용과 동일한 String 객체를 반환한다. 하지만 동일한 문자열을 가진 두 개의 문자열에서 intern 메소드를 각각 호출하더라도 동일한 String 객체를 반환한다.
- 이렇게 intern 메소드를 호출하여 문자열을 비교하는 것은 객체 참조를 비교하는 것으로써 문자열 내용을 비교하는 것과 결과적으로 동일하다. 이렇게 하는 것이 문자열 내용을 비교하는 것보다 속도가 더 빠르다.
- 동일한 내용을 가진 두 개의 문자열은 동일한 해시코드를 가진다고 할 수 있다.
- 문자열과 관련된 메소드들이다.
- public String replace(char oldChar, char newChar)
- 문자 oldChar을 문자 newChar로 모두 변경한 문자열을 생성해서 반환한다.
- public String trim()
- 문자열 처음과 끝의 화이트스페이스를 삭제한 문자열을 생성해서 반환한다.
- public String replaceFirst(String regex, String repStr)
- 현재 문자열에서 정규 표현식 regex와 일치하는 첫 번째 문자열만 repStr로 변경한 문자열을 생성해서 반환한다.
- public String[] split(String regex, int limit)
- 현재 문자열을 지정된 정규 표현식으로 분리하고 이를 문자열 배열에 담아 반환한다. limit는 문자열을 정규 표현식으로 분리할 개수를 지정하기 위한 것이다. limit에 양수가 지정되었다면 분리되는 문자열의 개수는 n-1까지로 제한되며 이를 초과할 경우에는 나머지 문자열은 분리되지 않고 마지막 분리된 문자열에 포함된다.
- concat 메소드는 두 개의 문자열을 +로 연결하는 것과 동일한 문자열을 생성해서 반환한다. 그래서 다음 두 문장은 같다
- newStr = oldStr.concat("not");
- newStr = oldStr + "not";
타입 | String으로 변환 | String을 변환 |
boolean | String.valueOf(boolean) | Boolean.parseBoolean(String) |
byte | String.valueOf(int) | Byte.parseByte(String, int base) |
char | String.valueOf(char) | str.charAt(0) |
short | String.valueOf(int) | Short.parseShort(String, int base) |
int | String.valueOf(int) | Integer.parseInt(String, int base) |
long | String.valueOf(long) | Long.parseLong(String, int base) |
float | String.valueOf(float) | Float.parseFloat(String) |
double | String.valueOf(double) | Double.parseDouble(String) |
- String을 char 배열로, char 배열을 String으로 변환할 수 있다. char 배열의 값을 문자열로 만들고 싶을 때는 이 배열의 값으로 String 객체를 생성해야 한다. 이 경우에 StringBuilder 클래스는 적당하지 않으며, String클래스는 String을 char배열로, char 배열은 String클래스로 변환할 수 있는 여러 메소드와 생성자를 제공하고 있다.
- char 배열을 가지고 String 을 생성할 수 있는 두 개의 생성자가 있다.
- public String(char[] chars, int start, int count)
- char 배열의 start위치부터 count만큼의 문자들로 String 객체를 새로 생성한다.
- public String(char[] chars)
- 이 메소드는 String(chars, 0, chars.length)와 동일.
- toCharArray 메소드는 단순하지만 대부분의 용도에 충분하다. 하지만 문자열의 일부분을 문자 배열로 복사하고 싶은 경우에는 getChars 메소드를 사용해야 한다.
- public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
- 현재 String의 문자들을 지정된 배열로 복사한다. 지정된 일부 문자열을 문자 배열 dst[dstBegin]로 시작점으로 복사한다.
13.3 정규 표현식 일치시키기
- 정규 표현식은 와일드카드를 사용하여 문자열의 특정 위치에 지정된 문자 그룹이나 표시가 있는지 또는 없는지를 확인하기 위한 표현식이다.
- 정규 표현식은 문자열이 특정 패턴과 일치하는지를 찾은 후에 문자열의 일부를 추출하는 용도로 사용할 수 있다.
- 예를 들어, . 은 한개의 문자와 일치하므로 패턴 .op 는 hop이나 pop과 일치한다. 그리고 *은 0개 이상의 문자와 일치하므로 xyz*은 xyzzz같은 것과 일치한다.
- 정규 표현식 패턴을 사용하는 절차
- 가장 먼저 정규 표현식 문자열을 컴파일하고 Pattern객체로 설정한다. 이를 컴파일된 패턴이라 한다.
- 그런 후 특정 CharSequence를 찾을 수 있는 Matcher객체를 Pattern객체에 요청한다.
- 끝으로 Matcher로 지정된 시퀀스에서 컴파일된 패턴을 일치시키는 문자들을 찾는다.
- Pattern pat = Pattern.compile(regex)
- Matcher mat = pat.matcher(sequence)
- boolean foundMatch = matcher.find()
13.4 StringBuilder 클래스
- String 객체를 여러 번 생성하지 않고, 한 개의 문자열에 계속 다른 문자열을 추가할 수 있는 StringBuilder 객체를 사용. 즉, StringBuilder 객체는 수정할 수 있으며 String 객체처럼 문자열을 추가할 때마다 String객체를 새로 생성하지 않는다.
- 마지막에 toString메소드를 사용해서 연결된 문자열을 String객체로 반환한다.
- StringBuilder 객체의 버퍼 끝에 추가하거나 중간에 삽입하는 것처럼 이 객체의 버퍼를 수정하는 방법에는 여러 가지가 있다. 이 중에서 가장 단순한 메소드는 지정된 위치의 문자를 변경하는 setCharAt 메소드이다.
- reverse 메소드는 StringBuilder 문자들의 순서를 역순으로 변경함.
- delete 메소드에 시작과 끝 인덱스를 지정하여 버퍼의 내용을 제거할 수도 있다. 이때 끝 인덱스의 문자는 제거 대상에 포함되지 않는다. 한개의 문자를 제거하고 싶은 경우에는 deleteCharAt메소드 사용.
- StringBuilder 객체에서 String객체를 얻기 위해서는 toString 메소드를 호출해야 한다. 만약 버퍼의 일부 문자열이 필요한 경우에는 substring메소드를 호출하면 된다. 만약 내용의 일부나 전체를 문자 배열로 얻고 싶다면 getChars메소드를 사용
- StringBuffer 클래스는 한 가지를 제외하고는 StringBuilder와 동일하다. 이 한 가지는 StringBuffer 클래스는 스레드에 안전하게 문자 시퀀스를 추가할 수 있단 것이다.
13.5 UTF-16으로 작업하기
- 없음
728x90
'도서 > 자바 프로그래밍 언어 - James Gosling' 카테고리의 다른 글
[자바 프로그래밍 언어] 15장 어노테이션 (0) | 2022.01.04 |
---|---|
[자바 프로그래밍 언어] 14장 스레드 (0) | 2022.01.03 |
[자바 프로그래밍 언어] 12장 예외와 검증 (0) | 2021.12.31 |
[자바 프로그래밍 언어] 11장 제네릭 타입 (0) | 2021.12.31 |
[자바 프로그래밍 언어] 10장 흐름제어 (0) | 2021.12.29 |
댓글