본문 바로가기
  • soobinhand의 기술 블로그
도서/자바 프로그래밍 언어 - James Gosling

[자바 프로그래밍 언어] 13장 문자열과 정규 표현식

by soobinhand 2022. 1. 2.
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

댓글