CSE 검색 결과

223개 발견
  1. 미리보기
    2016.04.21 - Palpit

    [Java] 예외 처리 - 사용자 정의 예외

  2. 미리보기
    2016.04.21 - Palpit

    [Java] 예외 처리 - 리소스 닫기 & 예외 넘기기(Throw)

  3. 미리보기
    2016.04.21 - Palpit

    [Java] 예외 처리 - 예외 처리 코드

  4. 미리보기
    2016.04.21 - Palpit

    [Java] 예외 처리 - 예외 & 실행 예외

  5. 미리보기
    2016.04.19 - Palpit

    [Java] 자바 기본 API - java.time Package

  6. 미리보기
    2016.04.19 - Palpit

    [Java] 자바 기본 API - Format Class

  7. 미리보기
    2016.04.16 - Palpit

    [Java] 자바 기본 API - Date, Calendar Class

  8. 미리보기
    2016.04.16 - Palpit

    [Java] 자바 기본 API - Math, Random Class

조회수 확인

예외처리는 여러 절로 구성되어 있습니다.



예외와 예외 클래스 & 실행 예외

예외 처리 코드 

자동 리소스 닫기 & 예외 넘기기(Throw)

사용자 정의 예외





사용자 정의 예외

 프로그램을 개발하다 보면 자바 표준 API에서 제공하는 예외 클래스만으로는 다양한 종류의 예외를 표현할 수가 없습니다.


 이와 같이 애플리케이션 서비스와 관련된 예외를 에플리케이션 예외(Application Exception)라고 합니다. 이 예외는 개발자가 직접 정의해서 만들어야 하므로 사용자 정의 예외(User Define Exception) 이라고도 합니다.



 사용자 정의 예외 클래스 선언

  사용자 정의 예외 클래스는 컴파일러가 체크하는 일반 예외로 선언할 수도, 실행 예외로 선언할 수도 있습니다. 각각의 Exception, RuntimeException을 상속해서 작성하시면 됩니다.



1
2
3
4
public class XXXException extends [ Exception | RuntimeException ] {
    public XXXException() {}
    public XXXException(String message) { super(message); }
}
cs




  String 타입의 파라 미터를 갖는 생성자는 상위 클래스의 생성자를 호출하여 예외 메세지를 넘겨줍니다.


  다음은 잔고 부족 예외를 사용자 정의 클래스로 선언한 것입니다.


 * BalanceInsufficientException.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package except;
 
 
public class BalanceInsufficientException extends Exception {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    public BalanceInsufficientException() {}
    public BalanceInsufficientException(String msg) {
        super(msg);
    }
}
 
 
 
cs



 

  BalanceInsufficientException은 Exception을 상속하기 때문에 컴파일러에 의해 체크되는 예외가 됩니다. 



 예외 발생시키기

  사용자 정의 예외 또는 자바 표준 예외를 코드에서 발생시키는 방법은 다음과 같습니다.


1
2
throw new XXXException();
throw new XXXException("message");
cs



  다음 예제는 은행 계좌(account) 클래스를 작성한 것입니다. 출금(withdraw)메서드에서 잔고(balance) 플디와 출금액을 비교해서 잔고가 부족하면 BalanceInsufficientExceptioin 을 발생시키도록 했습니다.



 * Account.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package except;
 
 
public class Account {
    private long balance;
    
    public Account() {}
 
    public long getBalance() {
        return balance;
    }
 
    public void setBalance(long balance) {
        this.balance = balance;
    }
 
    public void deposit(int money) {
        balance += money;
    }
    
    public void withdraw(int money) throws BalanceInsufficientException {
        if (balance < money) {
            throw new BalanceInsufficientException("잔고 부족: " + (money - balance) + " 모자람");
        }
        balance -= money;
    }
}
 
 
 
cs






예외 정보 얻기

 try 블록에서 예외가 발생하면 예외 객체는 catch 블록의 매개 변수에서 참조하게 되므로 매개 변수를 이용하면 예외 객체의 정보를 알 수 있습니다. 모든 예외 객체는 Exception을 상속하기 때문에 메서드를 예외 객체에서 호출 할 수 있습니다. 그 중에서도 가장 많이 사용되는 getMessage() 와 printStackTrace()가 있습니다.


 다음 예제는 Account 클래스를 이용해서 예금과 출금을 합니다. 출금할 때 withdraw() 메서드를 이용하므로 예외 처리가 꼭 필요합니다. 예외 처리 코드에서 BalanceInsufficientException 객체의 getMessage() 메서드와 printStackTrace() 메서드로 예외에 대한 정보를 얻어내고 있습니다.


 * AccountExam.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package except;
 
 
public class AccountExam {
 
    public static void main(String[] args) {
        Account act = new Account();
        
        act.deposit(25000);
        System.out.println("예금액: " + act.getBalance());
        
        try {
            act.withdraw(50000);
        } catch (BalanceInsufficientException e) {
            String msg = e.getMessage();
            System.out.println(msg);
            System.out.println();
            e.printStackTrace();
        }
    }
 
}
 
 
 
cs







end




 * 신용권의 '이것은 자바다'를 참조한 포스팅입니다.

다른 카테고리의 글 목록

CSE/Java 카테고리의 포스트를 톺아봅니다
조회수 확인

예외처리는 여러 절로 구성되어 있습니다.



예외와 예외 클래스 & 실행 예외

예외 처리 코드 

자동 리소스 닫기 & 예외 넘기기(Throw)

사용자 정의 예외




자동 리소스 닫기

 자바 7부터 추가된 try-with-resources 를 사용하면 예외 발생 여부와 상관없이 사용했던 리소스 객체(각종 입출력 스트림, 서버 소켓, 소켓, 각종 채널)의 close() 메소드를 호출해서 안전하게 닫아줍니다. 


 다음은 이전 자바 6에서 사용했던 리소스 객체 닫기 코드입니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FileInputStream fis = null;
 
try {
 
    fis = new FileInputStream("file.txt");
    ...
 
catch (IOException e) {
 
    ...
 
finally {
    if (fis != null) {
        try {
            fis.close();
        } catch (IOException e) {}
    }
}
 
cs



 finally 블록에서 다시 try-catch 블록으로 fis를 닫아줘야합니다. 다소 복잡한 면이 있습니다. 


 다음으로는 자바7에서 닫는 방법을 예제로 보겠습니다.



 * FileInputStream.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package except;
 
public class FileInputStream implements AutoCloseable {
    private String file;
    
    public FileInputStream(String file) {
        this.file = file;
    }
    
    public void read() {
        System.out.println(file + "을 읽습니다.");
    }
    
    public void close() throws Exception {
        System.out.println(file + "을 닫습니다.");
    }
}
 
 
 
cs



 * TryWithResExam.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package except;
 
 
public class TryWithResExam {
 
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("text.txt")) {
            fis.read();
            throw new Exception();    // 강제적으로 예외 발생
        } catch (Exception e) {
            System.out.println("예외 처리 코드 실행");
        }
    }
 
}
 
 
 
cs






 위처럼 수행하기 위해서 java.lang.AutoCloseable 인터페이스를 구현한 객체여야 합니다. 





예외 떠넘기기

 메소드 내부에서 예외가 발생할 수 있는 코드를 작성할 때 try-catch 블록으로 예외를 처리하는 것이 기본이지만, 경우에 따라서는 메서드를 호출한 곳으로 예외를 떠넘길 수 있습니다.


 이때 사용하는 키워드는 throws 입니다. throws 키워드는 메소드 선언부 끝에 작성되어 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할을 합니다. throws 키워드 뒤에는 떠넘길 예외 클래스를 쉼표로 구분해서 나열해주면 됩니다.


1
2
3
4
리턴타입 메소드명(파라미터,...) throws exceptionClass1, exceptionClass2, ... {
 
}
 
cs



  throws 키워드가 붙어있는 메서드는 반드시 try블록 내에서 호출되어야 합니다. 그리고 catch 블록에서 떠넘겨 받은 예외를 처리해야 합니다. 



 * ThrowsExam.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package except;
 
 
public class ThrowsExam {
 
    public static void main(String[] args) {
        try {
            findClass();
        } catch (ClassNotFoundException e) {
            System.out.println("클래스가 존재하지 않습니다");
        }
    }
    
    public static void findClass() throws ClassNotFoundException {
        Class clasis = Class.forName("what.the.Heck");
    }
 
}
 
 
 
cs





end




 * 신용권의 '이것은 자바다'를 참조한 포스팅입니다.

다른 카테고리의 글 목록

CSE/Java 카테고리의 포스트를 톺아봅니다
조회수 확인

예외처리는 여러 절로 구성되어 있습니다.



예외와 예외 클래스 & 실행 예외

예외 처리 코드 

자동 리소스 닫기 & 예외 넘기기(Throw)

사용자 정의 예외




예외 처리 코드

 프로그램에서 예외가 발생했을 경우 프로그램의 갑작스러운 종료를 막고, 정상 실행을 유지할 수 있도록 처리하는 코드를 예외 처리 코드라고 합니다. 자바 컴파일러는 소스 파일을 컴파일할 때 일반 예외가 발생할 가능성이 있는 코드를 발견하면 컴파일 오류를 발생시켜 개발자로 하여금 강제적으로 예외 처리 코드를 작성하도록 요구합니다.


 그러나 실행 예외는 컴파일러가 체크해주지 않기 때문에 예외 처리 코드를 개발자의 경험을 바탕으로 작성해야 합니다. 예외 처리 코드는 try-catch-finally 블록을 이용합니다.


 try-catch-finally 블록은 생성자 내부와 메소드 내부에서 작성되어 일반 예외와 실행 예외가 발생할 경우 예외처리를 할 수 있도록 해줍니다.


 





 try 블록은 예외 발생 가능한 코드가 위치하고, 예외가 발생하지 않는 다면 catch 블록을 실행하지 않고 finally 블록의 코드를 실행합니다.


 예외가 try 블록에서 발생한다면 catch 블록으로 이동하여 catch 블록의 코드를 실행합니다. finally 블록은 옵션으로 생략가능 합니다.


 Class.forName() 메서드는 파라미터로 주어진 클래스가 존재하면 Class 객체를 리턴하지만, 존재하지 않으면 ClassNotFoundException 예외를 발생시킵니다. 


 * TryCatchExam.java



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package except;
 
 
public class TryCatchExam {
 
    public static void main(String[] args) {
        try {
            Class clasis = Class.forName("what.class.What");
        } catch (ClassNotFoundException e) {
            System.out.println("클래스가 존재하지 않습니다.");
        }
    }
 
}
 
 
 
cs







 위 예제를 실행시키면 4라인에서 ClassNotFoundException이 발생하는데, 이것은 what.class.What 클래스가 존재하지 않기 때문입니다.



 * TryCatchFinallyExam.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package except;
 
public class TryCatchFinallyExam {
 
    public static void main(String[] args) {
        String data1 = null;
        String data2 = null;
        
        try {
            data1 = args[0];
            data2 = args[1];
        } catch(ArrayIndexOutOfBoundsException e) {
            System.out.println("실행 매개값의 수가 부족합니다.");
            return;
        }
        
        try {
            int value1 = Integer.parseInt(data1);
            int value2 = Integer.parseInt(data2);
            
            int result = value1 + value2;
            System.out.println(data1 + " + " + data2 + " = " + result);
            
        } catch (NumberFormatException e) {
            System.out.println("숫자로 변환할 수 없습니다.");
        } finally {
            System.out.println("다시 실행하세요");
        }
    }
 
}
 
 
 
cs






 위 예외가 발생하는 이유는 실행 파라미터를 주지 않았기 때문입니다. 이클립스의 [Run - Run Configurations] 를 클릭해서 아래와 같이 파라미터를 건네주고 실행해봅시다.










예외 종류에 따른 처리 코드

 다중 catch 

  try 블록 내부는 다양한 종류의 예외가 발생할 수 있습니다. 이 경우에는 다중 catch 블록을 작성하는 것입니다. 


  catch 블록이 여러 개라 할지라도 예외가 발생하면 단 하나의 예외 catch 블록만을 처리합니다. 그 이유는 try 블록에서 동시 다발적으로 예외가 발생하지 않고, 하나의 예외가 발생하면 즉시 실행을 멈추고 해당 catch 블록으로 이동하기 때문입니다.



 * CatchByExceptionExam.java



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package except;
 
 
public class CatchByExceptionExam {
 
    public static void main(String[] args) {
        try {
            String data1 = args[0];
            String data2 = args[1];
 
            int value1 = Integer.parseInt(data1);
            int value2 = Integer.parseInt(data2);
            
            int result = value1 + value2;
            System.out.println(data1 + " + " + data2 + " = " + result);
 
        } catch(ArrayIndexOutOfBoundsException e) {
            System.out.println("실행 매개값의 수가 부족합니다.");
            return;
        } catch (NumberFormatException e) {
            System.out.println("숫자로 변환할 수 없습니다.");
        } finally {
            System.out.println("다시 실행하세요");
        }
 
    }
 
}
 
 
 
cs









 멀티 catch

  자바 7부터 하나의 catch 블록에서 여러 개의 예외를 처리할 수 있도록 multi catch 기능을 추가했습니다. 


  catch 괄호 안에 동일하게 처리하고 싶은 예외를 |(파이프)로 연결하면 됩니다.



 * MultiCatchExam.java



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package except;
 
 
public class MultiCatchExam {
 
    public static void main(String[] args) {
        try {
            String data1, data2;
            data1 = args[0];
            data2 = args[2];
            
            int value1, value2;
            value1 = Integer.parseInt(data1);
            value2 = Integer.parseInt(data2);
            
            int result = value1 + value2;
            System.out.println(result);
            
        } catch (ArrayIndexOutOfBoundsException | NumberFormatException e) {
            System.out.println("실행 파라미터의 수가 부족하거나 숫자로 변환할 수 없습니다.");
        } catch (Exception e) {
            System.out.println("알수 없는 예외 발생");
        } finally {
            System.out.println("다시 실행하세요");
        }
    }
 
}
 
 
 
cs








end




 * 신용권의 '이것은 자바다'를 참조한 포스팅입니다.

다른 카테고리의 글 목록

CSE/Java 카테고리의 포스트를 톺아봅니다
조회수 확인

예외처리는 여러 절로 구성되어 있습니다.



예외와 예외 클래스 & 실행 예외

예외 처리 코드 

자동 리소스 닫기 & 예외 넘기기(Throw)

사용자 정의 예외




예외와 예외 클래스

 PC 하드웨어의 오작동 또는 고장으로 인해 응용프로그램 실행 오류가 발생하는 것을 자바에서는 에러(error)라고 합니다. 에러는 JVM 실행에 문제가 생겼다는 것이므로 JVM 위에서 실행되는 프로그램을 아무리 견고하게 만드렁도 결국 실행 불능이 됩니다.


 자바에서는 에러 이외에 예외(Exception)라는 오류가 있습니다. 예외란 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류를 말합니다.(대부분 개발자의 fault 이긴 하지만)

 

 예외가 발생되면 프로그램은 곧바로 종료된다는 점에서는 에러와 동일하지만, 예외는 예외 처리(Exception Handling)를 통해 프로그램을 종료하지 않고 정상 실행 상태가 유지되도록 할 수 있습니다.


 예외는 일반 예외와 실행 예외가 존재합니다. 


 일반 예외는 컴파일러 체크 예외라고도 하는데, 자바 소스를 컴파일하는 과정에서 예외 처리 코드가 필요한지 검사하기 때문입니다.


 실행 예외는 컴파일하는 과정에서 예외 처리 코드를 검사하지 않은 예외를 말합니다. 컴파일 시 예외 처리를 확인하는 차이일 뿐, 두 가지 예외는 모두 예외 처리가 필요합니다. 


 자바에서는 예외를 클래스로 관리합니다. JVM은 프로그램을 실행하는 도중에 예외가 발생하면 해당 예외 클래스로 객체를 생성합니다. 그리고 나서 예외 처리 코드에서 예외 객체를 이용할 수 있도록 해줍니다. 모든 예외 클래스들은 다음과 같이 java.lang.Exception 클래스를 상속받습니다.



 






 일반 예외와 실행 예외 클래스를 구별하는 방법은 일반 예외는 Exception을 상속받지만 RuntimeException을 상속받지 않는 클래스들이고, 실행 예외는 RuntimeException을 상속받는 클래스들입니다. 








실행 예외

 실행 예외는 자바 컴파일러가 체크를 하지 않기 때문에 오로지 개발자의 경험에 의해서 예외 처리 코드를 삽입해야 합니다.



 NullPointerException

  이 예외는 객체 참조가 없는 상태, 즉 null 값을 갖는 참조 변수로 객체 접근 연산자인 도트(.)를 사용했을 때 발생합니다. 객체가 없는 상태에서 객체를 사용하려 했으니 예외가 발생하는 것입니다.



 * NullPointerExceptionExam.java


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package except;
 
 
public class NullPointerExceptionExam {
 
    public static void main(String[] args) {
        String data = null;
        System.out.println(data.toString());
    }
 
}
 
 
 
cs







  프로그램에서 예외가 발생하면 예외 메세지가 이클립스 Console 뷰에 출력되면서 프로그램이 종료됩니다. Console 뷰에 출력되는 내용에는 어떤 예외가 어떤 소스의 몇 번째 코드에서 발생했는지에 대한 정보가 들어있습니다.




 ArrayIndexOutOfBoundsException

  배열에서 인덱스 범위를 초과해서 사용할 경우 실행 예외인 java.lang.ArrayIndexOutOfBoundsException이 발생합니다. 


 * ArrayIndexOutOfBoundsExam.java


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package except;
 
 
public class ArrayIndexOutOfBoundsExam {
 
    public static void main(String[] args) {
        String data1 = args[0];
        String data2 = args[1];
 
        System.out.println("args[0] : " + data1);
        System.out.println("args[1] : " + data2);
    }
 
}
 
 
 
cs








  위의 예제를 실행하면 파라미터를 주지 않았기에 args[0], args[1]과 같이 인덱스를 사용 할 수 없습니다.



 NumberFormatException

  프로그램을 개발하다보면 문자열로 되어있는 데이터를 숫자로 변경하는 경우가 있습니다. 이 메서드들은 파라미터인 문자열이 숫자로 변환될 수 있다면 숫자를 리턴하지만, 숫자로 변환될 수 없는 문자가 포함되어 있다면 java.lang.NumberFormatException을 발생시킵니다.


 * NumberFormatExam.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package except;
 
 
public class NumberFormatExam {
 
    public static void main(String[] args) {
        String correctData = "100";
        String wrongData = "a100";
        
        int correctValue = Integer.parseInt(correctData);
        int wrongValue = Integer.parseInt(wrongData);
    }
 
}
 
 
 
cs

 







  a100 이라는 변수는 숫자로 변환될 수 없기에 위와같은 예외를 발생시키는 것 입니다.



 ClassCastException

  타입 변환(Casting)은 상위 클래스와 하위 클래스 간에 발생하고 구현 클래스와 인터페이스 간에도 발생합니다. 이러한 관계가 아니면 클래스는 다른 클래스로 타입 변환할 수 없습니다. 


  아래 예제는 타입 변환간에 발생하는 ClassCastException을 보여주는 예제입니다.


 * ClassCastExam.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package except;
 
 
public class ClassCastExam {
    public static void main(String[] args) {
        Dog dog = new Dog();
        changeDog(dog);
        
        Cat cat = new Cat();
        changeDog(cat);
        
    }
    
    public static void changeDog(Animal animal) {
        Dog dog = (Dog) animal;    //ClassCastException 발생 가능
    }
}
 
class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}
 
 
 
cs








  라인 9를 보시면 Cat 객체를 파라미터로 주어서 Dog로 변환하려 했기에 예외가 발생하는 것 입니다.





end




 * 신용권의 '이것은 자바다'를 참조한 포스팅입니다.

다른 카테고리의 글 목록

CSE/Java 카테고리의 포스트를 톺아봅니다
조회수 확인

자바 기본 API는 여러 절로 구성되어 있습니다.



Intro

Object Class

Objects Class

System Class

Class Class

String Class

StringTokenizer, StringBuffer, StringBuilder Class

Regular Expression & Pattern Class

Arrays Class

Wrapper Class

Math, Random Class

Date, Calendar Class

Format Class

java.time Package



java.time Package

 자바 8부터 날짜와 시간을 나타내는 여러 가지 API를 새롭게 추가하였습니다. 이 API는 java.util 패키지에 없고 별도의 java.time 패키지와 하위 패키지로 제공됩니다.










 날짜와 시간 객체 생성

  java.time 패키지에는 다음과 같이 날짜와 시간을 표현하는 5개의 클래스가 있습니다.




 

 * DateTimeCreateExam.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package api;
 
 
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
 
public class DateTimeCreateExam {
 
    public static void main(String[] args) throws InterruptedException {
        LocalDate currDate = LocalDate.now();
        System.out.println("현재 날짜: " + currDate);
        
        LocalDate targetDate = LocalDate.of(2030314);
        System.out.println("목표 날짜: " + targetDate);
        
        LocalTime currTime = LocalTime.now();
        System.out.println("현재 시간: " + currTime);
        
        LocalDateTime currTimeDate = LocalDateTime.now();
        System.out.println("현재 날짜와 시간: " + currTimeDate);
        
        ZonedDateTime utcDateTime = ZonedDateTime.now(ZoneId.of("UTC"));
        System.out.println("협정 세계 시간: " + utcDateTime);
        ZonedDateTime nyDateTime = ZonedDateTime.now(ZoneId.of("America/New_York"));
        System.out.println("뉴욕 시간: " + nyDateTime);
        
    }
 
}
 
 
 
cs





 날짜와 시간에 대한 정보 얻기

  LocalDate 와 LocalTime은 프로그램에서 날짜와 시간 정보를 이용할 수 있도록 여러 메서드를 제공합니다.


 * LocalDate : https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html

 * LocalTime: https://docs.oracle.com/javase/8/docs/api/java/time/LocalTime.html



  LocalDateTime과 ZonedDateTime은 날짜와 시간 정보를 모두 갖고 있기 때문에 위 표에 나와 있는 대부분의 메서드를 가지고 있습니다. 단, isLeapYear()는 LocalDate에만 있기 때문에 toLocalDate() 메서드로 LocalDate 로 변환한 후에 사용할 수 있습니다. ZonedDateTime은 시간 존에 대한 정보를 제공하는 다음 메서드들을 추가적으로 제공하고 있습니다.






 * DateTimeInfoExam.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package api;
 
 
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
 
public class DateTimeInfoExam {
 
    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        System.out.println(now);
        
        String strDateTime = now.getYear() + "년 ";
        strDateTime += now.getMonthValue() + "월 ";
        strDateTime += now.getDayOfMonth() + "일 ";
        strDateTime += now.getDayOfWeek() + " ";
        System.out.println(strDateTime);
        
        LocalDate nowDate= now.toLocalDate();
        if (nowDate.isLeapYear()) {
            System.out.println("올해는 윤년이 있네요");
        } else {
            System.out.println("올해는 윤년이 없네요");
        }
        
        ZonedDateTime utcDateTime = ZonedDateTime.now(ZoneId.of("UTC"));
        System.out.println("협정 세계시: " + utcDateTime);
        ZonedDateTime seoulDateTime = ZonedDateTime.now(ZoneId.of("Asia/Seoul"));
        System.out.println("협정 세계시: " + seoulDateTime);
        
        ZoneId zoneID = seoulDateTime.getZone();
        System.out.println("서울 존 아이디: " + zoneID);
        ZoneOffset zoneOffset = seoulDateTime.getOffset();
        System.out.println("서울 존 오프셋: " + zoneOffset);
        
    }
 
}
 
 
 
cs







 날짜와 시간 조작하기

  날짜와 시간 클래스들은 날짜와 시간을 조작하는 메서드와 상대 날짜를 리턴하는 메서드들을 가지고 있습니다.

  

  빼기와 더하기(minusXXX, plusXXX) 각 메서드들은 수정된 LocalDate, LocalTime, LocalDateTime, ZonedDateTime 을 리턴하기 때문에 . 연산자로 연결해서 순차적으로 호출할 수 있습니다.


  다음은 날짜와 시간을 변경하는 메서드들입니다.






 [출처: Java API Documents]


  with(TemporalAdjuster adjuster) 메서드를 제외한 나머지는 이름만으로 어떤 것을 수정하는 지 쉽사리 알 수 있습니다. with() 메서드는 현재 날짜를 기준으로 해의 첫 번째 일 또는 마지막 일, 달의 첫 번째 일 또는 마지막 일,등의 상대적인 날짜를 리턴합니다.


https://docs.oracle.com/javase/8/docs/api/java/time/temporal/TemporalAdjusters.html



 

 날짜와 시간 비교하기

  날짜와 시간 클래스들은 다음과 같이 비교하거나 차이를 구하는 메서드들이 있습니다.







  Period와 Duration 은 날짜와 시간의 양을 나타내는 클래스입니다. Period는 년, 달, 일의 양을 나타내는 클래스이고, Duration은 시, 분, 초, 나노초의 양을 나타내는 클래스입니다. 




 * DateTimeCompareExam.java


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package api;
 
 
import java.time.LocalDateTime;
import java.time.Period;
import java.time.temporal.ChronoUnit;
 
public class DateTimeCompareExam {
 
    public static void main(String[] args) {
        LocalDateTime startDateTime = LocalDateTime.of(202011900);
        System.out.println("시작일: " + startDateTime);
 
        LocalDateTime endDateTime = LocalDateTime.of(2021214900);
        System.out.println("종료일: " + endDateTime);
 
        System.out.println("[종료까지 남은 시간]");
        long remainYear = startDateTime.until(endDateTime, ChronoUnit.YEARS);
        long remainMonth = startDateTime.until(endDateTime, ChronoUnit.MONTHS);
        long remainDay = startDateTime.until(endDateTime, ChronoUnit.DAYS);
        long remainHour = startDateTime.until(endDateTime, ChronoUnit.HOURS);
        long remainMinute = startDateTime.until(endDateTime, ChronoUnit.MINUTES);
        long remainSecond = startDateTime.until(endDateTime, ChronoUnit.SECONDS);
        
        remainYear = ChronoUnit.YEARS.between(startDateTime, endDateTime);
        remainMonth = ChronoUnit.MONTHS.between(startDateTime, endDateTime);
        remainDay = ChronoUnit.DAYS.between(startDateTime, endDateTime);
        remainHour = ChronoUnit.HOURS.between(startDateTime, endDateTime);
        remainMinute = ChronoUnit.MINUTES.between(startDateTime, endDateTime);
        remainSecond = ChronoUnit.SECONDS.between(startDateTime, endDateTime);
        
        System.out.println("남은 해: " + remainYear);
        System.out.println("남은 달: " + remainMonth);
        System.out.println("남은 일: " + remainDay);
        System.out.println("남은 시간: " + remainHour);
        System.out.println("남은 분: " + remainMinute);
        System.out.println("남은 초: " + remainSecond);
        
        System.out.println("[종료까지 남은 기간]");
        Period period = Period.between(startDateTime.toLocalDate(), endDateTime.toLocalDate());
        System.out.print("남은 기간: " + period.getYears() + " 년 ");
        System.out.print(period.getMonths() + "월 ");
        System.out.println(period.getDays() + "일");
        
        
    }
 
}
 
 
 
cs








end

 


 * 이 포스트은 서적 '이것이 자바다' 를 참고하여 작성한 포스트입니다.


다른 카테고리의 글 목록

CSE/Java 카테고리의 포스트를 톺아봅니다

[Java] 자바 기본 API - Format Class

2016.04.19 13:29 - Palpit
조회수 확인

자바 기본 API는 여러 절로 구성되어 있습니다.



Intro

Object Class

Objects Class

System Class

Class Class

String Class

StringTokenizer, StringBuffer, StringBuilder Class

Regular Expression & Pattern Class

Arrays Class

Wrapper Class

Math, Random Class

Date, Calendar Class

Format Class

java.time Package





Format Class

 정수 세 자리마다 화페단위처럼 쉼표를 넣고 싶다면 Format 클래스를 이용하시면 됩니다.


 Format 클래스는 java.text 패키지에 포함되어 있는데, 숫자 형식을 위해 DecimalFormat, 날짜 형식을 위해 SimpleDateFormat, 매개 변수화된 문자열 형식을 위해 MessageFormat 등을 제공합니다.



 DecimalFormat Class

  DecimalFormat은 숫자 데이터를 원하는 형식으로 표현하기 위해 패턴을 사용하는데 다음 표는 패턴의 예를 보여줍니다.








  적용할 패턴을 찾았으면 DecimalFormat 생성자 파라미터로 정해서 객체를 생성하면 됩니다. 그리고 나서 format() 메서드를 호출해서 패턴이 적용된 문자열을 얻으면 됩니다.



1
2
DecimalFormat df = new DecimalFormat("#,###.0");
String result = df.format(1000000000.969);
cs




 * DecimalExam.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package api;
 
 
import java.text.DecimalFormat;
 
public class DecimalExam {
    public static void main(String[] args) {
        double num = 1234567.89;
        
        DecimalFormat df = new DecimalFormat("0");
        System.out.println(df.format(num));
        
        df = new DecimalFormat("#.#");
        System.out.println(df.format(num));
 
        df = new DecimalFormat("#,###.0");
        System.out.println(df.format(num));
        
        df = new DecimalFormat("\u00A4 #,###");
        System.out.println(df.format(num));
        
    }
}
 
 
 
cs








 SimpleDateFormat

  Date 클래스의 toString() 메서드는 영문으로된 날짜를 리턴하는데 만약 특정 문자열 포맷으로 얻고 싶다면 java.text.SimpleDateFormat 클래스를 이용하면 됩니다.



 * SimpleDateFormatExam.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
package api;
 
import java.text.SimpleDateFormat;
import java.util.Date;
 
public class SimpleDateFormatExam {
    public static void main(String[] args) {
        Date now = new Date();
        
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        System.out.println(sdf.format(now));
        
        sdf = new SimpleDateFormat("yyyy년 MM월 dd일");
        System.out.println(sdf.format(now));
        
        sdf = new SimpleDateFormat("yyyy년의 D번째 날");
        System.out.println(sdf.format(now));
        
    }
}
 
 
 
cs







 MessageFormat

  데이터를 파일에 저장하거나, 네트워크로 전송할 때, 그리고 데이터베이스 SQL문을 작성할 때 등 많은 부분에서 일정한 형식의 문자열을 사용합니다. MessageFormat 클래스를 사용하면 문자열에 데이터가 들어갈 자리를 표시해 두고, 프로그램이 동적으로 데이터를 삽입하여 문자열을 완성시킬 수 있습니다.


  MessageFormat은 정적 메서드 format() 을 호출하여 완성된 문자열을 리턴시킵니다. format() 메서드의 첫 번째 파라미터는 매개 변수화된 문자열을 지정하고, 두 번째 이후의 파라미터는 인덱스 순서에 맞게 값을 나열시키면 됩니다. 


 * MessageFormatExam.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
package api;
 
import java.text.MessageFormat;
 
public class MessageFormatExam {
    public static void main(String[] args) {
        String id = "apple";
        String name = "iOS";
        String tel = "010-0101-1010";
        
        String text = "회원 ID: {0} \n이름: {1} \n회원 전화: {2}";
        String result1 = MessageFormat.format(text, id, name, tel);
        System.out.println(result1);
        System.out.println();
 
        String sql = "insert into member values({0}, {1}, {2})";
        Object[] arguments = {id, name, tel};
        String result2 = MessageFormat.format(sql, arguments);
        System.out.println(result2);
        
    }
}
 
 
 
cs






end

 


 * 이 포스트은 서적 '이것이 자바다' 를 참고하여 작성한 포스트입니다.


다른 카테고리의 글 목록

CSE/Java 카테고리의 포스트를 톺아봅니다
조회수 확인

자바 기본 API는 여러 절로 구성되어 있습니다.



Intro

Object Class

Objects Class

System Class

Class Class

String Class

StringTokenizer, StringBuffer, StringBuilder Class

Regular Expression & Pattern Class

Arrays Class

Wrapper Class

Math, Random Class

Date, Calendar Class

Format Class

java.time Package




Date, Calendar Class

 Date 클래스

  Date는 날짜를 표현하는 클래스입니다. Date 클래스는 객체 간에 날짜 정보를 주고 받을 때 주로 사용됩니다. Date 클래스에는 여러 개의 생성자가 선언되어 있지만 대부분 Deprecated되어 현재는 Date() 생성자만 주로 사용합니다.


1
Date now = new Date();
cs


  현재 날짜를 문자열로 얻고 싶다면 toString() 메소드를 사용하면 됩니다. 특정 포맷으로 된 날짜를 얻고 싶다면 SimpleDateFormat 클래스를 이용하면 됩니다.


 * DateExam.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package api;
 
 
import java.text.SimpleDateFormat;
import java.util.Date;
 
public class DateExam {
 
    public static void main(String[] args) {
        Date now = new Date();
        String strnow1 = now.toString();
        System.out.println(strnow1);
        
        SimpleDateFormat sdf = new SimpleDateFormat("MM, dd, yyyy hh:mm:ss");
        String strNow2 = sdf.format(now);
        System.out.println(strNow2);
        
    }
 
}
 
 
 
cs




 






 Calendar 클래스

  Calendar 클래스는 달력을 표현한 클래스입니다. Calendar 클래스는 추상(abstract) 클래스입니다. Calendar 클래스의 정적 메소드인 getInstance() 메소드를 이용하면 현재 운영체제에 설정되어 있는 시간대를 기준으로 한 Calendar 하위 객체를 얻을 수 있습니다.


  Calendar 객체는 get() 메소드를 이용해서 날짜와 시간에 대한 정보를 읽을 수 있습니다. 아래 예제를 통해 확인해 보겠습니다.


 * CalendarExam.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package api;
 
 
import java.util.Calendar;
 
public class CalendarExam {
 
    public static void main(String[] args) {
        Calendar now = Calendar.getInstance();
        
        int year = now.get(Calendar.YEAR);
        int month = now.get(Calendar.MONTH) + 1;
        int day = now.get(Calendar.DAY_OF_MONTH);
        
        int week = now.get(Calendar.DAY_OF_WEEK);
        String strWeek = null;
        
        switch (week) {
        case Calendar.MONDAY:
            strWeek = "월";
            break;
            
        case Calendar.TUESDAY:
            strWeek = "화";
            break;
            
        case Calendar.WEDNESDAY:
            strWeek = "수";
            break;
            
        case Calendar.THURSDAY:
            strWeek = "목";
            break;
            
        case Calendar.FRIDAY:
            strWeek = "금";
            break;
            
        case Calendar.SATURDAY:
            strWeek = "토";
            break;
            
        case Calendar.SUNDAY:
            strWeek = "일";
            break;
        }
        
        int amPm = now.get(Calendar.AM_PM);
        String strAmPm;
        if (amPm == Calendar.AM) 
            strAmPm = "오전";
        else 
            strAmPm = "오후";
        
        int hour = now.get(Calendar.HOUR);
        int minute = now.get(Calendar.MINUTE);
        int second = now.get(Calendar.SECOND);
        
        System.out.println(year + "년 " + month + "월 " + day + "일");
        System.out.println(strWeek + "요일 " + strAmPm + " " + hour + ":" + minute + ":" + second);
    }
 
}
 
 
 
cs



 

end

 


 * 이 포스트은 서적 '이것이 자바다' 를 참고하여 작성한 포스트입니다.


다른 카테고리의 글 목록

CSE/Java 카테고리의 포스트를 톺아봅니다
조회수 확인

자바 기본 API는 여러 절로 구성되어 있습니다.



Intro

Object Class

Objects Class

System Class

Class Class

String Class

StringTokenizer, StringBuffer, StringBuilder Class

Regular Expression & Pattern Class

Arrays Class

Wrapper Class

Math, Random Class

Date, Calendar Class

Format Class

java.time Package




Math, Random Class

 Math 클래스

  java.lang.Math 클래스는 수학 계산에 사용할 수 있는 메소드를 제공하고 있습니다. Math 클래스가 제공하는 메소드는 모두 정적 메소드이므로 Math 클래스로 바로 사용 가능합니다. 


 






 

 * MathExam.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package api;
 
 
public class MathExam {
    public static void main(String[] args) {
        int v1 = Math.abs(-5);
        double v2 = Math.abs(-5.3);
        
        System.out.println("v1= " + v1);
        System.out.println("v2= " + v2);
        
        double v3 = Math.ceil(-5.3);
        System.out.println("v3= " + v3);
        
        double v4 = Math.max(5.46.0);
        System.out.println("v4= " + v4);
        
        double v5 = Math.random();
        System.out.println("v5= " + v5);
        
        double v6 = Math.rint(5.7);
        System.out.println("v6= " + v6);
    
        double v7 = Math.round(7.6);
        System.out.println("v7= " + v7);
        
    }
    
}
 
 
 
cs








 Random 클래스

  java.util.Random 클래스는 난수를 얻기 위해 다양한 메소드를 제공합니다. Math.random() 메소드는 0.0에서 1.0 사이의 double 난수를 얻는 데만 사용한다면, Random 클래스는 boolean, int, long, float, double 난수를 얻을 수 있습니다. 


  또 다른 차이점은 Random 클래스는 종자값(seed)을 설정할 수 있습니다. 종자값은 난수를 만드는 알고리즘에 사용되는 값으로 종자값이 같으면 같은 난수를 얻습니다. Random 클래스로부터 Random 객체를 생성하는 방법은 다음 두 가지가 있습니다.





  다음 예제는 로또 번호 생산하는 예제입니다. 


* RandomExam.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package api;
 
 
import java.util.Random;
 
public class RandomExam {
    public static void main(String[] args) {
        int[] lottoNumber = new int[6];
        Random random = new Random(3);
        System.out.print("선택 번호: ");
        
        for (int i = 0; i < 6; i++) {
            lottoNumber[i] = random.nextInt(45+ 1;
            System.out.print(lottoNumber[i] + " ");
        }
        System.out.println();
    }
}
 
 
 
cs






 


end

 


 * 이 포스트은 서적 '이것이 자바다' 를 참고하여 작성한 포스트입니다.


다른 카테고리의 글 목록

CSE/Java 카테고리의 포스트를 톺아봅니다