실습, 코드에 try/catch 문을 적용해 주세요
• basic 폴더에 ex1 패키지를 만들어 주시고, Ex1Main 클래스를 만들어 주
세요.
• 그리고 아래의 코드에 대한 예외 처리를 통해,
제일 마지막 줄의 “예외 처리완료!” 가 출력 되도록 코드를 수정해 주세요.
• catch 구문의 에러는 해당 코드에서 발생하는 예외를 정확하게 받아서
e.printStackTrace(); 를 실행
해 주시면 됩니다

이 코드는 예외 처리를 배우기 위한 예제.

예외 처리는 프로그램에서 예상치 못한 오류가 발생했을 때 이를 처리하는 방법을 말한다.

package basic.ex1;

public class Ex1Main {
    static class Parent {};
    
    static class Child extends Parent {
       void childMethod() {
         System.out.println("Child.childMethod);
       }
    }
    public static void main(String[] args) {
       try {
           Parent parent = new Parent();
           Child poly = (child) parent; // 오류가 발생하는 부분
           poly.childMethod();
       } catch (ClassCastException e) {
            e.printStackTrace(); // 예외 발생 시 스택 트레이스를 출력
       }
       System.out.println("예외 처리 완료!");
    }
}

코드의 로직.

  1. Parent라는 클래스를 만든다.
  2. Parent 클래스를 상속받아 Child라는 클래스를 만든다.
    Child클래스에는 childMethod라는 메소드가 있다.
  3. main 메소드에서 Parent 객체를 생성한다.
  4. 생성한 Parent 객체를 Child 객체로 변환하려고 시도한다.
    이 부분에서 오류가 발생한다.
  5. 발생한 오류를 catch 블록에서 처리한다.
  6. 오류가 발생해도 마지막 줄의 "예외 처리 완료!" 메시지를 출력한다.

코드 설명.

  1. 패키지 선언.
package basic.ex1;
  1. Parent 클래스 정의: Parent라는 빈 클래스를 정의.
static class Parent {};
  1. Child 클래스 정의: Parent 클래스를 상속받는 Child 클래스를 정의.
    이 클래스에는 childMethod라는 메소드가 있다.
    static class Child extends Parent {
     void childMethod() { 
         System.out.println("Child.childMethod"); 
     }
    }

4. main 메소드: 프로그램의 시작점.

public static void main(String[] args) {
try {
Parent parent = new Parent();
Child poly = (Child) parent; // 오류가 발생하는 부분
poly.childMethod();
} catch (ClassCastException e) {
e.printStackTrace(); // 예외 발생 시 스택 트레이스를 출력
}
System.out.println("예외 처리 완료!");
}

> ClassCastException이란 무엇인가?
### ClassCastException이란 무엇인가?

#### 초등학생에게 설명

어떤 상자(객체)에 사과(Child)가 들어있다고 생각해봐. 그런데 어떤 사람이 그 상자를 보고 바나나(Parent)라고 생각하고 꺼내려 하면 안 맞잖아? 이럴 때 컴퓨터가 "이건 바나나가 아니라 사과야!"라고 말하는 거야. 그게 바로 `ClassCastException`이야. 즉, 사과를 바나나라고 착각해서 오류가 나는 거지.

#### 개발자 교육생에게 설명

`ClassCastException`은 자바에서 발생하는 런타임 예외 중 하나로, 객체를 하위 클래스나 상위 클래스로 캐스팅할 때 타입이 맞지 않으면 발생합니다. 즉, 부모 클래스 타입의 객체를 자식 클래스 타입으로 강제 캐스팅하려고 할 때, 해당 객체가 실제로 그 자식 클래스의 인스턴스가 아니라면 `ClassCastException`이 발생합니다.

### 예제 코드와 설명

다음은 `ClassCastException`이 발생할 수 있는 예제 코드와 그 설명입니다.

```java
public class Example {
    static class Parent {}
    static class Child extends Parent {}

    public static void main(String[] args) {
        Parent parent = new Parent(); // Parent 객체 생성
        Child child = (Child) parent; // Parent 객체를 Child로 캐스팅 시도 (오류 발생)
    }
}

위 코드에서는 Parent 객체를 Child 객체로 캐스팅하려고 시도합니다. 그러나 parent 객체는 실제로 Child 타입이 아니므로 ClassCastException이 발생합니다.

수정된 코드

오류가 발생하지 않도록 하려면, 실제로 Child 객체를 생성해서 사용해야 합니다.

public class Example {
    static class Parent {}
    static class Child extends Parent {}

    public static void main(String[] args) {
        Parent parent = new Child(); // Child 객체를 Parent 타입으로 생성
        Child child = (Child) parent; // 정상적으로 캐스팅 가능
        // 또는
        Child anotherChild = new Child(); // 직접 Child 객체 생성
    }
}

이제 parent 객체는 실제로 Child 타입이므로 안전하게 Child로 캐스팅할 수 있습니다.

예외 처리 코드 예제

ClassCastException을 처리하는 방법을 보여주는 코드입니다.

public class Ex1Main {
    static class Parent {};
    static class Child extends Parent {
        void childMethod() { 
            System.out.println("Child.childMethod"); 
        }
    }

    public static void main(String[] args) {
        try {
            Parent parent = new Parent();
            Child child = (Child) parent; // 오류가 발생하는 부분
            child.childMethod();
        } catch (ClassCastException e) {
            e.printStackTrace(); // 예외 발생 시 스택 트레이스를 출력
        }
        System.out.println("예외 처리 완료!");
    }
}

e.printStackTrace(); 코드에 대한 설명

e.printStackTrace(); 코드에 대한 설명

초등학생에게 설명

상상해봐, 네가 그림을 그리다가 실수로 종이를 찢었어. 그래서 왜 종이가 찢어졌는지 친구에게 설명해 주고 싶은 거야. 이때 종이를 찢은 원인을 그대로 친구에게 보여주는 것과 비슷해. 컴퓨터 프로그램에서 문제가 생겼을 때 그 문제의 원인을 화면에 출력하는 거야. 바로 이걸 printStackTrace라고 불러.

개발자 교육생에게 설명

e.printStackTrace();는 자바에서 예외 처리 중 예외의 호출 스택(trace)을 출력하는 메서드입니다. 이 메서드는 예외가 발생한 위치와 경로를 자세히 보여줍니다. 이 정보를 통해 개발자는 어떤 코드에서, 어떤 상황에서 예외가 발생했는지 추적할 수 있습니다.

예제 코드와 출력 예시

다음은 printStackTrace를 사용하는 예제 코드입니다.

public class Example {
    public static void main(String[] args) {
        try {
            int result = 10 / 0; // 0으로 나누기 시도, ArithmeticException 발생
        } catch (ArithmeticException e) {
            e.printStackTrace(); // 예외의 스택 트레이스를 출력
        }
        System.out.println("프로그램이 계속 실행됩니다.");
    }
}

이 코드가 실행되면 다음과 같은 출력이 나옵니다.

java.lang.ArithmeticException: / by zero
    at Example.main(Example.java:4)
프로그램이 계속 실행됩니다.

e.printStackTrace();의 역할

  1. 예외 정보 출력: 예외의 타입과 메시지를 출력합니다. 예를 들어, java.lang.ArithmeticException: / by zero.
  2. 호출 스택 추적: 예외가 발생한 메서드 호출 순서를 보여줍니다. 위 예제에서는 Example.main(Example.java:4)이라는 정보가 출력되어, Example.java 파일의 4번째 줄에서 예외가 발생했음을 알 수 있습니다.
  3. 디버깅 도움: 개발자가 예외 발생 지점을 빠르게 파악하고 문제를 해결하는 데 큰 도움을 줍니다.

코드 전체 예제

문제의 코드에 printStackTrace를 포함한 예제입니다.

package basic.ex1;

public class Ex1Main {
    static class Parent {};
    
    static class Child extends Parent {
        void childMethod() { 
            System.out.println("Child.childMethod"); 
        }
    }
    
    public static void main(String[] args) {
        try {
            Parent parent = new Parent();
            Child child = (Child) parent; // 오류가 발생하는 부분
            child.childMethod();
        } catch (ClassCastException e) {
            e.printStackTrace(); // 예외 발생 시 스택 트레이스를 출력
        }
        System.out.println("예외 처리 완료!");
    }
}

요약

  • 초등학생에게: 컴퓨터 프로그램에서 문제가 생기면 그 문제의 원인을 화면에 보여주는 방법.
  • 개발자 교육생에게: e.printStackTrace();는 예외 발생 시 예외의 호출 스택(trace)을 출력하여, 예외가 발생한 위치와 경로를 자세히 보여주는 메서드입니다. 디버깅에 큰 도움이 됩니다.

이 설명을 통해 e.printStackTrace();의 역할과 중요성을 쉽게 이해할 수 있을 것입니다.

요약

  • ClassCastException은 객체를 잘못된 타입으로 캐스팅하려고 할 때 발생하는 예외입니다.
  • 이 예외를 방지하려면, 실제로 해당 타입의 객체를 생성해야 합니다.
  • 예외가 발생할 가능성이 있는 부분은 try-catch 구문을 사용하여 처리할 수 있습니다.

이렇게 설명하면 ClassCastException이 무엇인지, 왜 발생하는지, 그리고 이를 어떻게 해결할 수 있는지 이해할 수 있을 것입니다.

5.try 블록: 예외가 발생할 수 있는 코드를 실행.
여기서는 Parent 객체를 Child 객체로 강제 변환.

try {
  Parent parent = new Parent();
  Child poly = (Child) parent; // 오류가 발생하는 부분
  poly.childMethod();
}

오류 발생 원인!!
생각해봐, 엄마(Parent)와 아들(Child)이 있다고 상상해보자. 아들은 엄마로부터 태어났지만, 엄마는 아들이 아니잖아. 여기서 컴퓨터는 엄마를 아들이라고 말하려고 하니까 혼란스러워서 오류가 발생하는 거야. 그래서 엄마는 아들이 될 수 없다는 오류를 컴퓨터가 알려주는 거지.

자바에서 Parent 객체를 Child 객체로 강제 변환(casting)하려고 하면 ClassCastException이 발생합니다. 왜냐하면 Parent 클래스의 인스턴스는 Child 클래스의 인스턴스가 아니기 때문입니다. Parent 클래스는 Child 클래스의 슈퍼클래스이므로, Parent 객체는 Child 객체로 캐스팅될 수 없습니다. 이것은 부모 클래스의 인스턴스를 자식 클래스의 인스턴스로 변환하려고 하는 잘못된 시도입니다.

해결 방법

초등학생에게 설명

엄마를 아들이라고 말하려고 하지 말고, 그냥 엄마는 엄마라고 말해야 해. 아들이 필요하면 아들을 직접 만들어야 해.

개발자 교육생에게 설명

Parent 객체를 Child 객체로 변환하려는 시도는 잘못된 접근 방식입니다. Child 객체가 필요하다면, Child 객체를 직접 생성해야 합니다.

코드 수정

초등학생에게 설명

public class Ex1Main {
    static class Parent {};
    
    static class Child extends Parent {
        void childMethod() { 
            System.out.println("Child.childMethod"); 
        }
    }
    
    public static void main(String[] args) {
        try {
            Child poly = new Child(); // 직접 아들을 만들어야 해
            poly.childMethod();
        } catch (Exception e) {
            e.printStackTrace(); // 문제가 생기면 알려줘
        }
        System.out.println("예외 처리 완료!"); // 프로그램이 끝났다는 걸 알려줘
    }
}

개발자 교육생에게 설명
Child 객체를 사용하고 싶다면, Child 객체를 직접 생성해야 합니다. 이렇게 하면 ClassCastException이 발생하지 않습니다.

package basic.ex1;

public class Ex1Main {
    static class Parent {};
    
    static class Child extends Parent {
        void childMethod() { 
            System.out.println("Child.childMethod"); 
        }
    }
    
    public static void main(String[] args) {
        try {
            Child poly = new Child(); // 직접 Child 객체를 생성합니다
            poly.childMethod();
        } catch (Exception e) {
            e.printStackTrace(); // 예외 발생 시 스택 트레이스를 출력
        }
        System.out.println("예외 처리 완료!"); // 프로그램이 끝났다는 걸 알려줍니다
    }
}

요약

•	오류 원인: Parent 객체를 Child 객체로 강제 변환하려고 할 때 발생합니다.
•	해결 방법: Child 객체를 직접 생성합니다.
•	코드 수정: Parent parent = new Parent();를 Child poly = new Child();로 변경합니다.

이렇게 하면 오류가 발생하지 않고 정상적으로 프로그램이 실행됩니다.


6.catch 블록: ClassCastException 예외가 발생하면 이를 잡아서 처리.
여기서는 예외의 스택 트레이스를 출력.

        ```

catch (ClassCastException e) {
e.printStackTrace(); // 예외 발생 시 스택 트레이스를 출력
}


7. 마지막 메시지 출력: 예외가 발생해도 마지막 줄의 “예외 처리 완료!” 메시지를 출력.

System.out.println("예외 처리 완료!");

  

0개의 댓글