해결된 질문
작성
·
219
0
package chap_11;
public class _Quiz_11 {
public static void main(String[] args) {
//todo 사용자 정의 예외 클래스(extends Exception을 통해 가능)
//todo 예외 객체 생성 메시지가 2개인 것을 보아, 클래스도 2개를 만들어야 할듯...?
//todo 경우의 수가 3가지니까 if~else문으로 작성
int errorCode = 0;
try {
switch (errorCode) {
case 0:
System.out.println("상품 구매를 완료하였습니다.");
break;
case 1:
throw new NotOnSaleException("상품 구매 가능 시간이 아닙니다.");
case 2:
throw new SoldOutException("해당 상품은 매진되었습니다.");
default:
throw new Exception("이외의 에러코드는 여기서 처리하였습니다.");
}
} catch (NotOnSaleException e) {
System.out.println(e.getMessage());
System.out.println("상품 구매는 20시부터 가능합니다.");
} catch (SoldOutException e) {
System.out.println(e.getMessage());
System.out.println("다음 기회에 이용해주세요.");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
class NotOnSaleException extends Exception {
public NotOnSaleException(String msg) {
super(msg);
}
}
class SoldOutException extends Exception {
public SoldOutException(String msg) {
super(msg);
}
}
위의 errorCode를 각각넣으면 퀴즈의 요구사항대로 정상적으로 출력이 됩니다. 또한, int errorCode = 99;
같이 default에 해당하는 다른 값을 넣어도 정상적으로 다음과 같이 출력이 되구요:
제목과 같이 if~else문이나 swtich문으로 선택하는 것은 개인의 자유인가요? 아니면 특정 상황에 따라 다른가요?
답변 2
1
안녕하세요, 인프런 AI 인턴이에요.
퀴즈 11의 경우, if~else문 대신 switch문을 사용해서 동일한 결과를 얻을 수 있는지 궁금하신 거죠?
네, 맞습니다. if~else문과 switch문은 같은 결과를 얻을 수 있는 조건문입니다. if~else문은 조건의 수가 많을 때 주로 사용되고, switch문은 조건의 수가 제한적일 때 더 간결하게 표현할 수 있습니다.
퀴즈 11의 경우, errorCode 변수의 값에 따라 다른 예외를 발생시키는 경우입니다. errorCode의 값에 따라 다른 동작을 수행할 수 있으므로, switch문을 사용하여 각 경우에 대한 동작을 구현할 수 있습니다. 따라서, switch문을 사용해도 원하는 결과를 얻을 수 있을 겁니다.
다른 문제가 있다면 언제든지 물어보세요!
0
안녕하세요?
먼저 답변이 늦어진 점 사과 드립니다 🙇♂️
첫 번째 질문에 대한 답변입니다.
11번 퀴즈의 해결은 if 문 또는 switch 문 아무거나 사용하셔도 괜찮지만, 예제와 같이 코드가 정해져 있는 에러에 대한 처리의 경우라면 switch 문을 사용하는 것이 더 좋다는 의견입니다. if 문과 switch 문은 서로 사용될 수 있는 상황이 조금 다르기 때문에 각 상황에 따라 무엇을 선택할지 판단이 필요합니다. 가령 '어떤 구간 내의 수' 라는 조건이라면 switch 문보다는 if 문이 적합합니다. 어느 박물관의 입장료가 초등학생은 1,000원, 중학생은 1,300원이라고 한다면 switch 문을 사용해서 이렇게 할 수 있어요.
int age = 14; // 중학생
switch (age) {
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
System.out.println("초등학생 1,000원");
break;
case 14:
case 15:
case 16:
System.out.println("중학생 1,300원");
break;
default:
System.out.println("직원에게 문의하세요");
}
초등학생 나이 구간 (과거 나이 계산법으로 8~13세), 중학생 나이 구간 (14~16세) 을 여러 개의 case 로 처리를 했지요. 하지만 if 문을 사용한다면 훨씬 간결하게 작성이 가능합니다.
int age = 13; // 초등학생
if (age >= 8 && age <= 13)
System.out.println("초등학생 1,000원");
else if (age >= 14 && age <= 16)
System.out.println("중학생 1,300원");
else
System.out.println("직원에게 문의하세요");
이 경우라면 switch 보다는 if 가 좋은 선택이겠지요 👍
이어서 두 번째 질문에 대한 답변입니다.
에러코드는 다양하게 처리를 할 수 있는데요.
가장 직관적인 방법으로는 다음과 같이 발생 가능한 예외에 대해 개별적인 catch 문을 사용할 수 있습니다.
try {
// 예외 발생 가능한 코드
} catch (ExceptionType1 e1) {
// 예외 처리 로직 1
} catch (ExceptionType2 e2) {
// 예외 처리 로직 2
} // ...
또는 말씀하신 것처럼 상속을 통해 공통적인 예외를 묶어서 처리할 수도 있습니다. 이렇게 하면 공통 로직을 한 곳에서 관리할 수 있으며 새로운 예외가 추가되어도 기존 코드를 수정하지 않아도 된다는 이점이 있지요.
// 사용자 정의 예외
class CustomException extends Exception {
// 공통적인 로직 및 필드
}
class SpecificException1 extends CustomException {
// 특화된 로직 및 필드 1
}
class SpecificException2 extends CustomException {
// 특화된 로직 및 필드 2
}
// 예외 처리
try {
// 예외 발생 가능한 코드
} catch (CustomException ce) {
// 공통 예외 처리 로직
}
어떤 방식을 선택하는지는 프로젝트의 요구사항이나 규모, 복잡도 등에 따라 달라질 수 있지만 코드의 가독성과 유지보수를 고려하여 앞의 방법 중에서 적합한 것을 선택하시는 것이 좋겠습니다 😊
감사합니다.
아하 저렇게 사용자 정의 예외를 부모클래스로 두고, 처리하고 싶은 예외사항들로 상속시켜주면 되는군요! 대규모 프로젝트일 경우, 예외사항들이 많으면 저렇게 처리하면 모듈로 관리할 수 있어서 코드 가독성도 좋을 것 같네요 감사합니다 😊
그러면 질문있습니다. 보통 에러코드를 각각 다르게 구현해서 catch문으로 예외들을 처리하잖아요? 이럴 경우에는 switch문으로 일일이 다 구현하나요? 이러면 코드 가독성이 안좋아질텐데도 말이죠
아니면 상속을 이용해서 공통적인 예외를 묶어서 처리하나요?