본문 바로가기

programming/Gukbi

국비 교육 21일차 - 예외처리

728x90
반응형

이틀 연속으로 예외 처리에 대해서 배웠다. 

사실 수업 끝나고 바로는 힘들기도 하고 정신도 없어서 지금 주말에 몰아서 블로깅을 시작하고 있는데

며칠 지났다고 벌써 가물가물하다. 정말 꼭 남아서 블로깅을 다 하는 습관을 다시 들여야겠다...

 

 

package com.sist.main;
/*
 * 	1. 클래스 만들기 : 재사용 ===> import (라이브러리 만들기 => .jar) => 상속(재정의)
 * 		= 변수
 * 		  =	메모리를 따로 생성 (new 사용) - 인스턴스변수 
 * 		  = 메모리를 한개만 사용 (static)
 * 		= 메소드 => 리턴형(결과값), 매개변수(사용자로부터 전송받은 값)
 * 					=> 기본데이터형 => 모아서 한개의 데이터형(클래스)
 * 					1) 리턴형
 * 						결과값이 없으면 - void
 * 						일반데이터 (int, double, char, boolean, long)
 * 						클래스 - 상세보기
 * 						배열 - 목록
 * 					2) 매개변수
 * 						기본데이터형
 * 						클래스. 배열
 * 						
 * 			= 연산자 (항상 같은 데이터형끼리만 연산이 가능)
 * 			  단항연산자 (++, --, !, (type))
 * 			  이항연산자 
 * 				산술(+,-,*,/,%) - 형변환
 * 				비교연산자 ( ==, !=, <, >, <=, >)
 * 				논리연산자 (&&, ||)
 * 						범위나 기간에 포함 (&&), 미포함 (||)
 * 				대입연산자 (=, +=, -=)
 * 	
 * 			= 제어문  
 * 				조건문 (if, else if,else)
 * 				반복문 (while, for)
 * 				반복제어 (break)
 * 	2. 에러 발생 방지하는 프로그램 - 예외처리
 * 		미리 예측해서 => 구현 
 * 		= 예외 복구 - try~catch
 * 			try - 정상수행할 수 있는 문장
 * 			catch - 프로그래머의 실수, 사용자가 입력, 복구가 완료 
 * 			finally (생략가능) => 오라클, 네트워크, 파일 => (종료: close) 
 * 			=> 자동으로 에러를 처리하는 것은 아니다 (점프)
 * 			=> catch는 예상되는 에러퍼리 (여러개 사용이 가능) => 예외처리 클래스의 순서 
 * 			=> 잘 모른다 catch(Exception e)
 * 			=> 에러메세지 확인 
 * 				= getMessage() (*문제 - 오라클 연결시에 null이라고 뜸)
 * 				= printStackTrace() *** 권장 => 위치 지정 
 * 			=> try~catch는 항상 소스 전체를 대상으로 하지 않는다 (에러가 예상되는 부분)
 * 		= 예외 회피 => Throws 
 * 		= 예외 전환 => 다른 예외를 발생해서 화면 변경
 * 	3. 라이브러리 활용
 * 
 * 
 * 
 */
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/*
 * 	초기화 => 처음에 필요한 데이터값을 설정
 * 	페이지 => 0 => page=1 
 * 	==============================
 * 	class Movie
 * 	{
 * 		int page=1; // 명시적 초기화
 * 	}
 * 	class Login 
 * 	{
 * 		String id, pwd;
 * 		=> cookie (자동로그인)
 * 		{
 * 			구현 (초기화 블록)
 * 		}
 * 		Login()
 * 		{
 * 			구현 (생성자)
 * 		}
 * 	}
 */
public class MainClass extends JFrame implements ActionListener{
	// JFrame 윈도우 => MainClass 윈도우의 모든 기능을 사용할 수 있다. 
	// ActionListener => Menu, Button, Textfield (Enter)
	// 포함 클래스 
	JTextField tf; // 입력창 (한줄) => ID, Password
	JTextArea ta; // 입력창 (여러줄) 
	JButton bu1, bu2;
	// class 안에서 변수 : 기본데이터형, 배열, 클래스 (여러개를 한번에 저장하는 공간)
	
	// 게임관련 변수
	int[] com= {5,8,3};
	int[] user=new int[3];
	int s,b; // 멤버변수는 초기화가 안된 상태에서는 0값으로 초기화 되어 있음
	public MainClass() //멤버변수에 대한 초기화 담당
	{
		tf=new JTextField(10);
		tf.setEnabled(false);// 클래스는 초기화 => new
		ta=new JTextArea();
		JScrollPane js=new JScrollPane(ta);
		ta.setEnabled(false); // 비활성화 => 힌트출력 영역 
		bu1=new JButton("시작");
		bu2=new JButton("종료");
		
		// 윈도우에 배치
		JPanel p=new JPanel();
		p.add(tf); p.add(bu1); p.add(bu2);
		
		add("Center", js);
		add("South",p);
		
		// 윈도우 크기 설정
		setSize(350, 500);
		setVisible(true);
		
		tf.addActionListener(this); // 숫자를 입력하고 엔터를 치면 => actionPerformed
		bu1.addActionListener(this);
		bu2.addActionListener(this);
	}
	public static void main(String[] args) {
		MainClass m=new MainClass();

	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==bu2)
		{
			System.exit(0); // 프로그램 종료
		}
		else if (e.getSource()==bu1)
		{
			JOptionPane.showMessageDialog(this, "게임을 시작합니다!!"); // this - 윈도우 창 위에 띄우라는 명령어
			
			bu1.setEnabled(false); // 비활성화
			tf.setEnabled(true); // 활성화
			tf.requestFocus(); //focus
		}
		else if(e.getSource()==tf)
		{
			// 입력한 값을 가져 온다
			String strNum=tf.getText();
			if(strNum.length()<1)
			{
				String msg="세자리 정수를 입력하세요";
				ta.append(msg+"\n");
			}
			
			
			// 문자열 => 정수변환
			try 
			{
				int num=Integer.parseInt(strNum); // javac		java
				/*
				 * 	CheckException 		UncheckException
				 * 	===============
				 * 	컴파일시 검사			실행시에 검사
				 * 	= 반드시 예외처리		= 필요할때 예외처리
				 * 	IO (입출력) ***
				 * 	URL (네트워크)
				 * 	SQL (데이터베이스) ***
				 * 	Thread (쓰레드)
				 *  클래스 관련					
				 */
			}
			catch(NumberFormatException ex) // RunTimeException - 생략이 가능
			{
				String msg="정수만 입력이 가능합니다!!";
				ta.append(msg+"\n");
				tf.setText("");
				tf.requestFocus();
				
				// 처음으로 다시 돌아간다 (매소드만 종료할때)
				return;
			}
			
		}
		
	}

}

숫자야구게임을 윈도우 창에 띄우는 코드이다. 처음부터 끝까지 다 짜여진 코드는 아니고, 사용자가 입력할 가능성이 있는 코드들을 모아서 예외처리를 하는 과정때문에 쓰여진 코드이다.

 

 

숫자를 입력해야 게임이 가능하기 때문에 try-catch절을 사용해서 정수를 입력하지 않으면 다시 처음으로 돌아가게 하는 형식으로 코드를 짜고 있다. 

package com.sist.main;
/*
 * 예외 회피 : 시스템에서 처리 => throws
 * 형식) 
 * 		접근지정어 리턴형 메소드명 (매개변수..) throws 예상되는 에러등록 .....
 * 		예)
 * 		public void display throws NumberFormatException, NullPointerException, 
 * 									ClassCastException, Exception
 * 									=============================== 순서가 없다
 * 
 * 		=> display() 호출시에
 * 			= 회피
 * 			public void main() throws NumberFormatException, NullPointerException, 
 * 									ClassCastException, Exception
 * 			{
 * 				display();
 * 			}
 * 
 * 			public void main() throws Exception
 * 			{
 * 				display();
 * 			}
 * 			public void main() throws Throwable
 * 			{
 * 				display();
 * 			}
 * 
 * 			=복구
 * 			{
 * 				try
 * 				{
 * 					display()
 * 				}catch(Exception ex){}
 * 			}
 * 		
 * 			
 */
public class MainClass2 {
	public void display() throws Exception, NumberFormatException, ArrayIndexOutOfBoundsException, ArithmeticException // 그동안 생략하고 있었던것 - 그래서 안써도 가능하다 , Exception을 주면 check 에러들이 있기 때문에 반드시
																															// 에러처리를 해줘야함 
	{
		
	}
	public static void main(String[] args) throws Exception { // 이렇게 쓰면 에러 복구를 못하고 지나가기만함 
		
			MainClass2 m =new MainClass2();
//			FileReader fr=new FileReader("c:\\javaDev\\movie.json");
	}

}

에러를 처리하는 방법에는 에러를 복구하는 방법 | 회피하는 방법이 있는데, 후자는 간접처리에 해당한다. 

 

package com.sist.main;
/*
 * 	복구
 * 	회피 => 에러 통과 (복구할 수 없다) throws
 * 	전환 => 임의로 에러를 발생할 수 있다 throw
 * 	
 * 	프로그램 제작
 * 	=========
 * 		자바 : 미국 => 한국실정에 맞춰서 변경 => 사용자 정의 
 * 		throw -> 사용자 정의를 찾기 위해 사용하는 문장
 * 	예외처리
 * 	throw new 예외()
 * 		
 */
public class MainClass3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
			try 
			{
				String s=" 100";
				int i=Integer.parseInt(s); // 문자열을 정수로 변환
			}catch(NumberFormatException ex)
			{
				System.out.println("정수 변환 오류");
				try {
					throw new Exception(); //예외 처리 호출
					// throw => 사용자 정의 예외처리를 호출할때 주로 사용
					// throw => 마지막줄에 소스코딩을 한다
				}
				catch (Exception e) {
					System.out.println("다시 입력하세요!!");	
				}
				
			}catch(ArrayIndexOutOfBoundsException ex) {
				System.out.println("배열 범위 초과");
			}catch(Exception ex) {
				
			}
	}

}

위의 코드 역시 에러 처리를 해주는데  try-catch절을 이중으로 사용한 것을 볼 수 있다. 

throw new 예외()의 형식으로 써주면서 예외처리를 할 수 있다. 

 

학원에 나갔던 날이었는데 그냥 이정도로 예외처리를 복습하고 크게 색다른 내용은 배우지 않았던거 같다. 

728x90
반응형