1. java.util.Objects
Object 클래스의 보조 클래스로 Math 클래스처럼 모든 메서드가 static이다. 객체의 비교나 null check 에 유용하다.
// 객체가 null 인지 아닌지 확인하여 결과를 반환
static boolean isNull(Object obj)
static boolean nonNull(Object obj)
// 해당 객체가 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)
// 두 객체의 대소 비교를 해서 같으면 0, 크면 양수, 작으면 음수를 반환한다.
static int compare(Object a, Object b, Comparator c)
// 두 객체가 같은지 비교하는 메서드이다.
// deepEquals 는 재귀적으로 비교를 하여 배열도 비교할 수 있다.
static boolean equals(Object a, Object b)
static boolean deepEquals(Object a, Object b)
// null check 한 후 문자열을 반환한다.
static String toString(Object o)
static String toString(Object o, String nullDefault)
// Object 클래스의 hashCode() 를 호출하는데, 만약 null 이면 0을 반환한다.
static int hashCode(Object o)
static int hash(Object... values)
java.util.Objects 클래스를 사용할 때 유의할 점은 Object 클래스의 동명의 메서드와 충돌이 날 수 있기 때문에 클래스 이름을 붙여서 사용해야 한다.
2. java.util.Random 클래스
Math.random() 메서드 외에 Random 클래스를 사용하여 난수를 얻을 수 있다. Math.random() 은 내부적으로 Random 클래스의 인스턴스를 사용하는 것이기 때문에 기능에 차이는 없다.
double randNum1 = Math.random();
double randNum2 = new Random().newDouble(); // 위의 문장과 동일하다.
int randNum3 = new Random().newInt(10);
둘의 차이점이라면 Random 클래스에서는 종자값 (seed) 을 설정할 수 있다는 것이다. 종자값은 난수를 만드는 공식에 사용되는데, 종자값이 같은 인스턴스들은 같은 숫자를 같은 순서로 난수를 출력한다.
- Random 클래스의 생성자와 메서드
생성자 Random() 은 종자값을 System.currentTimeMillis() 로 하기 때문에 매번 얻는 난수가 달라진다.
메서드 | 설명 |
Random() | System 현재 시간을 종자값으로 이용하는 Random 인스턴스 생성 |
Random(long seed) | 매개변수 seed를 종자값으로 하는 Random 인스턴스 생성 |
boolean nextBoolean() | boolean 타입의 난수를 반환 |
void nextBytes(byte[] bytes) | bytes 배열에 byte 타입의 난수를 채워서 반환한다. |
double nextDouble() float nextFloat() |
각각 double, float 타입의 난수를 반환한다. (0.0 <= ㅌ < 1.0) |
double nextGaussian() | 평균은 0.0이고 표준편차는 1.0인 가우시안 분포에 따른 double 형의 난수를 반환한다. |
int nextInt() | int 타입의 난수 반환 (int 범위) |
int nextInt(int n) | 0~n 의 범위에 있는 int 값을 반환한다. (n은 제외) |
long nextLong() | long 타입의 난수를 반환한다. (long 범위) |
void setSeed(long seed) | 인스턴스의 종자값을 seed 로 변경한다. |
3. java.util.regex 패키지
정규식 (Regular Expression) 은 텍스트 데이터 중에서 원하는 조건, 패턴과 일치하는 문자열을 찾아내기 위해 사용하는 것으로 미리 정의된 기호와 문자를 이용해서 작성한 문자열을 말한다.
Java API 문서에서 java.util.regex.Pattern 내용을 확인하면 정규식에 사용되는 기호와 작성 방법 들이 설명되어 있다. Patter 클래스의 사용 예제는 다음과 같다.
import java.util.regex.*;
class Example {
public static void main(String[] args) {
String[] arr = { ... };
Pattern p = Pattern.compile("c[a-z]*"); // c로 시작하는 소문자 영어를 의미하는 정규표현식
for(String str : arr) {
Matcher m = p.matcher(str); // Matcher 클래스를 사용하여 해당 문자열이 pattern 에 매칭되는지 확인할 수 있다.
if(m.matches()) System.out.println(str); // matches() 메서드는 정규식에 부합하는지 아닌지를 boolean 를 반환한다.
}
}
}
4. java.util.Scanner 클래스
Scanner 는 화면, 파일, 문자열과 같은 입력소스로부터 문자데이터를 읽어오는데 도움을 줄 목적으로 JDK1.5 부터 추가된 클래스이다. Scanner 에는 다양한 생성자를 가지고 있어서 String, File, InputStream, Readable, ReadableByteChannel, Path 등의 입력소스로부터 데이터를 읽을 수 있다.
입력받을 값의 형식에 따라 다음의 메서드들을 사용하여 입력을 받을 수 있다. 실제 입력된 데이터의 형시에 맞는 메서드를 사용하지 않는다면 InputMismatchException 이 발생한다.
형식 | 메서드 |
boolean | nextBoolean() |
byte | nextByte() |
short | nextShort() |
int | nextInt() |
long | nextLong() |
double | nextDouble() |
float | nextFloat() |
String | nextLine() |
5. java.util.StringTokenizer 클래스
StringTokenizer 는 긴 문자열을 지정된 구분자를 기준으로 토큰이라는 여러 개의 문자열로 잘라내는 데 사용된다. 예를 들어 "100,200,300,400" 이라는 문자열을 ',' 라는 구분자로 잘라내는 경우 "100", "200", "300", "400" 의 4개의 문자열을 토큰으로 얻을 수 있다.
- 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 생성자와 메서드의 사용 예제는 다음과 같다.
import java.util.*;
class Example {
public static void main(String[] args) {
String source = "123 345 456 567";
StringTokenizer st = new StringTokenizer(source, " ");
while(st.hasMoreTokens()) {
System.out.println();
}
}
}
6. java.math.BigInteger 클래스
int와 long 타입의 정수형으로 표현할 수 있는 수의 값에는 한계가 있다. 이보다 큰 수를 표현하기 위해 사용하는 클래스가 BigInteger 클래스이다.
BigInteger 클래스는 내부적으로 int 배열을 사용해서 값을 다룬다. 그렇기 때문에 long 타입보다 더 큰 값을 다룰 수 있다. BigInteger는 String 처럼 immutable 이다. 그리고 모든 정수형이 그렇듯이 BigInteger 역시 값을 2의 보수의 형태로 표현한다.
- BigInteger 의 생성
BigInteger 를 생성하는 방법은 여러 가지가 있는데, 문자열로 숫자를 표현하는 것이 일반적이다. 정수형 리터럴로는 표현할 수 있는 값의 한계가 있기 때문이다.
BigInteger val;
val = new BigInteger("12345678901234567890");
val = new BigInteger("FFFF", 16); // 16진수 값으로 입력받아서 인스턴스 생성
val = BigInteger.valueOf(123456789L);
- 다른 타입으로 변환
BigInteger 를 다른 타입으로 변환하는 메서드들이다. 여기서 Exact 가 붙은 메서드들은 변환 결과가 변환 타입의 범위에 속하지 않으면 ArithmeticExcaption 을 발생시킨다.
타입 | 메서드 |
String | toString() |
String | toString(int radix) |
byte[] | toByteArray() |
int | intValue() |
long | longValue() |
float | floatValue() |
doueble | doubleValue() |
byte | byteValueExact() |
int | intValueExact() |
long | longValueExact() |
- BigInteger 연산
BigInteger a = new BigInteger("123345678901234567890");
BigInteger b = new BigInteger("12334567890");
a.add(b); // 덧셈
a.subtract(b); // 뺄셈
a.multiply(b); // 곱셈
a.divide(b); // 나눗셈
a.remainder(b); // 나머지
- 비트 연산 메서드
BigInteger 클래스에서 비트 연산으로 수행하는 메서드들이다.
메서드 | 설명 |
int bitCount() | 2진수로 표현했을 때, 1의 개수 반환 (음수는 0의 개수를 반환) |
int bitLength() | 2진수로 표현했을 때, 값을 표현하는데 필요한 bit 수 |
boolean testBit(int n) | 우측에서 n + 1 번째 비트가 1인지에 대한 boolean 값 |
BigInteger setBit(int n) | 우측에서 n + 1 번째 비트를 1로 변경 |
BigInteger clearBig(int n) | 우측에서 n + 1 번째 비트를 0으로 변경 |
BigInteger flipBig(int n) | 우측에서 n + 1 번째 비트를 전환 (1 -> 0, 0 -> 1) |
7. java.math.BigDecimal 클래스
double 타입은 표현할 수 있는 값의 범위가 넓지만 정밀도가 최대 13자리 밖에 되지 않고 실수형의 특성상 오차를 피할 수 없다. BigDecimal 은 실수형과 달리 정수를 이용해서 실수를 표현한다. 실수를 정수와 10의 제곱의 곱으로 표현한다.
private final BigInteger intVal; // 정수값
private final int scale; // 지수. 소수점 이하의 자리수.
private transient int precision; // 정밀도 - 정수의 자리수
예를 들어 123.45 는 12345 * 10-2 로 표현할 수 있으며, BigDecimal 에서는 intVal 은 12345, scale 은 2가 된다. 그리고 precision 은 5가 되는데, 이 값은 정수 전체자리수를 의미한다.
- BigDecimal 의 생성
BigDecimal 을 생성하는 방법은 여러가지가 있는데, 문자열로 숫자를 표현하는 것이 일반적이다. 기본형 리터럴로는 표현할 수 있는 값의 한계가 있기 때문이다. 그리고 이때 주의할 점은 double 타입의 값을 매개변수로 주는 경우 오차가 발생할 수 있다는 것이다.
BigDecimal val;
val = new BigDecimal("123.45678");
val = new BigDecimal(123.45678);
val = new BigDecimal(12345678);
val = BigDecimal.valueOf(123.456);
val = BigDecimal.valueOf(123456);
- 다른 타입으로 변환
BigDecimal 을 다른 타입으로 변환하는 메서드들이다. 여기서 Exact 가 붙은 메서드들은 변환 결과가 변환 타입의 범위에 속하지 않으면 ArithmeticExcaption 을 발생시킨다.
타입 | 메서드 |
String | toPlainString() |
String | toString() |
int | intValue() |
long | longValue() |
float | floatValue() |
double | doubleValue() |
byte | byteValueExact() |
short | shortValueExact() |
int | intValueExact() |
long | longValueExact() |
BigInteger | toBigIntegerExact() |
- BigDecimal 의 연산
BigDecimal a = new BigDecimal("123.456");
BigDecimal b = new BigDecimal("12.");
a.add(b); // 덧셈
a.subtract(b); // 뺄셈
a.multiply(b); // 곱셈
a.divide(b); // 나눗셈
a.remainder(b); // 나머지
- 반올림 : divide(), setScale()
BigDecimal 으로 나눗셈 연산을 할 때, 매개변수로 반올림을 어떻게 처리할 것인가, 몇 번째 자리 (scale) 에서 반올림 할 것인가 등을 지정할 수 있다.
반올림 처리 방법에 대해서 사용할 때는 다음의 RoundingMode 의 상수들을 매개변수로 주어 설정할 수 있다.
상수 | 설명 |
CEILING | 올림 |
FLOOR | 내림 |
UP | 양수일 때는 올림, 음수일 때는 내림 |
DOWN | 양수일 때는 내림, 음수일 때는 올림 |
HALF_UP | 반올림 (5 이상 올림, 5 미만 내림) |
HALF_EVEN | 반올림 (반올림 자리의 값이 짝수면 HALF_DOWN, 홀수면 HALF_UP) |
HALF_DOWN | 반올림 (6 이상 올림, 6 미만 내림) |
UNNECESSARY | 나눗셈의 결과가 딱 떨어지는 수가 아니면 ArithmeticException 발생 |
BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("3.0");
System.out.println(a.divide(b)); // 무한 소수로 인한 ArithmeticException 발생 - 0.333 ...
System.out.println(a.divide(b, RoundingMode.HALF_UP)); // 0.333
scale 을 변경할 때는 setScale() 메서드를 사용하면 된다.
'프로그래밍언어 > JAVA' 카테고리의 다른 글
[JAVA] try-with-resources statement (0) | 2021.12.30 |
---|---|
[JAVA] Serialization & Deserialization (0) | 2021.12.29 |
[JAVA] java.lang (0) | 2021.12.15 |
[JAVA] 예외처리 (Exception handling) (0) | 2021.12.07 |
[JAVA] 내부 클래스 (Inner class) (0) | 2021.11.29 |