자바 스터디

[자바의 정석] CH10 1,2

changha. 2023. 8. 13. 13:29

1.1 날짜와 시간 

 

1.2. Calendar클래스

추상 클래스이므로 getInstance()를 통해 구현된 객체를 얻어야 한다.

 

- get()으로 날짜와 시간 필드 가져오기 - int get(int field)

Calendar cal = Calendar.getInstance(); // 현재 날짜와 시간으로 셋팅됨
int thisYear = cal.get(Calendar.YEAR); // 올해가 몇년인지 알아낸다. 
int lastDayOfMonth = cal.getActualMaximum(Calendar.DATE); // 이 달의 마지막날

- Calendar에 정의된 필드 

...
Calendar today = Calendar.getInstance(); // Calendar객체를 생성
System.out.println("이 해의 년도 : " + today.get(Calendar.YEAR)); // 이 해의 년도 : 2023
System.out.println("월(0~11, 0:1월) " + today.get(Calendar.MONTH)); // 월(0~11, 0:1월): 8

 

2 형식화 클래스

- 숫자와 날짜를 원하는 형식으로 쉽게 출력 가능(숫자, 날짜 -> 형식 문자열)

double number = 1234567.89;
DecimalFormat df = new DecimalFormat("#.#E0");
String result = df.format(number); // result = "1.2E6"

- 형식 문자열에서 숫자와 날짜를 뽑아내는 기능(형식 문자열 -> 숫자, 날짜)

DecimalFormat df = new DecimalFormat("#.###.##");
Number num = df.parse("1,234,567,89");
double d = num.doubleValue(); // 1234567.89

parse는 문자열을 Number타입(모든 숫자 래퍼클래스의 최고 조상)의 객체로 바꿈

 

형식화에 사용될 패턴을 정의하는데, 데이터를 정의된

패턴에 맞춰 형식화할 수 있을 뿐만 아니라 역으로 형식화된 데이터에서 원래의 데이터를 얻어낼 수도 있다.

2.1 DecimalFormat

형식화 클래스 중에서 숫자를 형식화 하는데 사용됨(숫자 -> 형식 문자열) 

public class Ex10_7 {
    public static void main(String[] args) {
        DecimalFormat df = new DecimalFormat("#,###.##");
        DecimalFormat df2 = new DecimalFormat("#.###E0");

        try{
            Number num = df.parse("1,234,567.89"); // 형식문자열 -> 숫자 
            System.out.print("1,234,567.89" + " -> ");

            double d = num.doubleValue();
            System.out.print(d + " -> "); 

            System.out.println(df2.format(num)); // 숫자 -> 형식문자열 

        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

 

2.2 SimpleDateFormat

- 날짜와 시간을 다양한 형식으로 출력할 수 있게 해준다.

Date today = new Date(); //Sun Aug 13 12:36:26 KST 2023
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); //2023-08-13
String result = df.format(today);

- 특정 형식으로 되어 있는 문자열에서 날짜와 시간을 뽑아낼 수도 있다. 

 

public class Ex10_7 {
    public static void main(String[] args) {
        DateFormat df = new SimpleDateFormat("yyyy년 MM월 dd일");
        DateFormat df2 = new SimpleDateFormat("yyyy/MM/dd");


        try{
            Date d = df.parse("2015년 11월 23일");
            String result = df2.format(d);
            System.out.println(result); // 2015/11/23
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

시간과 관련된 기호

외울 필요 없고 필요할 때 찾아서 쓰면 될 것 같다.

 

2.3 ChoiceFormat

특정 범위에 속하는 값을 문자열로 변환해준다. 연속적 또는 불연속적인  범위의 값들을 처리하는데 있어서 if,switch문은 적절하지 못한 경우가 많다. 이럴 때 ChoiceFormat을 사용하면 코드를 간단하고 직관적으로 만들 수 있다. 

public class ChoiceFormatEx1 {
    public static void main(String[] args) {
        double[] limits = {60, 70, 80, 90}; // 낮은 값부터 큰 값 순으로 적어야 함 
        // limits, grades간의 순서와 개수를 맞춰야 한다. 
        String[] grades = {"D", "C", "B", "A"}; 
        int[] scores = {100, 95, 88, 70, 52, 60, 70};

        ChoiceFormat form = new ChoiceFormat(limits, grades);

        for(int i=0; i < scores.length; i++){
            System.out.println(scores[i] + ":" + form.format(scores[i]));
        }

    }
}

public class ChoiceFormatEx1 {
    public static void main(String[] args) {
        String pattern = "60#D|70#C|80<B|90#A";
        int[] scores = {91, 90, 80, 88, 70, 52, 60};

        ChoiceFormat form = new ChoiceFormat(pattern);

        for(int i=0; i < scores.length; i++){
            System.out.println(scores[i] + ":" + form.format(scores[i]));
        }

    }
}

# : 경계값을 포함 

< : 경계값을 포함하지 않음 

 

2.4 MessageFormat

데이터를 정해진 양식에 맞게 출력할 수 있도록 도와준다. 데이터가 들어갈 자리를 마련해 놓은 양식을 미리 작성하고 프로그램을 이용해서 다수의 데이터를 같은 양식으로 출력할 때 사용하면 좋다. 

 

String text = MessageFormat.format("My name is {0}", "전창하");
System.out.println(text);

//output
//My name is 전창하
public static void main(String[] args) {
        String tableName = "CUST_INFO";
        String msg = "INSERT INTO " + tableName +
                        " VALUES (''{0}'',''{1}'',''{2}'',''{3}'');";
        Object[][] arguments = {
                {"이자바", "02-123-1234", "27", "07-09"},
                {"김프로", "02-123-1234", "33", "07-09"}
        };
        for (int i=0; i < arguments.length; i++){
            String result = MessageFormat.format(msg, arguments[i]);
            System.out.println(result);
        }
    }

다수의 데이터를 Database에 저장하기 위한 Insert문으로 변환하는 경우 등에 사용하면 좋을 것이다.

홑따옴표(')는  MessageFormat의 양식에 escape문자로 사용되기 때문에 문자열 msg내에서 홑따옴표를 사용하려면 연속으로 두번 사용해야 한다.