0104 - 0110
0104
StringBuffer클래스와 StringBuilder클래스
String클래스는 인스턴스를 생성할 때 지정된 문자열을 변경할 수 없지만 StringBuffer클래스는 변경이 가능
StringBuffer의 생성자
- StringBuffer클래스는 인스턴스를 생성할 때, 적절한 길이의 char형 배열이 생성되고, 이 배열은 문자열을 저장하고 편집하기 위한 공간(buffer)으로 사용된다.
- StringBuffer을 생성할 때는 문자열의 길이를 고려하여 충분히 여유있는 크기로 지정하는 것이 좋다.
-> 편집 중인 문자열이 버퍼의 길이를 넘어서게 되면 버퍼의 길이를 늘려주는 작업이 추가로 수행되어야하기 때문에 작업효율이 떨어짐 - StringBuffer인스턴스를 생성할 때, 버퍼의 크기를 지정해주지 않으면 16개의 문자를 지정할 수 있는 크기의 버퍼를 생성
- StringBuffer인스턴스를 생성할 때, 문자열을 지정해주면 지정한 문자열의 길이보다 16이 더 크게 버퍼를 생성
StringBuffer의 변경
StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 = sb.append("123");
System.out.println(sb); //abc123
System.out.println(sb2); //abc123
- append()는 반환타입이 StringBuffer인데 자신의 주소를 반환한다. 그래서 sb에 새로운 문자열이 추가되고 sb자신의 주소를 반환하여 sb2에는 sb의 주소인 0x100이 저장된다.
- sb와 sb2가 모두 같은 인스턴스를 가리키고 있으므로 같은 내용이 출력된다. 그래서 연속적으로 append()를 호출하는 것이 가능하다.
->sb.append("123").append("zz");
StringBuffer의 비교
- StringBuffer클래스는 equals메서드를 오버라이딩하지 않아서 등가비교연산자(==)로 비교한 것과 같은 결과를 얻는다.
- 반면에 toString()은 오버라이딩되어 있어서 toString()을 호출하면, 담고있는 문자열을 String으로 반환한다.
- 그래서 StringBuffer인스턴스에 담긴 문자열을 비교하기 위해서는 StringBuffer인스턴스에 toString()을 호출해서 String인스턴스를 얻은 다음, 여기에 equals메서드를 사용해서 비교해야한다.
StringBuffer클래스의 생성자와 메서드
StringBuffer(), StringBuffer(int length), StringBuffer(String str)
-> 문자열을 매개변수로 지정하면 해당 문자열 값을 가진 StringBuffer인스턴스를 생성하고, 크기를 지정하거나 매개변수가 없으면 지정된 개수의 문자를 담을 수 있는 버퍼를 가진 StringBuffer인스턴스를 생성한다.StringBuffer append(Anytype a)
-> 매개변수로 입력된 값을 문자열로 변환하여 StringBuffer인스턴스가 저장하고 있는 문자열의 뒤에 덧붙인다.int capacity()
-> StringBuffer인스턴스의 버퍼크기를 알려준다. length()는 버퍼에 담긴 문자열의 크기를 알려준다.char charAt(int index)
-> 지정된 위치에 있는 문자를 반환한다.StringBuffer delete(int start, int end)
-> 시작위치부터 끝 위치 사이에 있는 문자를 제거한다. 단, 끝 위치 문자는 제외.StringBuffer deleteCharAt(int index)
-> 지정된 위치의 문자를 제거한다.StringBuffer insert(int pos, Anytype a)
-> 두 번째 매개변수로 받은 값을 문자열로 변환하여 지정된 위치에 추가한다.StringBuffer replace(int start, int end, String str)
-> 지정된 범위에 있는 문자들을 주어진 문자열로 바꾼다.StringBuffer reverse()
-> 저장되어 있는 문자열의 순서를 거꾸로 나열한다.void setCharAt(int index, char ch)
-> 지정된 위치의 문자를 주어진 문자로 바꾼다.void setLength(int newLength)
-> 지정된 길이로 문자열의 길이를 변경한다.String toString()
-> StringBuffer인스턴스의 문자열을 String으로 반환String subString(int start), String subString(int start, int end)
-> 지정된 범위 내의 문자열을 String으로 뽑아서 반환한다.
StringBuilder란?
- StringBuffer는 멀티쓰레드에 안전하도록 동기화되어 있다.
- 멀티쓰레드로 작성된 프로그램이 아닌 경우, StringBuffer의 동기화는 불필요하게 성능만 떨어트리게 된다.
- 그래서 StringBuffer에서 쓰레드의 동기화만 뺀 StringBuilder가 새로 추가되었다.
- 동기화를 제외하고는 StringBuilder와 StringBuffer는 완전히 똑같은 기능으로 작성되어 있다.
0105
java.util.Random클래스
- Math.random()외에도 Random클래스를 사용하면 난수를 얻을 수 있다.
double randNum = Math.random();
double randNum = new Random().nextDouble(); // 위의 문장과 동일
int num = (int)(Math.random * 6) + 1;
int num = new Random().nextInt(6) + 1; // 위의 문장과 동일
- Math.random()과 Random의 가장 큰 차이점은 종자값(seed)을 설정할 수 있다는 것이다.
- 종자값이 같은 Random인스턴스들은 항상 같은 난수를 같은 순서대로 반환한다.
Random클래스의 생성자와 메서드
- 생성자 Random()은 종자값을 System.currentTimeMillis()로 하기 때문에 실행할 때마다 얻는 난수가 달라진다.
- 주로 사용하는 메서드는 double nextDouble (), int nextInt (int n)이 있다.
- int nextInt (int n)는 0 ~ n의 범위에 있는 Int값을 반환한다. (n은 범위 포함 x)
Math.random()을 이용해서 실제 프로그래밍에 유용할만한 메서드
int getRand(int from, int to) {
return (int)(Math.random() * (Math.abs(to - from) + 1)) + Math.min(from, to);
} // from과 to범위의 정수 값을 반환한다. from과 to 모두 범위에 포함한다.
int[] fillRand(int[] arr, int from, int to) {
for(int i=0; i<arr.length; i++) {
arr[i] = getRand(from, to);
}
return arr;
} // 배열 arr을 from과 to범위의 값들로 채워서 반환한다.
int[] fillRand(int[] arr, int[] data) {
for(int i=0; i<arr.length; i++) {
arr[i] = data[getRand(0, data.length-1)];
}
return arr;
} // 배열 arr을 배열 data에 있는 값들로 채워서 반환한다.
0106
날짜와 시간
Calendar와 Date
Calendar와 GregorianCalendar
Canlendar는 추상클래스이기 때문에 직접 객체를 생성할 수 없고, 메서드를 통해서 완전히 구현된 클래스의 인스턴스를 얻어야 한다.
// getInstance() 메서드는 Calendar 클래스를 구현한 클래스의 인스턴스를 반환한다.
Calendar cal = Calendar.getInstance();
- getInstance()는 시스템의 국가와 지역설정을 확인해서 태국을 제외하고는 GregorianCalendar의 인스턴스를 반환한다.
Date와 Calendar간의 변환
- Calendar를 Date로 변환
Calendar cal = Calendar.getInstance();
Date d = cal.getTime();
- Date를 Calendar로 변환
Date d = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(d);
- getInstance()를 통해서 얻은 인스턴스는 기본적으로 현재 시스템의 날짜와 시간에 대한 정보를 담고 있다.
int get(int field)는 원하는 필드의 값을 얻어오는 Calendar의 메서드이다.get(Calendar.MONTH)로 얻어오는 값의 범위가 1에서 12가 아니라 0~11이라는 것을 주의해야 한다. 얻어오는 값이 0이면 1월을 의미한다.- get메서드의 매개변수로 사용되는 Int값들은 Calendar에 정의된 static상수이다.
- 날짜와 시간을 원하는 값으로 변경하려면 set메서드를 사용하면 된다.
void set(int field, int value)
void set(int field, int value, int date)
void set(int field, int value, int date, int hourOfDay, int minute)
void set(int field, int value, int date, int hourOfDay, int minute, int second)
- 두 날짜간의 차이를 구하기 위해서는 두 날짜를 최소단위인 초단위로 변경한 다음 그 차이를 구하면 된다.
- getTimeInMillis()는 1/1000초 단위로 값을 반환하기 때문에 초단위로 얻기 위해서는 1000으로 나눠 주어야 한다.
- 일단위로 얻기 위해서는 246060*1000으로 나누어야 한다.
add(int field, int amount)를 사용하면 지정한 필드의 값을 원하는 만큼 증가 또는 감소 시킬 수 있다.- 이를 이용해서 특정 날짜 또는 시간을 기점으로 해서 일정기간 전후의 날짜와 시간을 알아낼 수 있다.
- 다음 달의 1일에서 하루를 빼면 이번 달의 마지막 일을 알 수 있다.
roll(int field, int amount)도 지정한 필드의 값을 증가 또는 감소시킬 수 있는데, add 메서드와의 차이점은 다른 필드에 영향을 미치지 않는다는 것이다.
0107
컬렉션 프레임웍(Collections Framework)
데이터 군을 저장하는 클래스들을 표준화한 설계
컬렉션 프레임웍의 핵심 인터페이스
컬렉션 프레임웍에서는 컬렉션을 다루는데 필요한 기능을 가진 3개의 인터페이스를 정의하였다.
-> List, Set, Hash
- List와 Set의 공통된 부분을 다시 뽑아서 새로운 인터페이스인 Collection을 추가로 정의하였다.
- Map인터페이스는 이들과는 전혀 다른 형태로 컬렉션을 다루기 때문에 같은 상속계층도에 포함되지 못했다.
- 컬렉션 프레임웍의 모든 컬랙션 클래스들은 List, Set, Map 중의 하나를 구현하고 있다.
Collection 인터페이스
Collection인터페이스는 컬렉션 클래스에 저장된 데이터를 읽고, 추가하고 삭제하는 등 컬렉션을 다루는데 가장 기본적인 메서드들을 정의하고 있다.
boolean add(Object o), boolean addAll(Collection c)
-> 저장된 객체 또는 Collection의 객체들을 Collection에 추가한다.void clear()
-> Collection의 모든 객체를 삭제한다.boolean contains(Object o), boolean containsAll(Collection c)
-> 저장된 객체 또는 Collection의 객체들이 Collection에 포함되어 있는지 확인한다.boolean equals(Object o)
-> 동일한 Collection인지 비교한다.int hashCode()
-> Collection의 hash code를 반환한다.boolean isEmpty()
-> Collection이 비어있는지 확인한다.Iterator iterator()
-> Collection의 Iterator를 얻어서 반환한다.boolean remove(Object o)
-> 저장된 객체를 삭제한다.boolean removeAll(Collection c)
-> 지정된 Collection에 포함된 객체들을 삭제한다.boolean retainAll(Collection c)
-> 지정된 Collection에 포함된 객체만을 남기고 다른 객체들은 삭제한다. 이 작업으로 인해 변화가 있으면 true를 반환한다.int size()
-> Collection에 저장된 객체의 개수를 반환한다.Object[] toArray()
-> Collection에 저장된 객체를 객체배열(Object[])로 반환한다.Object[] toArray(Object[] a)
-> 지정된 배열에 Collection의 객체를 저장해서 반환한다.
List인터페이스
List인터페이스는 중복을 허용하면서 저장순서가 유지되는 컬렉션을 구현하는데 사용된다.
ex) ArrayList, LinkedList
void add(int index, Object element), boolean addAll(int index, Collection c)
-> 지정된 위치에 객체 또는 컬렉션에 포함된 객체들을 추가한다.Object get(int index)
-> 지정된 위치에 있는 객체를 반환한다.int indexOf(Object o)
-> 지정된 객체의 위치를 반환한다. (순방향으로 찾는다.)int lastIndexOf(Object o)
-> 지정된 객체의 위치를 반환한다. (역방향으로 찾는다.ListIterator listIterator(), ListIterator listIterator(int index)
-> List의 객체에 접근할 수 있는 ListIterator을 반환한다.Object remove(int index)
-> 지정된 위치에 있는 객체를 삭제하고 삭제된 객체를 반환한다.Object set(int index, Object element)
-> 지정된 위치에 객체를 저장한다.void sort(Comparator c)
-> 지정된 비교자로 List를 정렬한다.List subList(int fromIndex, int toIndex)
-> 지정된 범위에 있는 객체를 반환한다.
Set인터페이스
Set인터페이스는 중복을 허용하지 않고 저장순서가 유지되지 않는 컬렉션 클래스를 구현하는데 사용된다.
ex) HashSet, TreeSet
- Set인터페이스의 메서드는 Collection인터페이스와 동일하다.
Map인터페이스
Map인터페이스는 키와 값을 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스를 구현하는 데 사용된다.
ex) HashMap, TreeMap
- 키는 중복될 수 없지만 값의 중복을 허용한다.
- 기존에 저장된 데이터와 중복된 키와 값을 저장하면 기존의 값은 없어지고 마지막에 저장된 값이 남게 된다.
void clear()
-> Map의 모든 객체를 삭제한다.boolean containsKey(Object key)
-> 지정된 key객체와 일치하는 Map의 key객체가 있는지 확인한다.boolean containsValue(Object value)
-> 지정된 value객체와 일치하는 Map의 value객체가 있는지 확인한다.Set entrySet()
-> Map에 저장되어 있는 Key-value쌍을 Map.Entry타입의 객체로 저장한 Set으로 반환한다.boolean equals(Object o)
-> 동일한 Map인지 비교한다.Object get(Object key)
-> 지정한 key객체에 대응하는 value객체를 찾아서 반환한다.int hashCode()
-> 해시코드를 반환한다.boolean isEmpty()
-> Map이 비어있는지 확인한다.Set keySet()
-> Map에 저장된 모든 key객체를 반환한다. Key는 중복을 허용하지 않기 때문에 Set으로 반환한다.Object put(Object key, Object value)
-> Map에 value객체를 key객체에 연결하여 저장한다.void putAll(Map t)
-> 지정된 Map의 모든 key-value쌍을 추가한다.Object remove(Object key)
-> 지정된 key객체와 일치하는 key-value객체를 삭제한다.int size()
-> Map에 저장된 key-value쌍의 개수를 반환한다.Collection values()
-> Map에 저장된 모든 value객체를 반환한다. 값은 중복을 허용하기 때문에 Collection타입으로 반환 가능하다.
Map.Entry인터페이스
- Map인터페이스의 내부 인터페이스이다.
- Map에 저장되는 key-value쌍을 다루기 위해 내부적으로 Entry인터페이스를 정의한 것이다.
-
Map인터페이스를 구현하는 클래스에서는 Map.Entry인터페이스도 함께 구현해야한다.
boolean equals(Object o)
-> 동일한 Entry인지 비교한다.Object getKey()
-> Entry의 key객체를 반환한다.Object getValue()
-> Entry의 value객체를 반환한다.int hashCode()
-> Entry의 해시코드를 반환한다.Object setValue(Object value)
-> Entry의 value객체를 지정된 객체로 바꾼다.
0108
ArrayList
ArrayList는 List인터페이스를 구현하기 때문에 데이터의 저장순서가 유지되고 중복을 허용한다는 특징을 갖는다.
- ArrayList는 Object배열을 이용해서 데이터를 순차적으로 저장한다.
- 배열에 더 이상 저장할 공간이 없으면 보다 큰 새로운 배열을 생성해서 기존의 배열에 저장된 내용을 새로운 배열로 복사한 다음에 저장한다.
-> 크기를 적절하게 정해줘야한다.
ArrayList의 생성자와 메서드 - List와 Collection인터페이스로부터 받는 메서드 제외
void ensureCapacity(int minCapacity)
-> ArrayList의 용량이 최소한 minCapacity가 되도록 한다.void trimToSize()
-> 용량을 크기에 맞게 줄인다.
for(int i = list2.size()-1; i >= 0; i--) {
if(list1.contains(list2.get(i)) //list2에서 list1과 공통되는 요소들을 찾아서 삭제
list2.remove(i);
}
- for문의 변수 i를 0부터 증가시킨 것이 아니라, ‘list2.size()-1’부터 감소시키면서 거꾸로 반복시켰다.
-
변수 i를 증가시켜가면서 삭제하면, 한 요소가 삭제될 때마다 빈 공간을 채우기 위해 나머지 요소들이 자리이동을 하기 때문에 올바른 결과를 얻을 수 없다.
- ArrayList를 생성할 때, 저장할 요소의 개수를 고려해서 실제 저장할 개수보다 약간 여유있는 크기로 하는 것이 좋다.
-> 생설할 때 지정한 크기보다 더 많은 객체를 저장하면 자동적으로 크기가 늘어나기는 하지만 처리시간이 많이 소요되기 때문이다. - ArrayList나 Vector같이 배열을 이용한 자료구조는 데이터를 읽어오고 저장하는 데는 효율이 좋지만, 용량을 변경해야할 때는 새로운 배열을 생성한 후 기존의 배열로부터 복사해야하기 때문에 상당히 효율이 떨어진다는 단점을 가지고 있다.
배열에 객체를 순차적으로 저장할 때와 객체를 마지막에 저장된 것부터 삭제하면 System.arraycopy()를 호출하지 않기 때문에 작업시간이 짧다.
LinkedList
배열의 단점
- 크기를 변경할 수 없다.
- 크기를 변경할 수 없으므로 새로운 배열을 생성해서 데이터를 복사해야한다.
- 실행속도를 향상시키기 위해서는 충분히 큰 크기의 배열을 생성해야 하므로 메모리가 낭비된다.
- 비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다.
- 배열의 중간에 데이터를 추가하려면, 빈자리를 만들기 위해 다른 데이터들을 복사해서 이동해야 한다.
-> 이러한 배열의 단점을 보완하기 위한 링크드 리스트(linked list)
- 배열은 모든 데이터가 연속적으로 존재하지만 링크드 리스트는 불연속적으로 존재하는 데이터를 서로 연결한 형태로 구성되어 있다.
- 링크드 리스트의 각 요소(node)들은 자신과 연결된 다음 요소에 대한 참조와 데이터로 구성되어 있다.
class Node {
Node next; //다음 요소의 주소를 저장
Object obj; //데이터를 저장
}
- 링크드 리스트에서의 데이터 삭제는 삭제하고자 하는 요소의 이전요소가 삭제하고자 하는 요소의 다음 요소를 참조하도록 변경하기만 하면 된다.
- 단 하나의 참조만 변경하면 삭제가 이루어지기 때문에 처리속도가 매우 빠르다.
- 새로운 데이터를 추가할 때는 새로운 요소를 생성한 다음 이전 요소의 참조를 새로운 요소에 대한 참조로 변경해주고, 새로운 요소가 그 다음 요소를 참조하도록 변경하기만 하면 되므로 처리속도가 매우 빠르다.
- 링크드 리스트는 이동방향이 단방향이기 때문에 다음 요소에 대한 접근은 쉽지만 이전 요소에 대한 접근은 어렵다.
-> 이 점을 보완한 것이 더블 링크드 리스트(이중 연결리스트)
- 더블 링크드 리스트는 링크드 리스트에 참조변수를 하나 더 추가하여 다음 요소에 대한 참조뿐 아니라 이전 요소에 대한 참조가 가능하도록 했을 뿐, 그 외에는 링크드리스트와 같다.
class Node {
Node next; //다음 요소의 주소를 저장
Node previous; //이전 요소의 주소를 저장
Object obj; //데이터를 저장
}
-> 더블 링크드 리스트의 접근성을 보다 향상시킨 것이 더블 써큘러 링크드 리스트(이중 원형 연결리스트)인데, 단순히 더블 링크드 리스트의 첫 번째 요소와 마지막 요소를 연결시킨 것이다.
LinkedList클래스는 이름과 달리 ‘링크드 리스트’가 아닌 ‘더블 링크드 리스트’로 구현되어 있는데, 이는 링크드 리스트의 단점인 낮은 접근성을 높이기 위한 것
LinkedList의 생성자와 메서드
- List와 Collection인터페이스를 구현하면서 추가된 메서드와 Queue인터페이스와 Deque인터페이스를 구현하면서 추가된 메서드들로 이루어져 있다.
- LinkedList 역시 List인터페이스를 구현했기 때문에 ArrayList와 내부구현방법만 다를 뿐 제공하는 메서드의 종류와 기능은 거의 같다.
ArrayList와 LinkedList비교
- 순차적으로 추가/삭제하는 경우에는 ArrayList가 LinkedList보다 빠르다.
- 만일 ArrayList의 크기가 충분하지 않으면, 새로운 크기의 ArrayList를 생성하고 데이터를 복사하는 일이 발생하게 되므로 순차적으로 데이터를 추가해도 LinkedList가 더 빠를 수 있다.
- ArrayList는 마지막 데이터부터 삭제할 경우 마지막 요소의 값을 null로만 바꾸면 되어서 상당히 빠르다.
- 중간 데이터를 추가/삭제하는 경우에는 LinkedList가 ArrayList보다 빠르다.
_ 중간 요소를 추가 또는 삭제하는 경우, LinkedList는 각 요소간의 연결만 변경해주면 되기 때문에 처리속도가 상당히 빠르다.
_ ArrayList는 각 요소들을 재배치하여 추가할 공간을 확보하거나 빈 공간을 채워야하기 때문에 처리속도가 늦다.
-> 데이터의 개수가 그리 크지 않다면 어느 것을 사용해도 큰 차이가 나지는 않는다. - 데이터를 읽는 경우에는 ArrayList가 LinkedList보다 빠르다.
- 배열은 각 요소들이 연속적으로 메모리상에 존재하기 때문에 간단한 계산만으로 원하는 요소의 주소를 얻어서 저장된 데이터를 곧바로 읽어올 수 있다.
- 인덱스가 n인 데이터의 주소 = 배열의 주소 + n * 데이터 타입의 크기
- LinkedList는 불연속적으로 위치한 각 요소들이 서로 연결된 것이라 처음부터 n번째 데이터까지 차례대로 따라가야만 원하는 값을 얻을 수 있다.
- LinkedList는 저장해야하는 데이터의 개수가 많아질수록 데이터를 읽어 오는 시간, 즉 접근시간이 길어진다는 단점이 있다.
- 배열은 각 요소들이 연속적으로 메모리상에 존재하기 때문에 간단한 계산만으로 원하는 요소의 주소를 얻어서 저장된 데이터를 곧바로 읽어올 수 있다.
다루고자 하는 데이터의 개수가 변하지 않는 경우 -> ArrayList
데이터 개수의 변경이 잦은 경우 -> LinkedList
- 두 클래스의 장점을 이용해서 클래스를 조합해서 사용하는 방법도 생각해 볼 수 있다.
-> 처음 작업하기 전에 데이터 저장할 때는 ArrayList를 사용하고, 작업할 때는 LinkedList로 데이터를 옮겨서 작업하면 좋은 효율을 얻을 수 있다.
0109
java.util.Objects클래스
Object클래스의 보조 클래스로 Math클래스처럼 모든 메서드가 ‘static’이다. 객체의 비교나 널 체크에 유용하다.
- isNull()은 객체가 null이면 true를 반환하고, 아니면 false를 반환한다. nonNull()은 정반대의 일을 한다.
- requireNonNull()은 해당 객체가 널이 아니어야 하는 경우에 사용한다. 만일 객체가 널이면, NullPointerException을 발생시킨다. 두 번째 매개변수로 지정하는 문자열은 예외의 메시지가 된다.
- compare()는 두 비교대상이 같으면 0, 크면 양수, 작으면 음수를 반환한다. 두 객체를 비교하는데 사용할 비교 기준이 필요하다. 그 역할을 하는 것이 Comparator이다.
- Objects클래스에서 정의된 equals()는 null검사를 하지 않아도 된다는 장점이 있다.
-> equals()의 내부에서 a와 b의 널 검사를 하기 때문이다. - 두 2차원 문자열 배열을 비교할 때, deepEquals()를 쓰면 간단하게 해결할 수 있다.
- toString()도 equals()처럼, 내부적으로 널 검사를 한다. 널이라면 두 번째 매개변수를 대신 사용할 값으로 지정할 수 있다.
- hashCode()역시 내부적으로 널 검사를 한 후에 Object클래스의 hashCode()를 호출할 뿐이다. 단, 널일 때는 0을 반환한다.
- static import문을 사용해도 Object클래스의 메서드와 이름이 같은 것들은 충돌이 난다. 즉, 컴파일러가 구별을 못한다.
-> 클래스의 이름을 붙여줄 수밖에 없다.
0110
정규식 - java.util.regex패키지
정규식이란 텍스트 데이터 중에서 원하는 조건(패턴, pattern)과 일치하는 문자열을 찾아내기 위해 사용하는 것으로 미리 정의된 기호와 문자를 이용해서 작성한 문자열을 말한다.
Pattern - 정규식을 정의하는데 사용
Matcher - 정규식을 데이터와 비교하는 역할
String[] data = {"bat", "baby", "bonus", "cA", "ca", "co", "c.", "c0", "car", "combat", "count", "data", "disc"};
Pattern p = Pattern.compile("c[a-z]*"); // c로 시작하는 소문자영단어
for (int i=0; i<data.length; i++) {
Matcher m = p.matcher(date[i]);
if(m.matches())
System.out.print(data[i] + ", "); //결과 : ca, co, car, combat, count,
- 정규식을 매개변수로 Pattern클래스의 static메서드인 Pattern compile(String regex)을 호출하여 Pattern인스턴스를 얻는다.
Pattern p = Pattern.compile("c[a-z]*"); - 정규식으로 비교할 대상을 매개변수로 Pattern클래스의 Matcher matcher(CharSequence input)를 호출해서 Matcher인스턴스를 얻는다.
Matcher m = p.matcher(data[i]); - Matcher인스턴스에 boolean matches()를 호출해서 정규식에 부합하는지 확인한다.
if(m.matches())x
자주 쓰일 만한 패턴들
c[a-z]*
-> c로 시작하는 영단어c[a-z]
-> c로 시작하는 두 자리 영단어c[a-zA-Z]
-> c로 시작하는 두 자리 영단어 (a~z 또는 A~Z, 즉 대소문자 구분안함)c[a-zA-Z-0-9], c\w
-> c로 시작하고 숫자와 영어로 조합된 두 글자.*
-> 모든 문자열c.
-> c로 시작하는 두 자리 문자열c.*
-> c로 시작하는 모든 문자열c\.
-> c.와 잋리하는 문자열’.’은 패턴작성에 사용되는 문자이므로 escape문자인 ‘'를 사용해야한다.c\d, c[0-9]
-> c와 숫자로 구성된 두 자리 문자열c.*t
-> c로 시작하고 t로 끝나는 모든 문자열[b|c].*, [bc].*, [b-c].*
-> b나 c로 시작되는 문자열^[b|c].*, ^[bc].*, ^[b-c].*
-> b나 c로 시작되지 않는 문자열.*a.*
-> a를 포함하는 모든 문자열. *는 0 또는 그 이상의 문자.*a.+
-> a를 포함하는 모든 문자열. +는 1 또는 그 이상의 문자. +는 *과 달리 반드시 하나 이상의 문자가 있어야 하므로 a로 끝나는 단어는 포함되지 않음[b|c].{2}
-> b나 c로 시작되는 세 자리 문자열