전체 글

예외란?

프로그램에서 발생하는 오류(Error)는 아래와 같이 두가지로 볼 수 있다.

① 잘못된 문법을 사용하거나 변수 등을 정의하지 않은 상태에서 사용함으로써 컴파일 단계에서 발생하는 문법적인 오류(Error)   → 컴파일 에러

 

② 프로그램을 실행하는 과정에서 발생되는 오류 → 런타임 에러

       
  - 개발자가 문제 분석을 잘못하거나 실수에 의해 엉뚱한 결과를 가져오게 되는 논리적인 오류(Error)
  - 시스템 이상에서 발생되는 시스템 오류(Error)
  - 프로그램 실행 중 발생되는 비정상적인 상황을 의미하는 예외사항(Exception)이 있다.
      ex)

     ·어떤 수를 0으로 나누거나...
·배열 첨자를 벗어나는 상황이 발생하거나...
·존재하지 않는 파일을 오픈하여 읽어들인다거나...

 


Exception 클래스는 이런 예외 사항이 발생할 경우를 미리 예측하여 적절히 대응하기 위한 절차를 구현하도록 정리해 놓은 것이다.
   
 - 예외는 프로그램 실행 중에 발생할 수 있는 명령어의 정상적인 흐름을 방해하는 이벤트로 자바에서 예외는 하나의 오브젝트(Object, 객체)이다.

 - 프로그램 실행 중에 메소드 안에서 오류(Error)가 발생하게 될 경우, 메소드는 그 오류에 해당하는 예외 오브젝트를 만들고 그것을 자바 런타임 시스템(Runtime System)에 전달해 준다.

 - 자바에서 모든 예외 클래스는 Throwable 클래스나 Throwable 클래스의 하위 클래스를 상속받아 사용한다.

 - Throwable 클래스는 예외를 설명하는 문장이나 예외가 발생할 때의 프로그램의 상태에 관한 정보를 포함하고 있다.

 - Throwable 클래스에서 파생된 클래스
 ·Exception 클래스

  Exception 예외 클래스는 일반적으로 프로그래머에 의해 복원될 수 있는 예외 상황으로 메소드가 실행 중에 던지는 예외를 가리킨다.
 ·Error 클래스

  심각한 예외의 형태로 개발자가 복원할 수 없는 형태의 예외이다.

※ 예외의 종류

   - checked exception
     메소드 내에서 예외가 발생한 경우  메소드를 정의할 때 『throws』문에 메소드 내에서 발생할 수 있는 예외들을 명시해 주거나 또는 그 예외를 『try~chtch』에서  처리해 주어야만 하는 예외이다. 컴파일러가 컴파일을 수행하는 과정에서  『checked exception』이 『throws』 되는가의 여부 혹은 『try~catch』되는지의 여부를 판단하여 프로그램에서 예외를 어떤 형식으로든 처리하지 않으면 컴파일 자체가 불가능하다.

   - unchecked exception
     사전에 처리하지 않아도 컴파일러가 체크하지 않는 런타임 시에 발생할 수 있는 예외이다.

 

○ java.lang.Throwable 클래스의 주요 메소드   

   - String toString()
     : Throwable 각각에 대한 설명을 문자열 형태로 반환한다.
   - void printStackTrace(PrintStream s)
   - void printStackTrace(PrintWriter w)
     : 표준 출력 스트림에 스택 호출 목록을 마지막 메소드부터 출력한다.

 

○ 주요 런타임 예외 클래스     

   - Arithmeticexception
     : 수치 계산상의 오류(0으로 나누기 등)
   - ArrayStoreException
     : 배열에 잘못된 데이터 형을 저장하려 했을 경우 발생하는 오류
   - IndexOutOfBoundException
     : 배열, 문자열, 벡터 등에서 인덱스 범위가 벗어난 경우 발생하는 오류
   - ClassCastException
     : 클래스 변환을 잘못한 경우 발생하는 오류
   - NullPointerException
     : 빈 객체를 참조하는 경우(초기화 되지 않은 변수 사용 등) 발생하는 오류
   - SecurityException
     : 자바의 내부 보안 사항을 위반하였을 경우 발생하는 오류
     :
     :

 

예외처리의 몇가지 예제인 try ~ catch 구문과 throws 에대해 알아보자.


try ~ catch ~ (finally)

try블록에는 예외가 발생할 수 있는 코드가 위치한다. try 블록의 코드가 예외없이 정상 실행되면 catch블록의 코드는 실행되지 않고 finally 블록의 코드를 실행한다. 하지만 try 블록의 코드에서 예외가 발생하면 즉시 실행을 멈추고 catch 블록으로 이동하여 예외처리 코드를 실행한다. 그리고 finally 블록의 코드를 실행한다. (finally 블록은 생략 가능합니다.)

try catch 문을 주로 쓰는 구간은 주로 데이터베이스에 데이터를 주고받을 경우 많이 사용한다. 데이터베이스를 거쳐올때는 변수가 많이 생기기 때문에 try catch문은 필수이다. 그리고 finally에는 데이터베이스와의 연결을 끊어주는 코드를 주로 삽입된다. 특정 예외가 발생하여 데이터베이스와의 연결이 끊어지지 않으면 여러가지 문제를 야기할수 있기 때문이다.

 

		// BufferedReader 클래스 인스턴스 생성
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		// 주요 변수 선언
		int a, b, c;
		
		
		System.out.print("첫 번째 정수 입력 : ");
		a = Integer.parseInt(br.readLine());
		System.out.print("두 번째 정수 입력 : ");
		b = Integer.parseInt(br.readLine());

		c = a + b;

		System.out.println("결과 : " + c);	

BufferedReader 인스턴스로 입력을 받게되면 컴파일시 아래와 같은 예외사항이 발생하게 된다.

 

이는 IOException이 잡아내지거나 던져져야 함을 의미한다.

 

try ~ catch 구문을 활용하여 예외처리를 하면 아래와 같다. 

		// BufferedReader 클래스 인스턴스 생성
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		// 주요 변수 선언
		int a, b, c;

		try
		{
			System.out.print("첫 번째 정수 입력 : ");
			a = Integer.parseInt(br.readLine());
			System.out.print("두 번째 정수 입력 : ");
			b = Integer.parseInt(br.readLine());

			c = a + b;

			System.out.println("결과 : " + c);	
		}
		catch (IOException e)
		{
			// IOException → checked exception
			//-- 메소드를 정의하는 과정에서 throws 한 예외.
			//   잡아내거나 던지지 않을 경우 컴파일 에러
			System.out.println(e.toString());
		}

 

 

실행 결과

// 실행 결과
/*
첫 번째 정수 입력 : 2
두 번째 정수 입력 : 5
결과 : 7
계속하려면 아무 키나 누르십시오 . . .
*/

 

IOException은 checked exception이라 필수적으로 처리를 해야한다. 하지만 위 코드에서는 컴파일시에는 정상적으로 처리되나 런타임 중 unchecked exception인 NumberFormatException이 경우에 따라 발생할 가능성이 있다. 

 

런타임 중 예외 발생시

 


		try
		{
			System.out.print("첫 번째 정수 입력 : ");
			a = Integer.parseInt(br.readLine());
			System.out.print("두 번째 정수 입력 : ");
			b = Integer.parseInt(br.readLine());

			c = a + b;

			System.out.println("결과 : " + c);	
		}
		catch (IOException e)
		{
			// IOException → checked exception
			//-- 메소드를 정의하는 과정에서 throws 한 예외.
			//   잡아내거나 던지지 않을 경우 컴파일 에러
			System.out.println(e.toString());
		}
		catch (NumberFormatException e2)
		{
			// NumberFormatException → unchecked exception
			//-- 런타임 시 발생할 수 있는 예외로
			//   문법적으로 반드시 던질 필요도, 잡아낼 필요도 없다.
			System.out.println(e2.toString());
			System.out.println("숫자 형태의 데이터를 입력하세요~!!!");
		}

 

unchecked exception인 NumberFormatException까지 예외처리가 된 코드이다.

 

실행 결과 

 

런타임 중 예외 발생시

 

런타임중 숫자 형태 이외의 데이터를 입력하여 unchecked exception 발생하였음에도 사용자가 의도한대로 처리되고, 비정상적으로 종료가 일어나지 않았다.


예외가 발생할 여지가 있으며 어떠한 에러인지 확신이 없을때, 다음과 같이 특정 예외를 catch문에 선언하지않고 Exception을 선언하면 Exception 클래스에 정의되어 있는 모든 예외를 잡아낼 수 있다. 

이는 Exception 클래스는 UncheckedException 과 CheckedException의 상위 클래스이기 때문이다.

 

		try
		{
			System.out.print("첫 번째 정수 입력 : ");
			a = Integer.parseInt(br.readLine());
			System.out.print("두 번째 정수 입력 : ");
			b = Integer.parseInt(br.readLine());

			c = a + b;

			System.out.println("결과 : " + c);	
		}
		catch (Exception e)
		{
			System.out.println("[e.toString()]=================");
			System.out.println(e.toString());

			System.out.println("[e.getMessage()]===============");
			System.out.println(e.getMessage());

			System.out.println("[printStackTrace]==============");
			e.printStackTrace();
		}

 

실행 결과

 

// 실행 결과
/*
첫 번째 정수 입력 : 3
두 번째 정수 입력 : 6
결과 : 9
계속하려면 아무 키나 누르십시오 . . .
*/

 

런타임 중 예외 발생시

 


마찬가지로 try ~ catch ~ finally 구문을 이용하여 처리할 수 있다.

finally 영역은 예외가 발생하거나 발생하지 않거나 언제나 실행되는 영역이다.

 

		try
		{
			System.out.print("첫 번째 정수 입력 : ");
			a = Integer.parseInt(br.readLine());
			System.out.print("두 번째 정수 입력 : ");
			b = Integer.parseInt(br.readLine());

			c = a + b;

			System.out.println("결과 : " + c);
		}
		catch (IOException e)
		{
			System.out.println(e.toString());
		}
		finally
		{
			System.out.println("고생많으셨습니다. 감사합니다");
		}

 

실행 결과

// 실행 결과
/*
첫 번째 정수 입력 : 5
두 번째 정수 입력 : 2
결과 : 7
고생많으셨습니다. 감사합니다
계속하려면 아무 키나 누르십시오 . . .
*/

java.util.Random 클래스

여러 형태의 난수를 발생시켜 제공하는 클래스이다. Math 클래스의 정적 메소드인 random() 메소드도 난수를 제공하는 메소드이지만 0.0 ~ 1.0 사이의 실수 형태만 발생하게 되므로 필요한 여러 형태의 난수를 만들어내기 위해서는 추가적인 연산들을 수행해야 한다. 그래서 자바는 여러 형태의 난수를 발생시켜주는 전용 클래스 Random 클래스를 별도로 제공하고 있다.

 


Random 클래스의 메소드

 

흔히 사용가능한 메소드는 다음과 같다.

(nextInt의 경우 매개변수 없이 실행할 경우 int의 전체 범위내에서 난수를 발생한다.)

(밑의 표에는 없지만 IntStream, DoubleStream, LongStream으로 반환하는 메소드들도 존재한다.)

(Random클래스가 아닌 Math에도 nextDouble() 메소드와 같은 역할을 하는 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형 난수 반환 


※ 로또 번호 생성기를 구현한다.
   프로그램이 실행되면 기본적으로 로또를 5게임 수행하는 프로그램을 구현한다.

 실행 예) 
 3 5 12 24 31 41
 1 2 8 23 36 38
 4 9 11 13 22 30
 5 10 13 15 27 40
 22 3 32 33 40 45
 계속하려면 아무 키나 누르세요...

 


 

import java.util.Random;
import java.util.Arrays;

class Lotto
{
	// 배열 변수 선언 및 메모리 할당
	// → 로또 번호를 담아둘 배열방 6칸
	private int[] num = new int[6];
	
	// private 으로 선언된 num 값을 얻어내기 위한 메소드
	// → getter
	public int[] getNum()
	{
		return num;
	}

	// 6개의 난수를 발생시키기 위한 메소드
	public void start()
	{
		Random rd = new Random();
		int n;
		int cnt = 0;
		
		jump:

		while(cnt<6)
		{
			n = rd.nextInt(45)+1;	// 1 ~ 45 중 한 개 발생

			for (int i = 0; i < cnt; i++)
			{
				if (num[i] == n)
				{
					continue jump;
				}
			}
			num[cnt++] = n;
		}
		// 정렬 메소드 호출
		sorting();
	}

	// 정렬 메소드
	private void sorting()
	{
		// Arrays 클래스의 정적 메소드 sort() 호출하며
		// 멤버인 num 을 매개변수로 넘겨주기
		Arrays.sort(num);
	}
}


public class Test151
{
	public static void main(String[] args)
	{
		// Lotto 클래스 기반 인스턴스 생성
		Lotto lotto = new Lotto();

		// 기본 5게임
		for (int i = 1; i <= 5; i++)
		{
			lotto.start();

			// 결과 출력
			for (int n : lotto.getNum())
			{
				System.out.printf("%4d", n);
			}
			System.out.println();
		}	
	}	
}

 

실행 결과

// 실행 결과
/*
   7   9  12  14  26  31
  10  11  13  25  39  42
   7   8  12  19  29  34
   9  10  13  17  19  24
   3   4  16  20  33  34
계속하려면 아무 키나 누르십시오 . . .
*/

java.lang.Math 클래스

수학(Mathmatics)과 관련된 유용한 속성과 함수들을 제공하는 클래스로 생성자가 있긴 하지만... 이 생성자는 『private』으로 선언되어 있기 때문에 외부에서 객체(인스턴스)를 생성할 수 없다.
단, 모든 메소드가 『static』으로 정의되어 있으므로 객체를 생성하지 않고 클래스의 이름을 통해 바로 접근하여 사용하는 것이 가능하다.

 

 

주요 상수 및 메소드

상수

- public static final double E = 2.71...;
     : 자연 로그 상수

- public static final double PI = 3.141592...;
     : 원주율 (π)
 

메소드

- public static double sin(double a)
- public static double cos(double a)
- public static double tan(double a)
  : sin(a), cos(a), tan(a) 값을 반환한다. (삼각함수)
   
- public static double asin(double a)
- public static double asin(double a)
- public static double asin(double a)
  : asin(a), acos(a), atan(a) 값을 반환한다. (삼각함수의 역함수)

- public static double toRadians(double angdeg)
  : 각도(angdeg)를 라디안(radian)으로 바꾸어 반환한다.
- public static double toDegrees(double angrad)
  : 라디안(angrad)을 각도로 바꾸어 반환한다.

- public static double exp(double a)
  : e 의 a 승을 구하여 반환한다.

- public static double log(double a)
  : 로그(log) 값을 구하여 반환한다
   
- public static double sqrt(double a)
  : a 의 제곱근을 구하여 반환한다.

- public static double ceil(double a)
  : a 보다 크거나 같은 정수를 반환한다. (올림의 개념)
   
- public static double (double a)
  : a 보다 작거나 같은 정수를 반환한다. (절삭의 개념)

- public static double pow(double a, double b)
  : a 의 b 승을 구하여 반환한다.

- public static int round(float a)
  public static long round(float a)
   : a를 반올림 하여 결과값을 반환한다.

- public static double random(double a)
   : 0.0 ~ 1.0 사이의 난수(임의의 실수)를 발생시켜 반환한다.

 

- public static int abs(int a)

  public static double abs(double a)

  :

  : 전달된 값이 음수이면 그 값의 절댓값을 반환하며, 전달된 값이 양수이면 전달된 값을 그대로 반환한다.

 

- public static int max(int a, int b)

  public static long max(long a, long b)

  : 

  : 전달된 두 값을 비교하여 큰 값을 반환한다

- public static int min(int a, int b)

  public static int min(int a, int b)

  :

  : 전달된 두 값을 비교하여 작은 값을 반환한다


public class Test150
{
	public static void main(String[] args)
	{
		System.out.println("원주율     : " + Math.PI);
		System.out.println("2의 제곱근 : " + Math.sqrt(2));
		//--==>> 원주율     : 3.141592653589793
		//		 2 제곱근 : 1.4142135623730951

		System.out.println("  파이에 대한 Degree : " + Math.toDegrees(Math.PI));
		System.out.println("2 파이에 대한 Degree : " + Math.toDegrees(2.0*Math.PI));
		//--==>>  파이에 대한 Degree : 180.0
		//		2 파이에 대한 Degree : 360.0

		double radian45 = Math.toRadians(45);
		// 각도를 라디안으로 변환~!!!

		System.out.println("싸인   45 : " + Math.sin(radian45));
		System.out.println("코싸인 45 : " + Math.cos(radian45));
		System.out.println("탄젠트 45 : " + Math.tan(radian45));
		//--==>> 싸인   45 : 0.7071067811865475
		//		 코싸인 45 : 0.7071067811865476
		//		 탄젠트 45 : 0.9999999999999999

		System.out.println("로그 25 : " + Math.log(25));
		//--==>> 로그 25 : 3.2188758248682006

		System.out.println("2의 4승 : " + Math.pow(2, 4));
		//--==>> 2의 4승 : 16.0

		System.out.println("0.0 ~ 1.0 사이의 난수 : " + Math.random());
		//--==>> 0.0 ~ 1.0 사이의 난수 : 0.14236921211523157
		//		 0.0 ~ 1.0 사이의 난수 : 0.47056127764887945

	}
}

※ 오늘 날짜를 기준으로 입력받는 날짜만큼 후의 연, 월, 일, 요일을
 확인하야 결과를 출력하는 프로그램을 구현한다.

 실행 예)
 오늘 날짜 : 2020-8-28 금요일
 몇 일 후의 날짜를 확인하고자 하십니까? : 200

 ========[ 확인 결과 ]=========
 200일 후 : 2021-xx-xx x요일
 ==============================
 계속하려면 아무 키나 누르세요...

 ※ 현재 날짜를 기준으로 날 수를 더하는 연산 메소드
    『객체.add(Calendar.DATE, 날 수)』


import java.util.Calendar;
import java.util.Scanner;

public class Test149
{
	public static void main(String[] args)
	{
		// Scanner 클래스 기반 인스턴스 생성
		Scanner sc = new Scanner(System.in);

		// Calendar 클래스 기반 인스턴스 생성
		Calendar now = Calendar.getInstance();

		// 주요 변수 선언
		int nalsu;			//-- 사용자로부터 입력받은 날 수
		int y,m,d,w;		//-- 연, 월, 일, 요일
		String week[] = {"일","월","화","수","목","금","토"};
		// 현재의 연, 월, 일, 요일 확인(가져오기 → get())
		y = now.get(Calendar.YEAR);
		m = now.get(Calendar.MONTH) + 1;		// check~!!!
		d = now.get(Calendar.DATE);
		w = now.get(Calendar.DAY_OF_WEEK);

		// 현재의 연, 월, 일, 요일 확인결과 출력
		System.out.println("오늘 날짜 : " + y + "-" + m + "-" + d + " " + week[w-1] + "요일");

		do
		{
			System.out.print("몇 일 후의 날짜를 확인하고자 하십니까? : ");
			nalsu = sc.nextInt();
		}
		while (nalsu < 1);

		// check~!!!
		now.add(Calendar.DATE, nalsu);

		// 최종 결과 출력
		System.out.println();
		System.out.println("========[ 확인 결과 ]=========");
		System.out.printf("%d일 후 : %tF %tA\n", nalsu, now, now);
		System.out.println("==============================");

	}
}

실행 결과

//실행결과
/*
오늘 날짜 : 2020-8-28 금요일
몇 일 후의 날짜를 확인하고자 하십니까? : 20

========[ 확인 결과 ]=========
20일 후 : 2020-09-17 목요일
==============================
계속하려면 아무 키나 누르십시오 . . .
*/

 

※ 사용자로부터 연, 월을 입력받아 달력을 그려주는(출력하는) 프로그램을 구현한다.
 단, 만년달력이 아니라 Calendar 클래스를 활용하여 작성할 수 있도록 한다.
 (API Document 적극 참조~!!!)

 실행 예)
 연도 입력 : 0
 연도 입력 : 2020
 월   입력 : -2
 월   입력 : 16
 월   입력 : 8

실행결과 예


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Calendar;

public class Test148
{
	public static void main(String[] args) throws IOException
	{
		//BufferedReader 클래스 기반 인스턴스 생성
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		// Calendar 클래스 기반 인스턴스 생성
		Calendar cal = Calendar.getInstance();

		// 주요 변수 선언
		int y,m;		//-- 년, 월
		int w;			//-- 요일
		int i;			//-- 루프, 변수

		do
		{
			System.out.print("연도 입력 : ");
			y = Integer.parseInt(br.readLine());
		}
		while (y<1);

		do
		{
			System.out.print("월    입력 : ");
			m = Integer.parseInt(br.readLine());
		}
		while (m < 1 || m > 12);
		
		// 사용자로부터 입력받은 연(y), 월(m)을 이용하여
		// 달력 객체의 날짜 세팅
		cal.set(y,m-1,1);
		//-- 월 구성 시 입력값(m)을 그대로 사용하는 것이 아니라
		//   입력값에서 1을 뺀 값으로 월을 설정해야 한다.
		
		// 세팅된 달력 객체로부터 요일 가져오기
        w = cal.get(Calendar.DAY_OF_WEEK);

		// 테스트(확인)
		//System.out.println(w);
		//--==>> 연도 입력 : 2020
		//       월   입력 : 8
		//        7 → 2020년 8월 기준 → 토요일 → 2020년 8월 1일 → 토요일
		
		// Calendar 클래스의 『getActualMaximum()』 메소드 check~!!!
		// 테스트(확인)
		System.out.println(cal.getActualMaximum(Calendar.DATE));
		//--==>> 31


		// 결과 출력 → 달력 그리기
		System.out.println();
		System.out.println("\t[ " + y + "년 " + m + "월 ]\n");
		System.out.println("  일  월  화  수  목  금  토");
		System.out.println("============================");

		// 공백 발생
		for (i = 1; i < w; i++)
		{
			System.out.print("    ");
		}

		// 테스트(확인)
		//System.out.printf("%4d",1);

		// Calendar 클래스의 『getActualMaximum()』 메소드 활용
		for (i=1; i <= cal.getActualMaximum(Calendar.DATE); i++)
		{
			System.out.printf("%4d",i);
			w++;		//-- 반복문을 수행하며 날짜가 증가할 때 마다
						//   요일도 함께 증가해 나갈 수 있도록 처리

			if (w%7==1) //-- 증가한 요일이 일요일이 될 때 마다... 개행 후 출력
				System.out.println();		//-- 개행
		}
		if(w%7!=1)
			System.out.println();			//-- 개행

		System.out.println("=============================");

	}
}

실행 결과

 

// 실행 결과
/*
연도 입력 : 2020
월    입력 : 2
29

        [ 2020년 2월 ]

  일  월  화  수  목  금  토
============================
                           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
=============================
계속하려면 아무 키나 누르십시오 . . .
*/

java.util.Calendar 클래스

java.util.Calendar 클래스는 날짜와 시간을 객체 모델링화 한 클래스로 연, 월, 일, 요일, 시, 분, 초 까지의 시간 및 날짜와 관련된 정보를 제공한다. 그리고, Calendar 클래스는 추상 클래스이므로 직접 객체를 생성할 수 없으며 실제적인 메소드 구현은 Calendar 클래스의 서브 클래스인  GregorianCalendar 클래스에 정의되어 있다.

 

시스템으로부터 현재 시스템 시간 정보를 얻어올 때 getInstance() 라는 정적(static) 메소드를 이용하여 객체를 생성할 수 있다. 생성된 Calendar 클래스 객체는 시스템의 현재 날짜와 시간 정보를 가지며, 이 객체가 생성되면 갖고 있는 시간 정보들은 get() 메소드를 이용하여 쉽게 가져올(사용할)수 있다.

getInstance() 메소드는 내부적으로 GregorianCalendar 객체를 생성하여 돌려주기 때문에 GregorianCalendar 객체를 직접 생성하여 시간 정보를 구할 수도 있다.

 

※ Calendar 클래스는 추상 클래스이기 때문에 객체를 생성할 수 없다.
   (추상 클래스 : 미완성된 클래스)

   Calendar cal = new Calendar();
   → 이와 같은 구문을 통해 인스턴스 생성이 불가.

○ Calendar 클래스 객체(인스턴스)를 생성할 수 있는 방법

   1. Calendar cal = Calendar.getInstance();

   2. Calendar cal = new GregorianCalendar();

   3. GregorianCalendar cal = new GregorianCalendar();

   (※ GregorianCalendar : Calendar 클래스의 하위 클래스)


import java.util.Calendar;
import java.util.GregorianCalendar;

public class Test147
{
	public static void main(String[] args)
	{
		// Calendar 클래스 기반 인스턴스 생성
		//Calendar rightNow = new Calendar();	// 인스턴스 생성 불가
		Calendar rightNow = Calendar.getInstance();
		
		// 생성된 달력(Calendar) 인스턴스를 통해
		// 날짜 관련 정보를 얻어낼 수 있는 메소드 → 『get()』
		int y = rightNow.get(Calendar.YEAR);
		System.out.println(y);
		//--==>> 2020

		int m = rightNow.get(Calendar.MONTH)+1;		//-- check~!!!
													//   가져올 때는 『+1』
													//	 설정할 때는 『-1』
	
		System.out.println(m);
		//--==>> 8 

		int d = rightNow.get(Calendar.DATE);
		System.out.println(d);
		//--==>> 27

		int w = rightNow.get(Calendar.DAY_OF_WEEK);
		System.out.println(w);

		
		/*
		// 테스트(확인)
		System.out.println(Calendar.SUNDAY);	//--==>>  1 → 일요일
		System.out.println(Calendar.MONDAY);	//--==>>  2 → 월요일
		System.out.println(Calendar.TUESDAY);	//--==>>  3 → 화요일
		System.out.println(Calendar.WEDNESDAY);	//--==>>  4 → 수요일
		System.out.println(Calendar.THURSDAY);	//--==>>  5 → 목요일
		System.out.println(Calendar.FRIDAY);	//--==>>  6 → 금요일
		System.out.println(Calendar.SATURDAY);	//--==>>  7 → 토요일
		*/

		System.out.println(y + "-" + m + "-" + d + " " + w);
		//--==>> 2020-8-27 5

		String week = "";
		switch (w)
		{
			//case 1: week = "일요일"; break
			case Calendar.SUNDAY: week = "일요일"; break;

			//case 2: week = "월요일"; break
			case Calendar.MONDAY: week = "월요일"; break;
		
			//case 3: week = "화요일"; break
			case Calendar.TUESDAY: week = "화요일"; break;

			//case 4: week = "수요일"; break
			case Calendar.WEDNESDAY: week = "수요일"; break;

			//case 5: week = "목요일"; break
			case Calendar.THURSDAY: week = "목요일"; break;

			//case 6: week = "금요일"; break
			case Calendar.FRIDAY: week = "금요일"; break;

			//case 7: week = "토요일"; break
			case Calendar.SATURDAY: week = "토요일"; break;
		}

		System.out.println(y + "-" + m + "-" + d + " " + week);
		//--==>> 2020-8-27 목요일
		
		///////////////////////////////////////////////////////////////////////////

		//Calendar 클래스 인스턴스 생성
		Calendar rightNow2 = new GregorianCalendar();

		String[] week2 = {"일요일","월요일","화요일","수요일","목요일","금요일","토요일"};

		
		// 달력의 날짜 세팅 → 『set()』 메소드 활용
		rightNow2.set(2020,9,20); // 10월      -- check~!!!

		System.out.println(rightNow2.get(Calendar.DAY_OF_WEEK));
		//--==>> 3  → 화요일
		//-- 2020년 10월 20일은 화요일~!!!

		System.out.println(week2[rightNow2.get(Calendar.DAY_OF_WEEK)-1]);
		//--==>> 화요일


		// 달력의 날짜 세팅
		rightNow2.set(1994,5,3);	// 1994-06-03

		System.out.println(week2[rightNow2.get(Calendar.DAY_OF_WEEK)-1]);
		//--==>> 금요일

	}
}

+ Recent posts