티스토리 뷰
1. java.util 패키지의 유용한 클래스
(1) java.util 패키지의 Objects 클래스 (java.lang 패키지의 Object 클래스와 유의)
- Math 클래스 처럼 모든 클래스가 static. 객체의 비교나 null check에 유용함.
- Objects.isNull(obj)이나 Objects.nonNull(obj) 같이 해당 객체가 null인지 아닌지를 boolean 값으로 반환함.
- Objects.requireNonNull()은 해당 객체가 null이 아니여야 하는 경우에 사용. null이면 NPE 발생. Parameter 2개 쓰면 (obj, String예외 메세지) 순으로 예외메세지 설정가능. 아래 처럼 매개변수 null check 유효성 검사시 간단히 가능.
import java.util.Objects;
public class Test {
String name;
// 1
void setName(String name){
if (name == null ) throw new NullPointerException("name must be not null");
this.name = name;
}
// 2
void setName2(String name){
this.name = Objects.requireNonNull(name,"name must be not null");
}
}
- java.lang.Object 클래스에서는 equals() 메소드를 통해서 두 객체의 등가 비교를 할 수 있는 메소드는 있지만, 대소비교를 할 수 있는 compare() 메소드는 없다. 대소 비교를 하기 위해서는 Comparable, Comparator 인터페이스를 implement 받아서 메소드를 override해야만 한다. 하지만 Objects클래스의 compare()메소드를 사용하면 대소비교가 가능하다.
static int compare(Object a, Object b, Comparator c)
위와 같이 Comparator를 통해서 정렬 기준을 넘겨 주면, 객체 a와 객체 b를 비교 할 수 있다.
- 또한 java.lang.Object 클래스의 11개의 메소드 중 equals() 메소드가 있듯, Objects 클래스에서 equals()메소드가 있는데, 이는 null check 하는 기능을 포함하고 있다.
if (a!= null && a.equals(b)){}
if (Objects.equals(a,b)){}
위와 같이 null을 check 해주는 기능을 포함해 따로 null 검사를 하지 않아도 된다.
public final class Objects {
private Objects() {
throw new AssertionError("No java.util.Objects instances for you!");
}
public static boolean equals(Object a, Object b) {
return a == b || a != null && a.equals(b);
}
public static boolean deepEquals(Object a, Object b) {
if (a == b) {
return true;
} else {
return a != null && b != null ? Arrays.deepEquals0(a, b) : false;
}
}
이는 위의 Objects 클래스의 코드를 보면, a가 객체일 경우 null check를 내부적으로 해주기 때문이다.
또한 deepEquals()메소드를 사용해서 이차원 배열의 경우 비교도 가능하다.
- toString()메소드또한 null 검사를 내부적으로 한다.
(2) java.util.Random 클래스
- 난수를 생성하는 방법은 아래 두 방법은 같은 방법이다. 편한방법을 사용하면 된다.
double ranNum = Math.random();
double ranNum2 = new Random().nextDouble();
1~6사이의 정수를 난수로 얻고자 할때는 다음과 같다.
int num = (int) (Math.random() * 6) + 1;
int num2 = new Random().nextInt(6) + 1;
Random().nextInt()는 int 타입의 난수를 반환하며 (int 범위) .nextInt(int n)을 설정 시 0 ~ n의 범위에 있는 int값을 반환한다. (n은 범위에 포함 x)
public class RandomExample {
// 배열 arr를 from과 to 범위의 값들로 채워 반환
static int[] fillRand(int[] arr, int from, int to){
for (int i = 0; i < arr.length; i++) {
arr[i] = getRand(from, to);
}
return arr;
}
// 배열 arr값을 data에 있는 값들로 채워서 반환.
static int[] fillRand(int[] arr, int[] data){
for (int i = 0; i < arr.length; i++) {
arr[i] = data[getRand(0, data.length-1)];
}
return arr;
}
// from과 to 범위의 정수 값을 반환함. from 과 to 모두 범위에 포함.
static int getRand(int from, int to){
return (int)(Math.random() * (Math.abs(to-from) + 1)) + Math.min(from, to);
}
}
(3) java.util.regex 패키지 (정규식)
public class RegularExpression1 {
public static void main(String[] args) {
String[] data = {"bat", "baby", "bonus", "cA", "ca", "co", "c.", "c0", "car", "combat", "count", "date", "disc"};
Pattern p = Pattern.compile("c[a-z]*"); // c로 시작하는 소문자 영단어
for (int i = 0; i < data.length; i++) {
Matcher m = p.matcher(data[i]);
if (m.matches()) System.out.print(data[i] + ",");
}
}
}
1) 정규식을 매개변수로 Pattern 클래스의 static 메소드인 Pattern compile(String regex)을 호출하여 Pattern 인스턴스를 얻는다.
2) 정규식으로 비교할 대상을 매개변수로 Pattern 클래스의 Matcher matcher(Charsequence input)을 호출해서 Matcher 인스턴스를 얻는다.
3) Matcher 인스턴스에 boolean matches()를 호출해서 정규식에 부합하는지 확인한다.
* m.find()를 통해서 match하는게 존재하는 유무를 boolean으로 받을 수도 있다 (while문 돌때 사용가능)
* m.start(), m.end()통해서 matcher()로 넘긴 것에 pattern에 맞는 index를 반환 할 수도 있다.
* 또한 m.appendReplacement(StringBuffer sb, String replacement)를 이용해서 문자열을 치환 할 수도 있다. replacement에 설정한 string으로 해당 matcher()통해 넘겨받은 것에 대해서 pattern이 일치하는 것을 replacement로 변환해 sb에 저장한다.
정규식 패턴 | Description |
c[a-z]* | c로 시작하는 영단어 (a-z범위 소문자만) |
c[a-z] | c로 시작하는 두 자리 영단어 |
c[a-zA-Z] | c로 시작하는 두 자리 영단어 (대소문자 구분 x) |
c[a-zA-Z0-9] | 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로 시작하는 세 자리 문자열. (b or c 다음에 두자리) |
0\\d{1,2} |
0으로 시작하는 최소 2자리 최대 3자리 숫자(0포함) |
\\d{3,4} | 최소 3자리 최대 4자리 숫자 |
\\d{4} | 4자리 숫자 |
public class RegularExpression3 {
public static void main(String[] args) {
String source = "A broken hand works, but not a broken heart.";
String pattern = "broken";
StringBuffer sb = new StringBuffer();
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(source);
System.out.println("source:"+source);
int i=0;
while(m.find()) {
System.out.println(++i + "번째 매칭:" + m.start() + "~"+ m.end());
// broken을 drunken으로 치환하여 sb에 저장한다.
m.appendReplacement(sb, "drunken");
}
m.appendTail(sb);
System.out.println("Replacement count : " + i);
System.out.println("result:"+sb.toString());
}
}
위의 예제에서 m.find()를 통해서 처음으로 m.appendReplacement(sb, "drunken")호출되면 source의 시작부터 "broken"을 찾은 위치까지의 내용에 "drunken"을 더해서 저장한다
-> sb : "A drunken"
while문 두 번째 돌때
-> sb : "A drunken hand works, but not a drunken"
m.appendTail(sb) 통해서 마지막으로 치환된 이후의 부분 sb에 덧붙힘.
-> sb :" A drunken hand works, but not a drunken heart."
(4) java.util.StringTokenizer 클래스
- 긴 문자열을 구분자(delimiter)를 기준으로 token이라는 여러개의 문자열로 잘라내는데 사용.
- Stirng.split() 사용해도 되지만, 정규식 사용해야 하므로, 정규식 익숙하지 않으면 StringTokenizer 사용하는것이 간단하고 명확한 결과 얻을 수 있다.
그러나 StringTokenizer는 구분자로 단 하나의 문자 밖에 사용하지 못하기 때문에 보다 복잡한 형태의 구분자로 문자열을 나누어야 할 때는 어쩔 수 없이 정규식 사용해야 한다.
- StringTokenizer(String str, String delim) 으로 구분자 토큰으로 간주 x
StringTokenizer(String str, String delim, boolean returnDelims) 으로 구분자 토큰으로 boolean true 설정시 구분자도 token으로 간주.
- countTokens() 메소드로 전체 토큰의 수를 반환
- hasMoreTokens() : 토큰이 남아있는지 알려줌
- nextToken() : 다음 토큰 반환
** 구분자를 여러 문자 지정 가능!! ex) "+-*/=()"를 구분자로 넣어주면 전체가 하나의 구분자가 아닌 각각의 문자가 모두 구분자
* split()과 StringTokenizer의 차이 : split()은 빈 문자열도 토큰으로 인식. but StringTokenizer는 빈 문자열을 토큰으로 인식하지 않음.
1. 정규식에 대해서
2. Pattern과 Matcher
3. 비트연산
4. String.format
5. String클래스의 replace()와 replaceAll()의 차이. 언제 어떨때 써야 하는가
6. String 앞에 문자 붙히기 : str += str.charAt(i)?
----
카카오 다트게임, 비밀지도 문제 다른 사람 것 풀이 확인.
출처 :
자바의 정석 3판 (도우출판)
'Programming > Data Structures & Algorithms' 카테고리의 다른 글
정렬(Sorting) - 버블, 선택, 삽입 (0) | 2022.09.15 |
---|---|
Stack과 Queue (0) | 2022.07.26 |
이번주 코테문제 풀면서 배운것 2 (0) | 2022.07.17 |
이번주 코테문제 풀면서 배운것. (0) | 2022.06.13 |
Boyer-Moore 법 (문자열 검색 알고리즘) (0) | 2022.05.28 |
- Total
- Today
- Yesterday