10. 예외처리와 enum

2023. 9. 10. 20:24Java

예외(Exception )처리

프로그램 실행 시 발생할 수 있는 예기치 못한 예외의 발생에 대비한 코드를 작성하는 것
 
목적 : 예외 발생으로 인한 실행중인 프로그램의 갑작스런 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것

 

*컴파일 에러

컴파일 단계에서 발견하여 컴파일러가 에러 메시지 출력 ex) 문법 구문 오류

 

*런타임 에러

컴파일에는 문제가 없더라도 실행시 발생하는 에러

오류(Error)와 예외(Exception)이 있다.


 

오류와 예외

  • Error(오류) : 수습할 수 없는 심각한 오류

             ex) 메모리 부족, 스택오버플로우 등 발생하여 프로그램이 죽는것은 프로그래머가 제어할 수 없음.

  • Exception(예외) 예외 처리를 통해 수습할 수 있는 덜 심각한 오류

 

예외 종류

1) RuntimeException

- RuntimeException을 상속받고 있는 Exception

- 런타임 시에 발생하는 예외 (Exception처리를 안해줘도 컴파일 시에는 에러가 없다.)

ex)

  • 배열의 범위를 벗어남 (ArrayIndexOutOfBoundsException)
  • 값이 null인 참조 변수의 멤버를 호출 (NullPointerException)

 

2) CheckedException (컴파일 시 예외 발생)

- RuntimeException을 상속받고 있지 않은 기본적인 Exception

- 반드시 예외를 처리해야함

- 외적인 요인에 의해 발생하는 컴파일 시 발생하는 예외

ex)

  • 존재하지 않는 파일의 이름을 입력 (FileNotFoundException)
  • 실수로 클래스의 이름을 잘못 기재 (ClassNotFoundException)
  • 입출력 (IOException)

 

예외 처리 방법

1. try-catch

 

try 구문에서 예외가 발생되면

예외 클래스에 맞는 catch문으로 가서 catch 블록 안에 있는 코드를 처리한다.

            try{
//                로직
            }catch (Exception클래스명 변수명){
//                예외 처리 코드
            }finally{
//          예외와 관계없이 무조건 실행되는 코드
            }

=> printStackTrack() 메서드 : catch문 안에서 실행하면 한꺼번에 예외처리를 하여도 세세한 예외 상황을 추적할 수 있다.

 

 

2. throw & throws

 

  • throw - 개발자가 의도적으로 예외를 발생시키는 것
public static void main(String[] args) {

    try{
        throw new Exception(); //강제로 Exception 객체 생성
    }catch (Exception e){
        e.printStackTrace(); //예외 발생
    }

 

  • throws - 메소드 내에서 예외처리를 하지않고 해당 메소드를 사용한 곳에서 예외 처리를 하도록 예외를 전가하는 것
   리턴타입 메소드명 (매개변수선언1, ... ) throws Exception클래스명1, Exception클래스명2 .. {
       ...
    }
public void exception1{

    try{
        ex1(); //메소드 호출
    }catch (ClassNotFoundException e){ //호출한 곳에서 예외 처리
        System.out.println("클래스가 존재하지 않습니다.");
    }
}

public void ex1() throws ClassNotFoundException{
    Class clazz = class.forName("java.lang.String2"); //예외 발생
}

 

 

 

Enum 

 

요일이나 계절처럼 한정된 개수의 값들을 하나로 묶어서 사용하고 싶을 때, 열거 타입을 사용

상수 데이터들의 집합

 

 

* Enum 메소드 종류

메소드 설명 리턴 타입
name() 열거 객체의 문자열을 리턴 String
ordinal() 열거 객체의 순번을 리턴(0부터 시작) int
compareTo() 열거 객체를 비교해서 순번 차이를 리턴 int
valueOf(String name) 문자열을 입력받아서 일치하는 열거 객체를 리턴 enum
values() 모든 열거 객체들을 배열로 만들어 리턴 enum[]

 

* Enum  특징

Type-Safety

정해진 값만 변수에 할당할 수 없다는 문제점 (No Type-Safety) => 미리 정의된 Enum안에 선언된 상수만 전달될 수 있다.

 

 

 

* Enum  사용법

1. 생성자를 가질 수 있다. (단, 생성자는 private)

 

public enum Gender {
    //    상수뒤에 괄호가 있으면 Enum의 생성자를 호출한 것
    MALE("XY"),
    FEMALE("XX");
    
    private String chromosome ; //염색체
    private Gender(String chromosome){
        this.chromosome = chromosome;
    }

//object가 가지고 있는 toString()메소드를 오버라이딩하여
//enum안에 선언된 메소드나 변수를 사용
    @Override
    public String toString() {
        return "Gender{" +
                "chromosome='" + chromosome + '\'' +
                '}';
    }

    public void print(){
        System.out.println("염색체 정보 : "+chromosome);
    }
}
public class GenderTest {

    public static void main(String[] args) {
        Gender gender = Gender.MALE;
        System.out.println(gender);

        gender.print();
        
        //결과 :
        //Gender{chromosome='XY'}
        //염색체 정보 : XY
    }
}

 

2. Enum 상수 간의 비교가 가능하다

>,<와 같은 비교연산자는 사용할 수 없고 == 이나 compareTo()를 사용하여 비교할 수 있다.

 

3. Enum은 인터페이스를 구현하고, 해당 인터페이스를 오버라이딩하여 구현할 수 있다.

public interface Printer {
    public void print();
}
public enum Color implements Printer{
    RED("FF0000"),
    GREEN("00FF00"),
    BLUE("0000FF");

    private String rgb;
    private Color(String rgb){
        this.rgb = rgb;
    }

    @Override
    public void print() {
        System.out.println("rgb : "+rgb);
    }
}
public class ColorTest {

    public static void main(String[] args) {
        Color color = Color.RED;
        color.print();
        // 결과
        //rgb : FF0000

    }
}

 

4. Enum은 추상메소드를 가질 수 있다. 추상메소드를 가질 경우엔 상수를 정의할 때 추상메소드를 함께 구현해 줘야한다.

public enum Country {
    KOREA{
        public void print(){
            System.out.println("대한민국");
        }
    },
    USA{
        @Override
        public void print() {
            System.out.println("미국");
        }
    };

    public abstract void print();
}

 

5. Enum객체는 Enum상수가 처음 호출되거나 참조될 때 생성된다.

 

'Java' 카테고리의 다른 글

11. 회원관리 프로그램  (0) 2023.09.10
9. 컬렉션 프레임 워크와 제네릭  (0) 2023.09.04
8. 익명 클래스와 람다식  (0) 2023.09.04
7. 자바 리플렉션 (Reflection)  (0) 2023.09.04
6. 불변 객체 (Immutable Object) & Final  (0) 2023.09.03