본문 바로가기

programming/Gukbi

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

728x90
반응형

오늘이면 수업을 들은지 꽉채운 한달이다. 물론 겨우 19일차밖에 안됐지만 서두...

생각보다 진도가 훅훅 나가서 그 두껍던 자바의 정석 책을 벌써 절반을 다 끝내간다. 

 

그 사이에 키보드도 장만하고 키보드쿠션도 사고 여튼 진짜 뭐 하는 사람 같아짐... 

예 각설하고요

 

오늘 배운 것을 정리해보도록 하겠습니다. 정말 정말 귀찮은데 한 번 시작했으니 끝을 꼭 봐야하기 때문에 눈물을 머금고 매일 매일 포스팅을 합니다. ... 

 

 

오늘은 인터페이스 복습+예외처리까지 진도를 나갔다. 

 

package com.sist.main;
/*
 *     1. 클래스 종류 
 *     ============
 *       일반 클래스 : 접근지정어 (public , default) 
 *                  옵션 (final , abstract)
 *                  public final
 *                  public abstract
 *                  final
 *                  abstract
 *       ----class className{
 *          =============
 *            기본: private : 외부에서 데이터를 사용하지 못하게 만든다(은닉화) => 캡슐화 
 *                           메소드와 멤버변수를 하나로 연결 사용 (getter/setter)
 *                           변수 : 메모리에 저장(setter) / 메모리에서 읽기 (getter)
 *            옵션: static , final
 *            = 멤버변수 : 여러개를 저장
 *            = static : 저장공간이 한개 ====> 오라클 (정규화)
 *            -----멤버변수 
 *            공통변수 
 *          ===================
 *            기본 : => 역할 : 다른 클래스와 연결(메세지)
 *                               =================
 *                               public 
 *            옵션 : final , static(자동 메모리 할당) , abstract(선언)
 *            동작,기능처리 
 *            -----메소드
 *          ===================
 *             멤버변수의 초기화 (컴파일러가 자동으로 추가(디폴트생성자)
 *             기본 : public => 다른 클래스를 메모리 할당후 사용  ==> 생성자는 상속은 예외
 *             생성자 => 오버로딩이 가능 (여러개의 생성자를 만들 수 있다)
 *            -----생성자
 *          ===================
 *       }
 *       추상 클래스 : 공통점을 모아서 관리 
 *                   메소드 선언 : 기능은 동일 => 처리 방식이 틀릴 경우 
 *                   => 관련된 클래스를 하나로 모아서 관리 
 *       형식)
 *             추상 클래스의 단점 : 자신이 메모리 할당을 할 수 없다 (상속받은 클래스로부터 메모리 주소를 받아서 사용)
 *             ========================================== 미완성 클래스
 *             abstract class A
 *             class B extends A
 *             ==> A a=new A() (X)
 *                 A a=new B()
 *             public abstract class className
 *             {
 *                 ==========================
 *                  변수 (멤버변수,공통변수)
 *                 ==========================
 *                  메소드 : 선언만 된 메소드 => 공통으로 사용하는 기능 
 *                 ==========================
 *                  메소드 : 구현된 메소드 => 컴퓨터 , 노트북 (시작, 종료)
 *                 ==========================
 *                  생성자 
 *                 ==========================
 *             }
 *       인터페이스 : 추상클래스의 일종
 *                  클래스 : 단일 상속
 *                  인터페이스 : 다중 상속
 *                  => 표준화 작업 
 *                  => 서로 다른 클래스를 연결해서 사용 
 *                  형식)
 *                  public interface 인터페이스명{
 *                    =====================
 *                     변수 : 상수형변수 => 선언시에 반드시 값을 저장
 *                           int a;(X)
 *                     (    )int a=10;  ===> public static final (생략)
 *                    =====================
 *                     메소드:선언만 가능 
 *                          void display(); ===> public abstract (생략)
 *                     public void display(); ===> 모든 메소드 public
 *                    =====================
 *                      구현된 메소드 : JDK 1.8이상 (예전에 만든 프로그램은 존재하지 않는다)
 *                      default void display(){} ==> default는 생략할 수 없다 
 *                      ======= default public void display(){} => public생략이 가능
 *                                      ====== 생략이 가능 
 *                    =====================
 *                      구현된 메소드 
 *                      static void display(){} => public 생략이 가능 
 *                      ======= static public void display(){}
 *                    =====================
 *                      => 개발자의 요청에 따라 추가 
 *                      => 인터페이스 : 선언만 한다 , 고정한다 
 *                                    유지보수 : 사용자의 요청
 *                  }
 *                  
 *       내부 클래스 : 익명의 클래스 , 멤버 클래스 (네트워크,쓰레드)
 *         class A
 *         {
 *            변수/메소드 => A,B가 사용이 가능 => static
 *            A가 서버 : 접속시마다 접속자의 IP
 *            class B
 *            {
 *               A가 가지고 모든 변수,메소드를 사용 => 접속자에게 메세지 전송 (IP)
 *            }
 *         }
 *         
 *         // 가장 쉽게 프로그램 => POJO (상속,구현) => 어노테이션 (구분자)
 *         class A
 *         {
 *              익명 => 상속이 없는 상태에서 오버라이딩 (윈도우,빅데이터)
 *              B b=new B(){
 *                 //B 클래스가 가지고 있는 모든 메소드를 재정의(오버라이딩)을 할 수 있다 
 *              }
 *         }
 *         
 *         class B
 *         {
 *             public void display(){}
 *         }
 *       ========================
 *                  1) 사용자 정의 클래스 
 *                  2) 라이브러리 (자바에서 제공하는 클래스) , 외부업체에서 만든 클래스
 *                                                     mvnrepository.com(스프링)
 *                  ====================================================== 조립 (조립하는 클래스)
 *                  클래스 : 재사용 = 포함,상속(변경해서 사용=오버라이딩)
 *                  
 *                  //ABBA
 */

public class MainClass {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        
	}

}

여기까지는 사실 저번시간 복습이다. 내부 클래스에 대해 새로 배우긴 했는데 어차피 많이 안나온다고 하셨다

그렇다 사실 뭔가를 더 적기가 너무 귀찮다.

 

package com.sist.main2;
/*
 *   키워드 : 클래스명 , 메소드명 (제외)
 */
interface DataBase
{
	public void connect();
	public void disconnect();
}
class Oracle implements DataBase
{

	@Override
	public void connect() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void disconnect() {
		// TODO Auto-generated method stub
		
	}
	
}
class MsSQL implements DataBase
{

	@Override
	public void connect() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void disconnect() {
		// TODO Auto-generated method stub
		
	}
	
}
class MySQL implements DataBase
{

	@Override
	public void connect() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void disconnect() {
		// TODO Auto-generated method stub
		
	}
	
}
class DB2 implements DataBase
{

	@Override
	public void connect() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void disconnect() {
		// TODO Auto-generated method stub
		
	}
	
}
class Container
{
	public DataBase dbSelect(String type)
	{
		DataBase db=null;
		if(type.equals("Oracle"))
			db=new Oracle();
		else if(type.equals("MsSQL"))
			db=new MsSQL();
		else if(type.equals("MySQL"))
			db=new MySQL();
		else if(type.equals("DB2"))
			db=new DB2();
		
		return db;
	}
}
public class MainClass {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        
	}

}

인터페이스 상속받은 뒤 내부 클래스에서 모아서 사용하고 있다. 

 

여기서 부터가 사실 가장 핵심인 예외처리하기 내용이다

 

package com.sist.exception;
/*
 * 	에러 
 * 	1. 에러 : 소스상에서 수정할 수 없는 에러 - 메모리 부족, 운영체제 문제...
 * 	2. 예외 : 소스상에서 수정할 수 있는 에러 - 사용자의 입력이 잘못된 경우, 파일명이 틀리다
 * 		=============================================================
 * 		에외 회피 : 간접처리 throws
 * 		예외 처리 : 직접 처리 try~catch
 * 				 임의 발생	throw
 * 				  사용자 정의 에외처리
 * 		=============================================================
 * 		예외처리 목적 : 비정상 종료 방지하고 정상 종료를 할 수 있게 만드는 과정
 * 					미리 에러를 방지할 수 있게 예측
 * 					에러 : 프로그래머 실수, 사용자 입력
 * 						  ====================
 * 		A.java ============> A.class(0,1) ============> 한줄씩 읽어서 출력
 * 		원시소스		javac						java
 * 		(프로그래머)
 * 					=======						=====
 * 
 * 					1. 컴파일 에러 - 반드시 예외처리
 * 											 2. 실행시 에러 - 예외처리 생략할 수 있다(필요시 예외처리를 할 수 있다)
 * 				======================================================
 * 				 	Check Exception 			NON-Check Exception					
 * 				======================================================
 * 					컴파일시에 확인				실행시에 확인 (예외처리가 없어도 된다)
 * 								
 * 								에외처리의 게층도
 * 								=============
 * 								
 * 								 Object
 * 									|
 * 								Throwable
 * 									|
 * 							----------------------
 * 							|					|
 * 							Error			Exception
 * 												|
 * 										Check							NON-Check
 * 										--------------------------------------------
 * 										  |										|
 * 										IOException (파일)						|
 * 										InterruptionException (쓰레드)    		|
 * 										URLMalformedException(네트워크)			|
 * 										ClassNotException						|
 * 										SQLException(데이터베이스)				RuntimeException
 *  																			|	
 * 																			ArrayIndexOutofBoundsException
 * 																			NumberFormatException
 * 																			ArithemticException
 * 																			NullPointerException
 * 																			ClassCastException
 * 									
 * 
 * 		예외처리
 * 			= 예외 복구 (직접처리)
 * 				try
 * 				{
 * 					정상 수행문장
 * 				}catch()
 * 					{
 * 					수행과정 => 에러발생을 하면 복구
 * 					}
 * 			= 예외 회피 (예외 떠넘기기) - 자바시스템 => Throws
 * 			= 예외 전환 (에러가 발생할 예상지역 => 다른 예외를 발생) => throw(사용자 정의 예외)
 * 
 * 									
 */

public class MainClass {

	public static void main(String[] args) {
		/*int a=10;
		int b=0;
		int result=a/b; // 프로그램 종료 => 비정상 종료
		System.out.println("프로그램 종료!!");*/
		
		try
		{
			int a=10;
			int b=0;
			int result=a/b; // 에러발생 ===> catch이동
			System.out.println("result="+result);
		}catch(Exception e) 
		{
			System.out.println("프로그램 오류!!"); // {} 다음 소스로 이동
		}
		System.out.println("프로그램 종료");
	}

}

try 안은 정상수행문장이고 그 안에서 에러가 발생하면 catch 문에 있는 내용을 수행한다. 

그리고 프로그램이 종료된다. 

 

이렇게 말입니다. 

 

package com.sist.exception;
/*
 * 	사용자로부터 2개의 정수를 받아서 배열에 저장한 다음에 두개 나누기한 결과값을 출력
 * 							========		  ======
 * 							catch => 3개 (기타)
 * 
 * 
 * 예상되는 에러?				
 */
import java.util.Scanner;
public class MainClass3 {

	public static void main(String[] args) {
		
		try
		{
			Scanner scan = new Scanner(System.in);
			System.out.print("첫번째 정수 입력:");
			int a=scan.nextInt();
			System.out.print("두번째 정수 입력:");
			int b=scan.nextInt();
			
			
			int[] arr= {a,b};
			int res=arr[0]/arr[1];
			System.out.println("res="+res);
			// catch에 등록한 예외처리 클래스에 순서가 존재한다-Exception이 가장큼
		}
		catch(ArrayIndexOutOfBoundsException e) // 배열의 범위를 벗어난 경우에만 처리가 가능
		{
			System.out.println("배열의 범위를 초과 했습니다");
		}catch(ArithmeticException e) // 0으로 나누기할때만 처리 가능
		{
			System.out.println("0으로 나눌 수 없습니다");
		}catch(RuntimeException e)
		{
			System.out.println("예측 못한 예외가 발생했습니다");
		}
			System.out.println("프로그램 종료");
	}

}

위의 코드는 에러의 종류를 확인할 수 있는 코드이다. Exception 에러는 저 위 코드들 보다 상위 개념의 오류이기 때문에 사용할거면 가장 아래에 사용해야 한다. 

그렇지 않으면 위에서 먼저 걸러지기 때문에 밑에서 오류 처리 실행문장을 쓴 의미가 없기 때문이다. 

 

package com.sist.exception;
// try~catch => 위치 선정을 잘해야 처리가 가능
public class MainClass5 {

	public static void main(String[] args) {
		
		int[] arr= {10,20,30,20,0,10,20,30,40,50};
		int a=100;
		try
		{
			for(int b : arr) // for문 안쪽에 try-catch 써줘야함
			{
				try {
					System.out.println(a/b);
				}catch(Exception e) {}
				
			}
		}catch(Exception ex)
		{
			ex.printStackTrace();
		}
		System.out.println("프로그램 종료!!");
	}

}

 

어려워 보였던 for문 안에서 예외처리하기

배열의 값들이 정상적으로 실행문장을 실행하는지 try구문을 통해 확인하고, 그때 오류가 있으면 오류처리를 해준 다음에 for 문을 닫는다. 

 

또 catch문을 사용해서 마지막으로 오류 처리를 최종적으로 해주고 코드를 마무리 한다. 

 

예시를 보면 0으로 나눈 값만 오류처리가 되어 건너뛴것을 확인할 수 있다

 

 

 

 

728x90
반응형