인프런 커뮤니티 질문&답변

free.db.xb.qm0101님의 프로필 이미지
free.db.xb.qm0101

작성한 질문수

나도코딩의 자바 기본편 - 풀코스 (20시간)

퀴즈 #11

퀴즈 11 질문 입니다.

작성

·

252

0

아래의 코드를 보시면 에러 1은 퀴즈의 정답대로 처리를 하였고

에러 2는 그냥 sout으로 바로 출력을 하였습니다.

당연히 퀴즈의 물음은 에러 2처럼 출력을 하는것이 아닌거는 알고있지만 출력 결과는 같습니다.

문제의 의도는 예외 객체 생성메시지, 예외 처리 메시지를 각각 만드는 연습을 하는것인건 알겠지만, 출력은 똑같이 나오니 이걸 어떻게 구분하는지, 그냥 sout출력과 무슨 차이인지 잘 모르겠습니다.(굳이 이 문제에서 thow,catch를 써서 처리하는 이유, 아니면 단지 이 문제에서만 이렇지 실무가면 확연하게 차이가 나는 부분인지)

아직 너어어어무 초보 수준이라 질문 자체가 두서가 없는거 같고 아마 질문 보시면 헛웃음 나오실거 같긴합니다..

package chap_11;

// 에러코드
// 0 (에러 없음), 1 (판매 시간 아님), 2 (매진)

// 0 인 경우? 상품 구매를 완료하였습니다.
// 1 인 경우? 상품 구매 가능 시간이 아닙니다. / 상품 구매는 20시부터 가능합니다.
// 2 인 경우? 해당 상품은 매진되었습니다. / 다음 기회에 이용해주세요.

public class TEST {
public static void main(String[] args) {
int errorCode = 2;
try {
if (errorCode == 0) {
System.out.println("상품 구매를 완료하였습니다.");
} else if (errorCode == 1) {
throw new AppleException("상품 구매 가능 시간이 아닙니다.");
} else if (errorCode == 2) {
System.out.println("해당 상품은 매진되었습니다.");
System.out.println("다음 기회에 이용해주세요.");
}

} catch (AppleException e) {
System.out.println(e.getMessage());
System.out.println("상품 구매는 20시부터 가능합니다.");
}
}
}

class AppleException extends Exception {

public AppleException(String message) {
super(message);
}
}

class Banana extends Exception {
public Banana(String message) {
super(message);
}

답변 1

0

나도코딩님의 프로필 이미지
나도코딩
지식공유자

안녕하세요?

예외처리가 되어 있지 않은 프로그램에서 문제가 발생하게 되면 그 즉시 프로그램은 종료됩니다. 가령 다음과 같이 1 나누기 0 이라는 불가능한 연산을 수행하는 코드를 적었을 때 예외처리를 하지 않으면 결과는 어떻게 될까요?

public class Sample {
    public static void main(String[] args) {
        System.out.println("시작 문장");
        System.out.println(1 / 0); // 문제가 발생하는 코드
        System.out.println("끝 문장");
    }
}

다음과 같이 '시작 문장' 이라는 문장이 출력된 뒤에 문제가 발생하고 그 즉시 프로그램이 종료되었습니다. '끝 문장' 부분은 실행되지 않은 것이죠.

시작 문장
Exception in thread "main" java.lang.ArithmeticException: / by zero
	at Sample.main(Sample.java:4)

코드를 바꿔서 다음과 같이 예외처리를 적용해보겠습니다.

public class Sample {
    public static void main(String[] args) {
        System.out.println("시작 문장");
        try {
            System.out.println(1 / 0); // 문제가 발생하는 코드
        } catch (Exception e) {
            // 예외처리
        }
        System.out.println("끝 문장");
    }
}

실행 결과는 다음과 같습니다.

시작 문장
끝 문장

예외처리가 되었기 때문에 문제가 발생하는 코드가 있어도 catch 문 내에서 어떤 처리(위 예제에서는 아무것도 하지 않음)를 하고 나서 이어서 프로그램이 실행되어 '끝 문장' 이 출력된 것을 알 수 있습니다.

프로그램에서는 예기치 못한 상황이 종종 발생하기 때문에 예외처리는 반드시 필요한데요. 질문주신 것처럼 우리 퀴즈에서는 에러의 코드에 따른 서로 다른 예외처리를 연습하고자 아주 간단한 System.out.println() 를 출력하는 부분만 작성하였고 try 문 내에서도 에러가 발생하는 코드는 없기 때문에 작성하신 것처럼 하셔도 동작은 같습니다.

하지만 실무에서 만나게 되실 예외처리는 그리 간단하지만은 않습니다. 운영 중인 서비스 또는 판매 중인 프로그램 수행 중에 어떤 문제가 발생하여서 프로그램이 종료되거나 서비스가 먹통이 되면 아주 치명적이죠.

예를 들어 어느 온라인 쇼핑몰에서 어떤 상품을 구매하려고 하는데 알고보니 그 상품은 딱 1개만 남아 있었던 거에요. 그런데 사용자는 옵션으로 상품 수를 5개로 설정하고 구매 버튼을 누르면 어떻게 될까요? 또는 구매 버튼을 클릭하기 직전에 마지막 남은 상품이 다른 사용자에 의해 품절이 된다면요? 일반적인 경우라면 다음 단계인 구매 화면으로 넘어가는 대신 구매 상품 수를 조절해야 한다거나 품절이 되었다는 안내가 되어야 하겠죠.

그런데 이 쇼핑몰은 예외처리가 올바로 되지 않아서 문제가 발생하였음에도 불구하고 안내는 커녕 계속해서 빙글빙글 '로딩 중..' 이라는 이미지만 보여지고 있었습니다. 아마 사용자는 '서버가 조금 늦나보다' 하고 한참을 의미없이 기다려야 할 수도 있겠죠.

이때 try catch 를 통해 상품 구매 단계에서 발생할 수 있는 문제에 대해 적절한 예외처리가 된다면 사용자는 어떤 문제가 발생했는지 인지하고 구매 상품 수를 조절하거나 이 상품은 품절되었으니 다른 상품을 보러 갈 수 있을 것입니다. 가령 품절이 되었다면 페이지를 다시 로딩하여 '구매 가능' 상태에서 '품절' 상태로 변경되도록 하거나 경우에 따라 상품 소개 URL 이 더 이상 사용자들에게 노출되지 않도록 처리할 수도 있을 것 같아요.

궁금증 해결에 도움되길 바라겠습니다 😊
감사합니다.

free.db.xb.qm0101님의 프로필 이미지
free.db.xb.qm0101

작성한 질문수

질문하기