java.util 패키지를 알아보자.



시간과 날짜 클래스

date

- 자바 초창기

- 단순히 시간과 날짜를 사용 할 때

calender

- 최근에 나온 보완되어 나온 클래스

- 그 외 시간과 날짜를 이야기 할 때

- 주로 많이 쓴다.


참고로 Java API에서 Deprecated 가 나온다면 될 수 있으면 쓰지말라는 뜻이다.

date클래스는 오래되었고 date클래스를 대체할 새로운 기능이 많이 나왔기 때문에 

문서를 읽다보면 Deprecated 가 많이 나오는 것을 볼 수 있다.


package prjUtil;

import java.util.Calendar;

import java.util.Date;

public class DateCalenderTest {

    public static void main(String[] args) {

        //Date();는 하나만이 아니라 여러개를 만들 수 있어서 불편하다.

        Date date = new Date();

        

        //new Date() 현재 시간을 보여줘라

        //인스턴스생성인데 어떻게 날짜와 시간을 보여줄까?

        //.toString이 생략되어있다.

        System.out.println(new Date());

        //java에 있는 모든 객체는 object 객체에 소속된 .toString이 달려있다.

        //.toString은 현재 객체에 있는 값을 문자열로 만들어준다.

        System.out.println(new Date().toString());

        

        //원래 값은 무엇이 나올까

        DateCalenderTest test = new DateCalenderTest();

        System.out.println(test.toString());

        //현지 시간설정에 맞게 설정할 수 있는 메서드

        System.out.println(new Date().toLocaleString());

        

        //Calender는 .getInstance() 메서드를 만들어야지만 사용가능하다.

        //내가 원하는 날짜와 시간 형식을 만들 수 있다.

        //싱글턴 패턴이기 때문에 절대로 두개 이상의 인스턴스를 만들지 않는다.

        Calendar cal = Calendar.getInstance();

        System.out.println(" 현재 날짜와 시간은 " +

                cal.get(Calendar.YEAR)+" 년 "+

                (cal.get(Calendar.MONTH)+1)+" 월 "+

                cal.get(Calendar.DATE)+" 일 "+

                cal.get(Calendar.HOUR)+" 시입니다. ");

        

    }

    @Override

    public String toString() {

        return "내가 임의로 만든 문자열";

    }

    

}


※ 결과값

Thu Oct 26 16:44:00 KST 2017

Thu Oct 26 16:44:00 KST 2017

내가 임의로 만든 문자열

2017. 10. 26 오후 4:44:00

현재 날짜와 시간은 2017 년 10 월 26 일 4 시입니다.



언어는 운영체제가 가지고 있는 기능을 끌어다 쓸 수 있도록 하는 것임을 유념하자.


Random 클래스를 써보자


package prjUtil;

import java.util.Random;

public class RandomTest {

    public static void main(String[] args) {

        // TODO 난수 처리

        Random r = new Random();

        

        

        

        //System.out.println("임의의 수 : " + r.nextInt());

        //System.out.println("임의의 수 : " + r.nextInt(5));

        //System.out.println("임의의 수 : " + (r.nextInt(5)+1));

        

        //내가 원하는 범위를 잡을 때 공식 = (최대값-최소값+1)+최소값

        System.out.println(r.nextInt((5-1+1)+1));

        

        //51~72사이의 임의의 값

        System.out.println(r.nextInt((71-52+1)+52));

        

        //7~13

        System.out.println(r.nextInt((7-13+1)+7));

        

        for(int i=0; i<5; i++) {

            System.out.println(r.nextInt(71-52+1)+52);

        }

    }

    

}


/*

* 1. 가위 바위 보 게임 만들어보기

* 가위 : 1, 바위 : 2, 보 : 3

* 입력 : 3

* 결과 : 승리(또는 패배) 2전 3승

*

* 2. 로또 추출기

* - 로또 추출기로 로또 사보기

*

*/



StringTokenizer 메서드를 알아보자.


문자열 단위로 분리해주는 클래스

StringTokenizer() 클래스 : 복잡한 문자열 구분 처리

split() 메서드 : 간단한 문자열 구분 처리


.trim()은 좌우의 공백을 없애주는 String클래스의 메소드이다.


StringTokenizer() 클래스는 열거형(Enumeration)인스턴스를 만들어준다.


열거형(Enumeration)이란?

index로 접근할 수 없다.

데이터를 다루기 쉽게 순서대로 접근 한 것이다.

순서대로 줄을 세워놓고 순서대로 꺼낸다.

순서대로 처리할 때는 배열보다 빠르다.

Enum이라고 줄여서 이야기한다.


package prjUtil;

import java.util.StringTokenizer;

public class StringTokenizerTest {

    public static void main(String[] args) {

        // TODO StringTokenizer() 클래스 : 복잡한 처리, split() 메서드 : 간단한 처리

        //split()으로 문자열을 단순하게 구분해본다.

        String data = "홍길동, 임꺽정, 신돌석, 강감찬";

        //복잡하게 되어있는 문자열을 StringTokenizer()로 구분한다.

        String data2 = "홍길동+ 임꺽정* 신돌석? 권율~강감찬";

        

        //split 배열로 구분하기

        //하나의 문자열을 콤마을 기준으로 스플릿이라는 메서드를 통해 4개의 문자열로 구분하겠다.

        String[] names = data.split(",");

        for(int i=0; i<names.length; i++) {

            //.trim()은 좌우의 공백을 없애주는 String클래스의 메소드이다.

            System.out.println(names[i].trim());

        }

        

        /*

        //기본생성자가 없어서 빨간줄이 나온다.

        //API문서를 찾아보면 사용하는 방법이 나온다. 2번째 방법을 쓴다.

        //StringTokenizer에서 생성되는 인스턴스는 열거형이다.

        StringTokenizer token = new StringTokenizer(data, ",");

        //token. 분리된 토큰의 개수를 알려준다.

        System.out.println(token.countTokens());

        */

        //구분자가 한가지가 아니더라도 여러개의 구분자를 지정할 수 있다.

        StringTokenizer token = new StringTokenizer(data2, "+*?~");

        //token. 분리된 토큰의 개수를 알려준다.

        System.out.println(token.countTokens());

        

        

        /*

        //순서대로 데이터를 써내올 수 있다.

        System.out.println(token.nextToken());

        System.out.println(token.nextToken());

        System.out.println(token.nextToken());

        System.out.println(token.nextToken());        

        */

        

        //.hasMoreTokens() 계속 데이터를 꺼내주다가 없으면 끝난다.

        while(token.hasMoreTokens()) {

            System.out.println(token.nextToken().trim());

        }

        

        String data3 = "JavaTM 언어사양 제2판:James Gosling,"

                + "Bill Join, Gilad Brach:무라카미 마사키:"

                + "피어슨 에듀케이션:2000:5500";

        

    

        

    }

}


crrentTimeMillis 메서드


시간차이 구하기 : System.crrentTimeMillis

CurrentTime는 System class에 있는 메소드이다.(java.lang 패키지에 있다.)

시간을 1000/1까지 측정할 수 있다.

System 클래스에 있는 nanoTime() 메서드는 1000/1보다 더 정말 한시간 측정이 가능하다.



package prjUtil;

public class CurrentTimeTest {

    public static void main(String[] args) throws InterruptedException {

        // TODO 시간차이 구하기 : System.crrentTimeMillis

        //CurrentTime는 System class에 있는 메소드이다.(java.lang 패키지에 있다.)

        //시간을 1000/1까지 측정할 수 있다.

        //System 클래스에 있는 nanoTime() 메서드는 1000/1보다 더 정말 한시간 측정이 가능하다.

        

        long start = System.currentTimeMillis();

        

        int sum = 0;

        for(int i=0; i<1000000000; i++) {

            sum = sum + i;

        }

        

        //이 시점에서 2초동안 멈추겠다.

        //걸린시간이 2초 + 처리한 시간이 나온다.

        Thread.sleep(2000);

        

        long end = System.currentTimeMillis();

        

        //1000분의 1초가 나온다.

        System.out.println("걸린시간:" + (end-start));

        

        //초단위까지만 보겠다. 이외의 정밀한 시간이 날라간다.

        System.out.println("걸린시간:" + ((end-start)/1000));

        

    }

}


※ 결과값

걸린시간:2380

걸린시간:2



DecimalFormat class 정리


숫자의 모양 형식을 원하는 모양으로 꾸며준다.


Wrapper 클래스

비객체와 객체는 캐스팅을 할 수 없다.

비객체와 객체가 서로 캐스팅이 필요할 때는 어떻게 해야할까?

이때는 java.lang의 Wrapper 클래스의 도움을 받는다.

모든 wrapper class는 java.lang 패키지에 있다.


Wrapper 클래스는 객체가 아닌 비객체로 객체로 포장해서 객체처럼 쓸 수 있게 해준다.        

Java에서 유일하게 객체가 아닌 비객체는 기본 Data Type 8개 밖에 없다.

각 데이터타입별 Wrapper클래스에 있다. Wrapper클래스는 비객체 데이터타입을 객체로 만들어준다.

Wrapper클래스의 이름은 각 데이터 타입에서 따왔다. 첫 글자는 무조건 대문자이다.


예)Double, Inteser ... 


Wrapper클래스의 자세한 설명은 아래를 참조하자.

http://hyeonstorage.tistory.com/168



package prjUtil;

import java.text.DecimalFormat;

public class DecimalFormatTest {

    public static void main(String[] args) {

        // TODO java.text.DecimalFormat

        // 숫자의 모양 형식을 원하는 모양으로 꾸며준다.

        

        double d1=2.523, d2=3.123;

        double result = d1 +d2;

        System.out.println(result);

        

        DecimalFormat df = new DecimalFormat("#.####");

        //.format 이라는 메서드가 result 값을 필터링

        //모든 값을 String으로 돌려줌

        String strResult = df.format(result);

        System.out.println(strResult);

        

        //여기서 계산을 하려면 어떻게 해야할까?

        //그렇다면 실수형이 되야 하는데 String이라서 어렵다.

        //비객체와 객체는 캐스팅을 할 수 없다.

        //이때는 java.lang의 Wrapper 클래스의 도움을 받는다.

        //pars 데이터타입 은 각 데이터타입별 Wrapper클래스에 있다..

        double d3 = Double.parseDouble(strResult);

        System.out.println(d3+d2+d1);

        

    }

}





★ 야구게임을 만들어보자! ★


package prjUtil;

import java.util.Random;

import java.util.Scanner;

/*

* 규칙

* 1. 임의의 숫자 3개 준비(컴퓨터)

*       - 중복이 없어야 한다.

*       - 단자리 숫자 (1~9)

* 2. 맞출 때 까지 게임진행

* ---------------------

*

* 과제

* 1. 모듈화

* 2. ball카운트 비교조건문을 반복문으로 바꿔라

* 3. 시도 횟수

* 4. 걸린 시간

* 5. 순위

* 6. 레벨조정 (숫자 하나씩 추가)

* 7. 점수

*       

*/

public class BaseBallGame {

    public static void main(String[] args) {

        // TODO 숫자야구게임

        

        

        //1.컴퓨터의 값 입력

        int com[] = new int[3];            // 3자리 숫자 배열 클래스 인스턴스 생성

        Random r = new Random();        // 랜덤으로 숫자 생성 클래스 인스턴스 생성

        

        for(int i=0; i<com.length; i++) {    //com 배열의 길이만큼 반복문을 돈다.

            com[i] = r.nextInt(9)+1;        //com 배열에서 1부터 9까지 랜덤숫자를 생성

            

            

            if(i == 1) {    //두번째 숫자가 저장되었을 떄 중복된다면 처음으로

                if(com[i] == com[i-1]) {    //현재입력된 숫자와 처음입력된 숫자를 비교한다.

                    i--;                    //현재 숫자와 처음 입력된 숫자가 같다면                     

                }                            //i는 0으로 돌아가 다시 반복문을 돈다.

            }

            if(i == 2) {    //세번째 숫자가 저장되었을 때

                if(com[i] == com[i-1] || com[i] == com[i-2]) {

                        i--;

                }//세번째 숫자와 첫번째 숫자, 두번째 숫자와 첫번째 숫자를 비교하여 중복된다면 다시.

                

            }

            

        }    

        System.out.println(com[0] + "," + com[1] + "," + com[2]);    


// if문을 for문으로 할 수도 있습니다.

//        if(i!=0) {

//        for(int j=0; j<i; j++) {

//            if(com[i]==com[j]) {

//                i--;

//                break;

//            }

//        }

//    }

//    

//}

//System.out.println(com[0] + "," + com[1] + "," + com[2]);

        

        //2.유저의 값 입력

        int user[] = new int[3];    // 유저 클래스 인스턴스 생성

        Scanner scan = new Scanner(System.in);    //스캐너를 입력해서 받음

        int strike = 0, ball = 0;                //스트라잌과 볼 변수 받음

        int inputNum = 0;                        //

        

        for(;;) {        // 무한반복을 한다.

            strike = 0; // 변수를 0으로 초기화 해준다.

            ball = 0;    // 변수를 0으로 초기화 해준다.

            

            System.out.println("숫자 입력 :");

            inputNum = scan.nextInt(); //입력받은 값을 user의 0번 방, 1번방, 2번 방에 따로 입력

            //처음 3자를 숫자가 들어올 때 100단위, 10단위, 1단위를 나누어서 저장

            

            user[0] = inputNum/100;         // 100을 나누어 1째 자리 수 비교

            user[1] = (inputNum%100)/10;    // 100의 나머지에 10을 나누어 2번째 자리 수 가져감

            user[2] = (inputNum%100)%10;    // 100의 나머지와 10의 나머지인 1을 가져감

            

            //System.out.println(user[0] + "," + user[1] + "," + user[2]);

        

            for(int i=0; i<3; i++) {

                if(com[i] == user[i]) {    //위치에 값을 비교

                    //==은 문자열일 때만 주소를 비교하고, 숫자일 때는 숫자를 비교한다.

                    strike++;

                }

            }

        

            // 컴퓨터가 생각한 숫자와 사용자가 생각한 숫자가

            // 위치가 다르지만 같다면 ball이 한개 올라간다.

            if(com[0]==user[1] || com[0]==user[2]) {

                ball++;

            }

            if(com[1]==user[0] || com[1]==user[2]) {

                ball++;

            }

            if(com[2]==user[0] || com[2]==user[1]) {

                ball++;

            }

            if(strike == 3) {

                System.out.println("축하합니다.");

                break;

            }

            //아웃임과 동시에 입력한 숫자가 무엇인지 알 수 있도록 보여준다.

            else if(strike==0 && ball==0){

                System.out.println("아웃입니다." +

                    user[0] + "," + user[1] + "," + user[2]);

            }

            else {

                System.out.println(strike+"스트라이크"+ball+

                    "볼 : " + user[0] + ","+ user[1] + "," + user[2]);

                

            }

            

        }

        

    }

}



※ 결과값


4,1,8
숫자 입력 :
234
0스트라이크1볼 : 2,3,4
숫자 입력 :
467
1스트라이크0볼 : 4,6,7
숫자 입력 :
418
축하합니다.


'개발 > Java' 카테고리의 다른 글

[java] 제네릭 Generic  (0) 2017.10.28
[java] 컬렉션 Collection  (0) 2017.10.28
[java] 인터페이스(InterFace)  (0) 2017.10.26
[java] 패키지 package  (0) 2017.10.25
[java] 클래스 (Class) part.3 : 상속 (Inheritance )  (0) 2017.10.24

+ Recent posts