JAVA

throw

[ 사용자 정의 예외 객체 ]

  • 기본 라이브러리(API)에서 제공하는 예외 객체 외 개발자가 선언해서 사용하는 예외 객체
  • Exception클래스 또는 Exception의 자식 클래스를 반드시 상속받아야 함
  • 일반적으로 Exception에서 선언된 형태의 생성자 외에는 다른 멤버를 가지지 않음

즉 Exception을 상속받는 예외 객체를 직접 만들고, 조건문을 사용해서 특정 상황에서 예외를 강제로 발생하도록 만든다. 사실 이 경우 조건문이기 때문에 굳이 예외 객체를 생성하지 않더라도 처리하고 싶은 예외 상황을 조건문으로 처리하거나, 예외 객체 대신 그냥 메소드로 생성해서 사용할 수도 있다. 다만 명시적인 예외 객체를 사용하므로써 코드의 가시성을 높일 수 있다.


아래는 일반 메소드로 예외 처리를 했을 경우입니다. 그냥 예외 상황에 대한 처리 구문을 메소드로 만들어 소환하면 된다.

// Test156.java 파일과 비교~!!!

class Demo
{
	private int value;

	public void setValue(int value)
	{
		if(value<=0)
			return;		//-- 종료 → setValue() 메소드 종료

		this.value = value;
	}

	public int getValue()
	{
		return value;
	}
}

public class Test155
{
	public static void main(String[] args)
	{
		Demo ob = new Demo();
		ob.setValue(-3);
		int result = ob.getValue();
		System.out.println(result);

	}
}

 

아래는 예외 객체를 생성해서 위와 같은 예외 상황을 처리한 예다. 강제로 예외를 발생시킬 때는 "throw"를 사용한다. 이전글에서 예외를 호출한 쪽으로 던져주는 "throws"와 한글자가 다른 점에 유의해야 한다. 사용자 정의 예외 객체의 사용은 각자의 설계와 스타일에 맞게 사용하면 된다.

// Test155.java 파일과 비교~!!!

// ※ throw

class Demo
{
	private int value;

	public void setValue(int value) throws Exception
	{
		if (value<=0)
		{
			// 예외 발생
			throw new Exception("value 는 0보다 작거나 같을 수 없습니다.");
		}
		
		this.value = value;
	}

	public int getValue()
	{
		return value;
	}
}

public class Test156
{
	public static void main(String[] args)// throws Exception
	{
		Demo ob = new Demo();
		
		try
		{
			ob.setValue(-3);
			int result = ob.getValue();
			System.out.println(result);
		}
		catch (Exception e)
		{
			System.out.println("main() 에서 잡아낸 예외");
			System.out.println(e.toString());

		}

	}
}

throws (예외 떠넘기기)

메서드 내부에서 예외가 발생했을 때 예외를 try - catch 문으로 잡아서 처리할 수 있지만 경우에 따라서 현재 메서드를 호출한 메서드로 예외를 떠넘길 수 있다. 예외를 떠넘기는 방법은 다음과 같이 throws 키워드를 메서드 뒤에 붙여주면 된다.

public static void generateException() throws NullPointerException
{
	//NullPointerException 발생
}

 

만약 떠넘겨야할 예외 종류가 여러개라면 쉼표(,)를 기준으로 나열하여 선언할 수 있다.

 

public static void generateException() throws NullPointerException, ArithmeticException
{ 
	//예외 발생 
}

 

예외가 발생하는 경우 try - catch문을 통해 처리하지 않고 throws를 이용해 떠넘기면 현재 메서드를 호출한 곳으로 던져지게 된다. 만약 모든 메서드에서 throws 를 이용해 예외를 떠넘기다 보면 최초 호출 지점인 main() 메서드 내부로 예외가 던져지게 되며 main() 메서드에서 마저 예외를 떠넘기게 된다면 JVM의 예외처리기까지 도달하여 프로그램은 그대로 종료된다.

 

이렇게 되면 사실상 예외를 처리하지 않은것이나 다름 없으므로 매우 무의미한 행동이라 할 수 있다. 의도적인 경우가 아니라면 throws는 많은 생각과 필요에 의해 사용되어야 한다.

예외를 떠넘기는 이유

예외가 발생한 경우 굳이 메서드 내에서 try-catch 문으로 예외를 처리하지 않고 throws문으로 떠넘기는 이유는 무엇일까?

 

첫번째 이유는 메서드 선언부에 선언된 throws문을 통해 해당 API를 사용했을 때 어떤 예외가 발생할 수 있는지를 예측할 수 있다.

 

다음은 java api 공식 문서이다. 선언부를 보면 IOException이 던져진다는 것을 알 수 있다.

두번째 이유로는 현재 메서드 내에서 예외를 처리할 필요가 없다고 판단했을 경우이다. 예외 처리에는 생각보다 많은 코드가 필요하게 되며 이는 코드를 읽기 어렵게 만들고 불필요한 코드가 많이 추가되게 만들어 버그를 만들기 쉽다. 또한 API를 만드는데에 있어서 내가 처리하기 보다는 내가 만든 API를 사용하는 다른 개발자에게 원하는 처리를 하도록 기회를 줄 수 있다.


다음 코드는 BufferedReader 클래스의 readLine메소드로 인해 발생하는 예외(Checked Exception)를 throws 처리한 것이다. main에서 호출한 메소드에서 IOException을 throws 하여 main메소드로 던져진 IOException을 다시 throws하는 코드이다.

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

public class Test153
{
	private String[] data = new String[3];

	public void proc() throws IOException
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		String str;
		int n = 0;

		System.out.print("이름 입력[종료:Ctrl+z] : ");

		while ((str = br.readLine()) != null )
		{
			data[n++] = str;
			System.out.print("이름 입력[종료:Ctrl+z] : ");
		}

		System.out.println("입력된 내용...");
		for (String s : data)
		{
			if (s != null)
			{
				System.out.println(s);
			}
		}
	}

	public static void main(String[] args) throws IOException	// check~!!!
	{
		Test153 ob = new Test153();
		ob.proc();
	}
}

Unchecked Exception은 명시적인 예외처리를 하지 않아도 된다. 이 예외는 피할 수 있지만 개발자가 부주의해서 발생하는 경우가 대부분이며, 미리 예측하지 못했던 상황에서 발생하는 예외가 아니기 때문에 굳이 로직으로 처리를 할 필요가 없도록 만들어져 있다.

 

아래 코드는 위 코드에서 발생할 수 있는 Unchecked Exception에대한 처리를 try ~ catch로 처리하였다.

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

public class Test154
{
	private String[] data = new String[3];

	public void proc() 
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		String str;
		int n = 0;

		try
		{
			System.out.print("이름 입력[종료:Ctrl+z] : ");

			while ((str = br.readLine()) != null )
			{
				data[n++] = str;
				System.out.print("이름 입력[종료:Ctrl+z] : ");
			}	
		}
		catch(ArrayIndexOutOfBoundsException e)
		{
			System.out.println("======[예외 발생]======");
			System.out.println("getMessage : " + e.getMessage());
			System.out.println("toString : " + e.toString());
			System.out.println("printStackTrace............");
			e.printStackTrace();
		}
		catch (IOException e)
		{
			System.out.println(e.toString());
		}

		System.out.println("\n입력된 내용...");
		for (String s : data)
		{
			if(s != null)
				System.out.println(s);
		}

	}

	public static void main(String[] args)
	{
		Test154 ob = new Test154();
		ob.proc();
	}
}

 

실행 결과

 

// 실행 결과
/*
이름 입력[종료:Ctrl+z] : 조윤상
이름 입력[종료:Ctrl+z] : 김철수
이름 입력[종료:Ctrl+z] : 배철수
이름 입력[종료:Ctrl+z] : ^Z

입력된 내용...
조윤상
김철수
배철수
계속하려면 아무 키나 누르십시오 . . .
*/

 

런타임 중 예외 발생시

 

 

입력받을 문자열 배열의 크기가 초과하는 예외 (ArrayIndexOutOfBoundsException) 즉, (Unchecked Exception) 이 발생하였을 때 catch 블록에 정의된 대로 실행되었다.

예외란?

프로그램에서 발생하는 오류(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 목요일
==============================
계속하려면 아무 키나 누르십시오 . . .
*/

 

+ Recent posts