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

Ambition님의 프로필 이미지
Ambition

작성한 질문수

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

퀴즈 #11

퀴즈 11을 if~else 대신 swtich문으로 풀어도 똑같은 결과가 나오는데, 취사선택의 문제일까요??

해결된 질문

작성

·

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문을 사용해도 원하는 결과를 얻을 수 있을 겁니다.

다른 문제가 있다면 언제든지 물어보세요!

Ambition님의 프로필 이미지
Ambition
질문자

그러면 질문있습니다. 보통 에러코드를 각각 다르게 구현해서 catch문으로 예외들을 처리하잖아요? 이럴 경우에는 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) {
    // 공통 예외 처리 로직
}

어떤 방식을 선택하는지는 프로젝트의 요구사항이나 규모, 복잡도 등에 따라 달라질 수 있지만 코드의 가독성과 유지보수를 고려하여 앞의 방법 중에서 적합한 것을 선택하시는 것이 좋겠습니다 😊

감사합니다.

Ambition님의 프로필 이미지
Ambition
질문자

아하 저렇게 사용자 정의 예외를 부모클래스로 두고, 처리하고 싶은 예외사항들로 상속시켜주면 되는군요! 대규모 프로젝트일 경우, 예외사항들이 많으면 저렇게 처리하면 모듈로 관리할 수 있어서 코드 가독성도 좋을 것 같네요 감사합니다 😊

Ambition님의 프로필 이미지
Ambition

작성한 질문수

질문하기