1. java.util.Objects클래스
- Object클래스의 보조 클래스
- 모든 메서드가 static임
- 객체의 비교나 널 체크(null check)에 유용
- Object클래스의 메서드와 이름이 같을 경우는 클래스의 이름을 붙여줘야 함
1) 널 체크(null check)
static boolean isNull(Object obj) // null이면 true, 아니면 false
static boolean nonNull(Object obj) // isNull()과 정반대의 결과
// 객체가 null이 아니어야 하는 경우에 사용
// 객체가 null이면 NullPointerException을 발생
static <T> T requireNonNull(T obj)
static <T> T requireNonNull(T obj, String message)
static <T> T requireNonNull(T obj, Supplier<String> messageSupplier)
// ex)
void setName(String name) {
this.name = Objects.requireNonNull(name, "name must not be null.");
}
2) 객체의 비교
static int compare(Object a, Object b, Comparator c) // 같으면 0, 크면 양수, 작으면 음수
static boolean equals(Object a, Object b) // 객체 비교하여 같으면 true, 다르면 false
static boolean deepEquals(Object a, Object b) // 객체를 재귀적으로 비교하므로 다차원 배열의 비교도 가능
// Object클래스와 다르게 null검사를 하지 않아도 됨
// 내부적으로 null검사를 함
// 둘 다 null일 경우 true를 반환
// ex)
String[][] str2D = new String[][] {{"aaa","bbb"},{"AAA","BBB"}};
String[][] str2D2 = new String[][] {{"aaa","bbb"},{"AAA","BBB"}};
System.out.println(Objects.equals(str2D, str2D2)); // false
System.out.println(Objects.deepEquals(str2D, str2D2)); // true
3) 그 외
static String toString(Object o)
static String toString(Object o, String nullDefault)
// null검사를 하는 것 빼고 Object클래스와 동일함
static int hashCode(Object o)
static int hash(Object... values)
// null검사를 하는 것 빼고 Object클래스와 동일함
2. java.util.Random클래스
- Math.raondom()은 내부적으로 Random클래스의 인스턴스를 생성해서 사용함
동일한 표현
Math.random() = new Random().nextDouble()
- Math.random()과 다르게 Random클래스는 종자값(seed)을 설정할 수 있음
- 종자값(seed)이 같은 Random인스턴스들은 항상 같은 난수를 같은 순서대로 반환함
1) Random클래스의 생성자와 메서드
메서드 | 설 명 |
Random() | System.현재시간을 종자값(seed)으로 이용하는 Random인스턴스 생성 |
Random(long seed) | 매개변수seed를 종자값으로 하는 Random인스턴스 생성 |
boolean nextBoolean() | boolean타입의 난수 반환 |
void nextBytes(byte[] bytes) | bytes배열에 bytes타입의 난수를 채워서 반환 |
double nextDouble() | double타입의 난수 반환 (0.0 <= x < 1.0) |
float nextFloat() | float타입의 난수 반환 (0.0 <= x < 1.0) |
double nextGaussian() | 평균은 0.0이고 표준편차는 1.0인 가우시안(Gaussian)분포에 따른 double타입의 난수 반환 |
int nextInt() | int타입의 난수 반환 (int 범위) |
int nextInt(int n) | 0~n의 범위에 있는 int타입의 난수 반환 (0 <= x < n) |
long nextLong() | long타입의 난수 반환 (long 범위) |
void setSeed(long seed) | 종자값을 주어진 값(seed)으로 변경 |
3. 정규식(Regular Expression) - java.util.regex패키지
1) 정규식(Regular Expression)이란?
- 텍스트 데이터 중에서 원하는 조건(패턴, pattern)과 일치하는 문자열을 찾아내기 위해 사용
- 미리 정의된 기호와 문자를 이용해서 작성한 문자열
- 많은 양의 텍스트 파일 중에서 원하는 데이터를 쉽게 뽑아내거나 입력된 데이터가 형식에 맞는지 체크할 수 있음
- java.util.regex.Pattern : 정규식 정의
- java.util.regex.Matcher : 정규식(패턴)을 데이터와 비교
- 자주 쓰이는 정규식 패턴
정규식 패턴 | 설 명 | 결 과 |
c[a-z]* | c로 시작하는 영단어 | c, ca, co, car, |
c[a-z] | c로 시작하는 두 자리 영단어 | ca, co, |
c[a-zA-Z] | c로 시작하는 두 자리 영단어 (a~z 또는 A~Z, 대소문자 구분 안 함) |
cA, ca, co |
c[a-zA-z0-9]c\w | c로 시작하고 숫자와 영어로 조합된 두 글자 | cA, ca, co, c0, |
.* | 모든 문자열 | |
c. | c로 시작하는 두 자리 문자열 | cA, ca, co, c., c0, c#, |
c.* | c로 시작하는 모든 문자열(기호 포함) | cA, ca, co, c., c0, c#, car, count, |
c\. | c.와 일치하는 문자열'.'은 패턴작성에 사용되는 문자이므로 escape문자인 '\'를 사용해야 함 | c., |
c\d c[0-9] |
c와 숫자로 구성된 두 자리 문자열 | c0, c2, |
c.*t | c로 시작하고 t로 끝나는 모든 문자열 | combat, count, |
[b|c].* [bc].* [b-c].* |
b 또는 c로 시작하는 문자열 | bat, baby, b, c, cA, c2, count, |
[^b|c].* [^bc].* [^b-c].* |
b 또는 c로 시작하지 않는 문자열 | date, apple, elice, |
.*a.* | a를 포함하는 모든 문자열 * : 0 또는 그 이상의 문자 |
bat, baby, ca, car, combat, date, |
.*a.+ | a를 포함하는 모든 문자열 + : 1 또는 그 이상의 문자 |
bat, baby, car, combat, date |
[b|c].{2} | b 또는 c로 시작하는 세 자리 문자열 (b 또는 c 다음에 두 자리이므로 모두 세 자리) |
bat, car, |
4. java.util.Scanner클래스
- JDK1.5부터 추가
- 화면, 파일, 문자열과 같은 입력소스로부터 문자데이터를 읽어오는데 사용
1) Scanner클래스의 생성자와 메서드
Scanner(String source)
Scanner(File source)
Scanner(InputStream source)
Scanner(Readable source)
Scanner(ReadableByteChannel source)
Scanner(Path source)
// 정규식 표현(Regular expression)을 이용한 라인단위의 검색 지원
// 구분자(delimiter)에도 정규식 표현 사용 가능
Scanner useDelimiter(Pattern pattern)
Scanner useDelimiter(String pattern)
2) JDK1.5 이전과 이후
// JDK1.5 이전
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
// JDK1.5 이후
Scanner s = new Scanner(System.in);
String input = s.nextLine();
3) 입력 값에 따른 메서드
Scanner sc = new Scanner(System.in);
boolean b = sc.nextBoolean();
byte b2 = sc.nextByte();
short s = sc.nextShort();
int i = sc.nextInt();
long l = sc.nextLong();
double d = sc.nextDouble();
float f = sc.nextFloat();
String str = sc.nextLine();
5. java.util.StringTokenizer클래스
- 긴 문자열을 지정된 구분자(delimiter)를 기준으로 토큰(token)이라는 여러 개의 문자열로 잘라내는 데 사용
- String의 split(String regex), Scanner의 useDelimiter(String pattern)와 같지만 정규식 표현을 사용하지 않아도 된다는 차이점이 있음
1) StringTokenizer의 생성자와 메서드
생성자 / 메서드 | 설 명 |
StringTokenizer(String str, String delim) | 문자열(str)을 지정된 구분자(delim)로 나누는 StringTokenizer를 생성 (구분자는 토큰으로 간주되지 않음) |
StringTokenizer(String str, String delim, boolean returnDelims) | 문자열(str)을 지정된 구분자(delim)로 나누는 StringTokenizer를 생성, returnDelims의 값을 true로 하면 구분자도 토큰으로 간주됨 |
int countTokens() | 전체 토큰의 수 반환 |
boolean hasMoreTokens() | 토큰이 남아있는지 알려줌 |
String nextToken() | 다음 토큰 반환 |
- StringTokenizer는 단 한 문자의 구분자만 사용할 수 있음
- delim을 "+-*/"과 같이 여러 문자를 주어도 각각의 문자가 구분자로 처리됨
2) split()과 StringTokenizer의 차이점
...
String data = "100,,,200,300";
// (1) split()을 사용하는 경우
String[] result = data.split(",");
for(int i = 0; i < result.length; i++)
System.out.print(result[i] + "|");
System.out.println("개수:" + result.length);
// (2) StringTokenizer를 사용하는 경우
StringTokenizer st = new StringTokenizer(data, ",");
int j = 0;
while(st.hasMoreTokens()) {
System.out.print(st.nextToken() + "|");
j++;
}
System.out.println("개수:" + j);
- split() : 빈 문자열도 토큰으로 인식 O
- StringTokenizer : 빈 문자열은 토큰으로 인식 X
- split()은 데이터를 토큰으로 잘라낸 결과를 배열에 담아 반환하기 때문에, 데이터를 토큰으로 바로바로 잘라서 반환하는 StringTokenizer보다 성능이 떨어짐
6. java.math.BigInteger클래스
- long타입보다 훨씬 큰 정수값을 다룰 수 있음
- 내부적으로 int배열을 사용해서 값을 다룸
- 성능은 long타입보다 떨어짐
- 부호(signum)는 따로 저장하고, 배열(mag)에는 값 자체만 저장
final int signum; // 부호. 1(양수), 0, -1(음수) 셋 중의 하나
final int[] mag; // 값(magnitude)
1) BigInteger의 생성
BigInteger val;
val = new BigInteger("12345678901234567890"); // 문자열로 생성
val = new BigInteger("FFFF", 16); // n진수(radix)의 문자열로 생성
val = BigInteger.valueOf(1234567890L); // 숫자로 생성
2) 다른 타입으로의 변환
// BigInteger를 문자열, byte배열로 변환하는 메서드
String toString() // 문자열로 변환
String toString(int radix) // 지정된 진법(radix)의 문자열로 변환
byte[] toByteArray() // byte배열로 변환
// BigInteger를 기본형으로 변환하는 메서드
int intValue()
long longValue()
float floatValue()
double doubleValue()
// 메서드에 'Exact'가 붙으면 변환 결과가 변환한 타입의 범위에 속하지 않을 시
// ArithmeticException 예외를 발생시킴
byte byteValueExact()
int intValueExact()
long longValueExact()
3) BigInteger의 연산
BigInteger add(BigInteger cal) // 덧셈(this + val)
BigInteger subtract(BigInteger cal) // 뺄셈(this - val)
BigInteger multiply(BigInteger cal) // 곱셈(this * val)
BigInteger divide(BigInteger cal) // 나눗셈(this / val)
BigInteger remainder(BigInteger cal) // 나머지(this % val)
4) 비트 연산 메서드
int bitCount() // 2진수로 표현했을 때, 1의 개수(음수는 0의 개수)를 반환
int bitLength() // 2진수로 표현했을 때, 값을 표현하는데 필요한 bit수
boolean testBit(int n) // 우측에서 n+1번째 비트가 1이면 true, 0이면 false
BigInteger setBit(int n) // 우측에서 n+1번째 비트를 1로 변경
BigInteger clearBit(int n) // 우측에서 n+1번째 비트를 0으로 변경
BigInteger flipBit(int n) // 우측에서 n+1번째 비트를 전환(1->0, 0->1)
7. java.math.BigDecimal클래스
- 실수형과 달리 정수를 이용해서 실수를 표현
정수 x 10-scale
scale : 0부터 Integer.MAX_VALUE 사이의 범위에 있는 값, 소수점 이하의 자리수
- BigDecimal은 정수를 저장하는데 BigInteger를 사용
private final BigInteger intVal; // 정수(unscaled value)
private final int scale; // 지수(scale)
private transient int precision; // 정밀도(precision) - 정수의 자릿수
1) BigDecimal의 생성
BigDecimal val;
val = new BigDecimal("123.4567890"); // 문자열로 생성
val = new BigDecimal(123.456); // double타입의 리터럴로 생성
val = new BigDecimal(123456); // int, long타입의 리터럴로 생성
val = BigDecimal.valueOf(123.456); // 생성자 대신 valueOf(double)사용
val = BigDecimal.valueOf(123456); // 생성자 대신 valueOf(int)사용
2) 다른 타입으로의 변환
// BigDecimal를 문자열로 변환하는 메서드
String toPlainString() // 어떤 경우에도 다른 기호없이 숫자로만 표현
String toString() // 필요하면 지수형태로 표현할 수도 있음
// BigDecimal를 기본형으로 변환하는 메서드
int intValue()
long longValue()
float floatValue()
double doubleValue()
// 메서드에 'Exact'가 붙으면 변환 결과가 변환한 타입의 범위에 속하지 않을 시
// ArithmeticException 예외를 발생시킴
byte byteValueExact()
short shortValueExact()
int intValueExact()
long longValueExact()
BigInteger toBigIntegerExact()
3) BigDecimal의 연산
BigDecimal add(BigDecimal cal) // 덧셈(this + val)
BigDecimal subtract(BigDecimal cal) // 뺄셈(this - val)
BigDecimal multiply(BigDecimal cal) // 곱셈(this * val)
BigDecimal divide(BigDecimal cal) // 나눗셈(this / val)
BigDecimal remainder(BigDecimal cal) // 나머지(this % val)
4) 반올림 모드 - devide()와 setScale()
- 다른 연산과 달리 나눗셈을 처리하기 위한 메서드는 다양한 버전이 존재
- roundingMode : 반올림 처리방법, BigDecimal에 정의된 'ROUND_'로 시작하는 상수들 중 하나를 선택하여 사용
- 열거형 RoundingMode에 정의된 상수들을 사용하는 것이 좋음
CEILING : 올림
FLOOR : 내림
UP : 양수일 때는 올림, 음수일 때는 내림
DOWN : 양수일 때는 내림, 음수일 때는 올림
HALF_UP : 반올림(5이상 올림, 5미만 버림)
HALF_EVEN : 반올림(반올림 자리의 값이 짝수면 HALF_DOWN, 홀수면 HALF_UP)
HALF_DOWN : 반올림(6이상 올림, 6미만 버림)
UNNECESSARY : 나눗셈의 결과가 딱 떨어지는 수가 아니면 ArithmeticException 발생
BigDecimal divide(BigDecimal divisor)
BigDecimal divide(BigDecimal divisor, int roundingMode)
BigDecimal divide(BigDecimal divisor, RoundingMode roundingMode)
BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)
BigDecimal divide(BigDecimal divisor, MathContext mc)
5) java.math.MathContext
- 반올림 모드와 정밀도(precision)를 하나로 묶어 놓은 것
- MathContext에서 precision은 정수와 소수점 이하를 모두 포함한 자리수
6) scale의 변경
- BigDecimal을 10으로 곱하거나 나누는 대신 scale의 값을 변경할 수 있음
- setScale() 사용
BigDecimal setScale(int newScale)
BigDecimal setScale(int newScale, int roundingMode)
BigDecimal setScale(int newScale, RoundingMode mode)
참고 - Java의 정석 3rd Edition (저자 : 남궁성, 출판 : 도우출판)
'공부 > Java' 카테고리의 다른 글
[Java-10] 날짜와 시간 & 형식화 - java.time패키지 (0) | 2021.04.12 |
---|---|
[Java-10] 날짜와 시간 & 형식화 - Calendar, 형식화 클래스 (0) | 2021.03.12 |
[Java-09] java.lang패키지 - StringBuffer클래스, Math클래스, Wrapper클래스 (0) | 2021.03.09 |
[Java-09] java.lang패키지 - String클래스 (0) | 2021.03.08 |
[Java-09] java.lang패키지 - Object클래스 (0) | 2021.03.05 |