김미썸코딩

11/19 - Java (9) : 예외처리, 열거타입 본문

빅데이터 플랫폼 구축을 위한 자바 개발자 양성과정

11/19 - Java (9) : 예외처리, 열거타입

김미썸 2020. 11. 23. 08:46
728x90

복습 & 개념정리

OOP 이론 - 문법(문법이 아니고 oop이론이라고 생각해야한다.)

캡슐

*상속

              추상

              다형

                        +형변환

                        +오버라이드

              추상클래스

              인터페이스                 구현클래스의 메서드를 사용

 

상속과 추상을 생각하면서 다형을 생각해야한다.

추상클래스의 다형, 인터페이스의 다형 둘다 똑같다.

둘다 미완성된 추상메서드를 갖고 있기 때문에 똑같다.

 

 

*중첩 클래스

         멤버 필드

                   인스턴스 멤버 클래스

                   스태틱(정적) 멤버 클래스

                   로컬 클래스

                   익명 클래스 (UI할 때 사용한다.) 

 

*에러처리

에러

         컴파일 에러

         실행 에러( = runtime)

                   값(논리)오류

                    if

                    예외(Exception)를 통해서 처리

                              try {

                                       구문

                              } catch(익셉션 객체 변수){

                                       익셉션 발생시 처리 부분

                              } finally {

                                       무조건 수행

                              }

 

 


 

 

 

 

 

 

예외 처리


▷p430

exception은 오류가 날 수 있는 부분만 최대한 작게 처리해 주는 게 좋다.

 

 

 

 

 

1. 다중 catch

▷p433

여러가지 예외가 동시에 나올수 있다.

위에서 예외 발생하면 바로 넘어가기 때문에 아래의 예외들은 못잡는다. 순차적이다.

public class ExceptionEx05 {
    public static void main(String[] args){
        try{
            // Exception 발생 가능 1
            String data1 = args[0];
            String data2 = args[1];

            // Exception 발생 가능 2
            int value1 = Integer.parseInt(data1);
            int value2 = Integer.parseInt(data2);

            int result = value1 + value2;

            System.out.println(data1 + "+" + data2 + "=" + result);
        // Exception 1           
        }catch(ArrayIndexOutOfBoundsException e){
            System.out.println("실행 매개값의 수가 부족합니다.");
            System.out.println("[실행 방법]");
            System.out.println("java CatchByExceptionKindExample  num1   num2");
        // Exception 2
        }catch(NumberFormatException e){
            System.out.println("숫자로 변환할 수 없습니다.");
            
        
        }finally{
            System.out.println("다시 실행하세요.");
        }
    }
}

 

 

▷p434

| 는 or 처럼

 

 

▷p437 예제

catch(Exception e)를

catch(ArrayIndexOutOfBoundsException e)와 같이 세부적인 에러처리 위에 오게되면 실행이 안된다.

catch(Exception e)는 항상 제일 밑에 finally바로 위에 와야한다.

 

 

 

2. 위임

▷p440

메소드를 호출한 곳으로 예외를 떠넘길 수도 있다.

throws 키워드는 메소드 선언부 끝에 작성되어 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할을 한다.

main()에서도 throws 키워드를 사용하여 예외를 떠넘길 수 있는데 결국 JVM이 최종적으로 예외처리를 하게 된다.

JVM은 예외의 내용을 콘솔에 출력하는 것으로 예외 처리를 한다. 그러나 이것은 좋지 못한 방법니다.

main()에선 try-catch블록으로 예외를 최종 처리 하는 것이 바람직하다.

 

메서드에서 throws 하고 main이 try~catch 마무리함

 

다음 코드에서 method2 를 보자.

public class ExceptionEx07 {
    public void method1(int num ){
        System.out.println("시작");

        try{
            if(num < 100){
                // 강제 익셉션 발생
                throw new Exception("익셉션 발생");
            }
        }catch(Exception e){
            System.out.println("[익셉션]" + e.getMessage());
        }
    
        System.out.println("끝");
    }

    public void method2(int num) throws Exception {
        
        System.out.println("시작");

        if(num < 100){
            // 강제 익셉션 발생
            throw new Exception("익셉션 발생");
        }
        System.out.println("끝");
    }

    public static void main(String[] args){
        ExceptionEx07 e = new ExceptionEx07();
        e.method1(101);
        e.method1(10);

        try{
            e.method2(101);
        }catch(Exception e1){
            System.out.println("[익셉션]" + e1.getMessage());
        }
        
    }
}

 

api 메서드 안에서는 전부 위임으로 처리해놨다. 그래서 try, catch 를 꼭 우리가 구현해야 한다.

 

 

 

 

 

다음의 브라우저 열기 코드를 보자.

예외의 메세지가 출력된다.

 

 

 

3. 사용자 정의 예외

▷p443

 

 

 

 

4. 이클립스에서 예외처리하기

 

예외처리할 구간 드래그 > 우클릭 > surround With > try/catch 하면 자동완성

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

열거 타입 (enumeration type)


▷p171

몇개의 열거 상수 중에서 하나의 상수를 저장하는 데이터 타입이다.

모두 대문자로 써야하고 숫자형태(상수)로 저장된다.

 

1. 열거타입 선언

 

Week.java

Member.java

ProductKind.java

 

public enum Week{ MONDAY, TUESDAY, WEDNESDAY ,TURSDAY, FRIDAY , ... } 

 

 

 

2. 열거타입 변수 

  • 이클립스에서 new에 따로 enum만드는게 있다.
  • 문자열이 아니고 enum타입으로 특수한 타입이다.
  • 상수 값이 아니라 이름에 의한 접근이며 목록 중심이다.

 

3. 열거타입 메서드

java api에서 볼때 STATIC , INSTANCE 메서드 볼때 Exception위임 까지 같이봐라

// 상수값이 아니라 이름에 의한 접근
// 목록 중심
public enum Week {
	MONDAY,		// 0
	TUESDAY,
	WEDNESDAY,
	THURSDAY,
	FRIDAY,
	SATURDAY,
	SUNDAY
}
import java.util.Calendar;

public class EnumWeekExample {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Week week1 = Week.SATURDAY;
		Week week2 = Week.SATURDAY;
		
		Week today = null;

		
		Calendar cal = Calendar.getInstance();
		int week = cal.get(Calendar.DAY_OF_WEEK);
		
		switch(week) {
		case 1:
			today = Week.SUNDAY; break;		
	    case 2:
			today = Week.MONDAY; break;
		case 3:
			today = Week.TUESDAY; break;
		case 4:
			today = Week.WEDNESDAY; break;
		case 5:
			today = Week.THURSDAY; break;
		case 6:
			today = Week.FRIDAY; break;
		case 7:
			today = Week.SATURDAY; break;
		}
		
		System.out.println("오늘 요일: " + today);
		
		if(today == Week.SUNDAY) {
			System.out.println("일요일에는 축구를 합니다");
		}else {
			System.out.println("열심히 자바 공부합니다.");
		}
		
		System.out.println(week1 == week2);
		
		// String
		System.out.println(week1.name());
		// Week
		System.out.println(week1.SATURDAY);
		// 순서 번호
		System.out.println(week1.ordinal());
		
		Week[] days = Week.values();
		for(Week day: days) {
			System.out.println(day);
		}

	}

}

 

728x90
Comments