본문 바로가기

JAVA/자바의정석

자바(JAVA) - java.lang 패키지 (4) : 유용한클래스

728x90
반응형

유용한 클래스

java.util 패키지에는 많은 수의 클래스가 있다 그중 자주 사용되는 중요한 클래스들만 글을 써보려고 한다.

 

[1] java.util.Objects 클래스

Object클래스의 보조 클래스로 Math클래스처럼 모든 메서드가 'static'이다. 객체의 비교나 널 체크(null check)에 유용하다.

static boolean isNull(Object obj)
static boolean nonNull(Object obj)

isNull( )은 해당 객체가 null 인지 확인해서 null이면 true 아니면 false를 반환한다.

nonNull( )은 isNull( )과 반대의 역할을 한다.

그리고 requireNonNull( )은 해당 객체가 널이 아니어야하는 경우에 사용한다. 만일 객체가 널이면, NullPointerException을 발생시킨다. 

void setName(String Name) {
	this.name = Objects.requireNonNull(name, "name must not be null.");
   }

Object 클래스에는 두 객체의 등가비교를 위한 equals( )만 있고, 대소비교를 위한것이 없었는데 Objects 에는 compare( )가 추가 되었다. compare( )는 두 비교대상이 같으면 0, 크면 양수, 작으면 음수를 반환한다.

static int compare(Object a , Object b, Comparator c)

[2] java.util.Random 클래스

난수를 얻는 방법을 생각하면 Math.random()이 먼저 떠오르겠지만 , 이 외에도 Random 클래스를 사용하면 난수를 얻을 수 있다.

Random() System. 현재시간을 seed로 이용하는 Random 인스턴스를 생성
Random(long seed) 매개변수 seed를 종자값으로 하는 Random 인스턴스를 생성
boolean nextBoolean()  boolean형 난수 반환 
 int nextInt()  int형 난수 반환 
 long nextLong()   long형 난수 반환
 int nextInt(int n)  0이상 n미만의 범위내에 있는 int형 난수 반환 
 float nextFloat()   0,0이상 1.0미만의 float형 난수 반환 
 double nextDouble()   0.0이상 1.0미만의 double형 난수 반환 

 

[3] 정규식(Regular Expression) - java.util.regex 패키지

정규식이란 텍스트 데이터 중에서 원하는 조건(패턴)과 일치하는 문자열을 찾아내기 위해 사용하는 것으로 미리 정의된 기호와 문자를 이용해서 작성한 문자열을 말한다.

정규식을 이용하면 많은 양의 텍스트 파일 중에서 원하는 데이터를 손쉽게 뽑아낼 수도 있고 입력된 데이터가 형식에 맞는지 체크할 수도 있다.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class UtilPack {
    public static void main(String[] args) {
        String[] data = {"bat", "baby", "bonus", "cA", "ca", "co", "car", "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.println(data[i]+",");
            }
        }
    }
}

1. 정규식을 매개변수로 Pattern 클래스의 static 메서드인 Pattern compile (String regex)을 호출하여 Pattern 인스턴스를 얻는다.

2. 정규식으로 비교할 대상을 매개변수로 Pattern 클래스의 Matcher를 호출해서 인스턴스를 얻는다.

3. Matcher 인스턴스에 boolean matches( )를 호출해서 정규식에 부합하는지 확인한다.

자주 사용하는 패턴의 정규 표현식을 나타내보면 다음과 같다.

정규 표현식 의미
^[0-9]*$ == \\d 숫자
^[a-zA-Z]*$ 알파벳
^[가-힣]*$ 한글
^[a-zA-Z0-9] 알파벳이나 숫자
^[a-zA-Z0-9]+@[a-zA-Z0-9]+\\.[a-z]+$ 이메일(Email)
\w+@\w+\.\w+(\\.\\w+)? 이메일(Email)
^01(?:0|1|[6-9])-(?:\\d{3}|\\d{4})-\\d{4}$ 휴대폰 번호

 

정규식의 일부를 괄호로 나누어 묶어 그룹화 할수 있다. 그룹화된 부분은 하나의 단위로 묶이는 셈이 되어서 한 번 또는 그 이상의 반복을 의마하는 '+' 나 '*'가 뒤에 오면 그룹화된 부분이 적용대상이 된다. 그리고 그룹화된 부분은 group(int i)를 이용해서 나누어 얻을 수 있다.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegularEx3 {
    public static void main(String[] args) {
        String source = "HP:011-1111-1111, HOME:02-999-9999";
        String pattern = "(0\\d{1,2})-(\\d{3,4})-(\\d{4})";

        Pattern p = Pattern.compile(pattern);
        Matcher m = p.matcher(source);

        int i = 0;
        while (m.find()){
            System.out.println(++i + ": " + m.group() + " -> " + m.group(1)
                                + ", " + m.group(2) + ", " + m.group(3));
        }
    }
}

출력결과

1: 011-1111-1111 -> 011, 1111, 1111
2: 02-999-9999 -> 02, 999, 9999

 

위의 예제에서 '(0\\d{1,2})-(\\d{3,4})-(\\d{4})'로 괄호를 이용해서 정규식을 세부분으로 나누었는데 예제와 결과에서 알 수 있듯이 매칭되는 문자열에서 첫 번째 그룹은 group(1)로 두번 째 그룹은 group(2)와 같이 호출함으로써 얻을 수 있다.

group( ) 또는 group(0)은 그룹으로 매칭된 문자열을 전체를 나누어지지 않은 채로 반환한다.

0\\d{1,2} - 0으로 시작하는 최소 2자리 최대 3자리 숫자(0포함)

\\d{3,4} - 최소 3자리, 최대 4자리의 숫자

\\d{4} - 4자리의 숫자

 

[2] java.util.Scanner 클래스

Scanner는 화면, 파일, 문자열과 같은 입력소스로부터 문자데이터를 읽어오는데 도움을 줄 목적으로 jdk1.5부터 추가되었다.

Scanner(String source)
Scanner(File source)
Scanner(InputStream source)
Scanner(Readable source)
Scanner(ReadableByteChannel source)
Scanner(Path source)

스캐너에는 다음과 같은 생성자를 지원하기 때문에 다양한 입력소스로부터 데이터를 읽을 수 있다.

또한 Scanner는 정규식 표현(Regular expression)을 이용한 라인단위의 검색을 지원하며 구분자(delimiter)에도 정규식 표현을 사용할 수 있어서 복잡한 형태의 구분자도 처리가 가능하다.

 

[3] java.util.StringTokenizer 클래스

StringTokenizer 클래스는 긴 문자열을 지정된 구분자(delimiter)를 기준으로 토큰(token)이라는 여러 개의 문자열로 잘라내는 데 사용된다.

StringTokenizer 클래스를 이용하는 방법 이외에도

String의 split(String regex)나, Scanner의 useDelimiter(String pattern)를 사용할 수도 있지만 정규식 표현을 사용해야 하므로 익숙하지 않은 경우 StringTokenizer를 사용하는것이 낫다.

StringTokenizer 생성자

생성자설명

StringTokenizer(String str) 디폴트 생성자.
StringTokenizer(String str, delim) 구분 문자(delim)를 인자로 받는 생성자.
StringTokenizer(String str, String delim, boolean returnDelims) 구분 문자(delim)와 구분문자의 반환 여부를 인자로 받는 생성자.

StringTokenizer 메소드

메소드설명

int countTokens 나눠진 토큰의 수를 반환한다.
boolean hasMoreElements() 반환할 다음 요소가 있으면 true, 없으면 false를 반환한다. hasMoreTokens()와 동일하다.
boolean hasMoreTokens() 반환할 다음 토큰이 있으면 true, 없으면 false를 반환한다.
Object hasMoreElements() 나눠진 토큰의 수를 반환한다. Object를 반환하지만 실제는 String이다.
String hasMoreTokens() 나눠진 토큰의 수를 반환한다.
String nextToken() 다음 토큰을 반환한다. 이전 토큰은 제거한다.
String nextToken(String delim) 구분 문자(delim)를 변경 후 변경 다음 토큰을 반환한다.

 

[4] java.math.BigInteger 클래스

정수형으로 표현할 수 있는 값의 한계가 있다. 가장 큰 정수형 타입인 long으로 표현할 수 있는 값은 10진수로 19자리 정도이다. 이 값도 상당히 큰 값이지만, 과학적 계산에서는 더 큰 값을 다뤄야할 때가 있다. 그럴때 BigInteger를 사용한다.

BinInteger는 내부적으로 int배열을 사용해서 값을 다룬다. 그래서 long타입보다 훨씬 큰 값을 다룰 수 있는 것이다. 대신 성능은 long 타입보다 떨어진다.

final int signum;	//부호
final int[] mag;	// 값(magnitude)

 

728x90
반응형