[Chapter 9] java.lang 패키지와 유용한 클래스_2

slchoi·2022년 1월 18일
0

자바의 정석

목록 보기
19/19
post-thumbnail

'자바의 정석 3rd Edition'를 공부하며 정리한 내용입니다.

2. 유용한 클래스


2.1 java.util.Objects 클래스

  • Object 클래스의 보조 클래스로 모든 메서드가 'static'
  • 객체의 비교나 null check에 유용
종류설명
isNull()해당 객체가 널인지 확인해서 널이면 true를 반환하고 아니면 false를 반환
nonNull()isNull()과 반대
requireNonNull()해당 객체가 널이 아니어야 하는 경우에 사용. 객체가 널이면 예외를 발생시킴
compare()두 비교대상이 같으면 0, 크면 양수, 작으면 음수를 반환
equals()Object 클래스의 equals()와 같은 역할을 하지만 내부적으로 널 검사를 진행하기 때문에 따로 널 검사를 할 필요가 없음 (두 비교대상이 모두 널인 경우 참을 반환)
deepEquals()객체를 재귀적으로 비교하기 때문에 다차원 배열의 비교가 가능
toString()Object 클래스의 toString()과 같은 역할을 하지만 내부적으로 널 검사를 진행하기 때문에 따로 널 검사를 할 필요가 없음
hashCode()내부적으로 널 검사를 한 후 Object 클래스의 hashCode()를 호출 (널일 경우 0을 반환)

2.2 java.util.Random 클래스

// 1. Math.random() 사용
double randNum = Math.random();

// 2. Random 클래스 사용
double randNum = new Random().nextDouble();
  • Math.random()은 내부적으로 Random 클래스의 인스턴스를 생성해서 사용하는 것이므로 난수를 얻고 싶은 경우 두 방법 중 하나를 선택해서 사용하면 됨
  • Math.random()과 Random의 차이점은 종자값(seed)를 설정할 수 있다는 것
    • seed를 설정하면 seed가 갖은 Random 인스터스들은 항상 같은 난수를 같은 순서대로 반환
    • seed는 난수를 만드는 공식에 사용되는 값으로 같은 종자값을 넣으면 같은 난수를 얻게 됨

2.3 정규식(Regular Expression) - java.util.regex 패키지

  • 정규식: 텍스트 데이터 중에서 원하는 조건(패턴, pattern)과 일치하는 문자열을 찾아내기 위해 사용하는 것으로 미리 정의된 기호와 문자를 이용해 작성한 문자열을 의미
  • 정규식에 사용되는 기호와 작성방법 참고
  • Pattern은 정규식을 정의하는데 사용되고 Matcher는 정규식(패턴)을 데이터와 비교하는 역할을 함

정규식을 정의하고 데이터를 비교하는 과정
1. 정규식을 매개변수로 Pattern 클래스의 static 메서드인 Pattern compile(String regex)을 호출하여 Pattern 인스턴스를 얻음

Pattern p = Pattern.compile("c[a-z]*");
  1. 정규식으로 비교할 대상을 매개변수로 Pattern 클래스의 Matcher matcher(CharSequence input)를 호출해서 Matcher 인스턴스를 얻음
Matcher m = p.matcher(data[i]);
  1. Matcher 인스턴스에 boolean matches()를 호출해서 정규식에 부합하는지 확인
if(m.matches())
  • group(int i): 정규식의 일부를 괄호로 묶어서 그룹화할 수 있는데 그룹화된 부분은 하나의 단위로 묶이게 되어 한 번 또는 그 이사의 반복을 의미하는 '+'나 '*'가 뒤에 오면 그룹화된 부분이 적용 대상이 됨. 그룹화된 부분은 group(int i)를 이용해서 나눌 수 있음
  • find(): 주어진 소스 내에서 패턴과 일치하는 부분을 찾아내면 true를 반환하고 찾지 못하면 false를 반환
    • find()를 호출해서 패턴과 일치하는 부분을 찾아낸 다음, 다시 find()를 호출하면 이전에 발견한 패턴과 일치하는 부분의 다음부터 다시 패턴매칭을 시작
    • find()로 정규식과 일치하는 부분을 찾으면, 그 위치를 start()와 end()로 알아낼 수 있고 appendReplacement(StringBuffer sb, String replacement)를 이용해서 원하는 문자열로 치환할 수 있음

2.4 java.util.Scanner 클래스

  • Scanner는 화면, 파일, 문자열과 같은 입력소스로부터 문자데이터를 읽어오는데 도움을 줌
  • Scanner는 정규식 표현을 이용한 라인단위의 검색을 지원하며 구분자(delimiter)에도 정규시 표현을 사용할 수 있어 복잡한 형태의 구분자도 처리가 가능
  • 입력받을 값이 숫자라면 nextLine() 대신 nextInt() 또는 nextLong()과 같은 메서드 사용 가능

2.5 java.uril.StringTokenizer 클래스

  • StringTokenizer는 긴 문자열을 지정된 구분자(delimiter)를 기준으로 토큰(token)이라는 여러 개의 문자열로 잘라내는데 사용됨
  • String의 split(String regex) 혹은 Scanner의 useDelimiter(String pattern)를 사용할 수도 있지만, 이 두가지 방법은 정규식을 사용해야하므로 정규식에 익숙하지 않은 경우 StringTokenizer를 사용하는 것이 간단
  • StringTokenizer는 구분자로 단 하나의 문자 밖에 사용하지 못하기 때문에 복잡한 형태의 구분자로 문자열을 나누어야 할 때는 정규식을 사용해야 함

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()다음 토큰을 반환

2.6 java.math.BigInteger 클래스

final int signum;	// 부호. 1(양수), 0, -1(음수) 셋 중 하나
final int[] mag;	// 값
  • BigInteger는 내부적으로 int 배열을 사용해서 값을 다룸
  • BigInteger는 String처럼 불변이고 2의 보수 형태로 표현
    • 부호를 따로 저장하고 배열에는 값 자체만 저장
    • 부호만 다른 두 값의 mag는 같고 signum은 다름

2.7 java.math.BigDecimal 클래스

private final BigInteger intVal;	// 정수(unscaled value)
private final int scale;		//  지수(scale)
private transient int precision;	// 정밀도(precision) - 정수의 자릿수
  • BigDecimal은 실수형과 달리 정수를 이용해서 실수를 표현
  • 실수를 정수와 10의 제곱의 곱으로 표현 (정수 X 10^(-scale))
    • scale: 0부터 Integer.MAX_VALUE 사이의 범위에 있는 값
  • BigDecimal은 정수를 저장하는데 BigInteger를 사용
  • scale은 소수점 이하의 자리수를 의미하고, precision은 정수의 전체 자리수를 의미
profile
예비 백엔드 개발자

0개의 댓글