class exercise{
public static void main(String[] args) throws Exception
{
throw new UnsupportedFunctionException("지원하지 않는 기능입니다.",100);
}
}
class UnsupportedFunctionException extends RuntimeException{
final private int ERR_CODE;
UnsupportedFunctionException(String msg, int errCode){
super(msg); // 조상클래스 RuntimeException의 생성자를 호출
ERR_CODE = errCode;
}
UnsupportedFunctionException(String msg){
this(msg, 100);
}
public int getErrorCode(){
return ERR_CODE;
}
public String getMessage(){
return "[ " + getErrorCode() + " ]" + super.getMessage();
}
}
굉장히 헷갈린 부분이 있다.
UnsupportedFunctionException(String msg, int errCode){
super(msg); // 조상의 생성자 RuntimeException(String msg)를 호출
ERR_CODE = errCode;
}
UnsupportedFunctionException(String msg){
this(msg, 100);
}
왜 생성자를 두 번 써주는 것일까?
위 생성자와 아래 생성자의 역할 차이는 무엇일까?
public static void main(String[] args) throws Exception
{
throw new UnsupportedFunctionException("지원하지 않는 기능입니다.",100);
}
}
1. 메인메서드에 throws Exception이 명시되어 있다.
목적 : main 메서드 내에서 자신을 호출한 메서드에게 예외를 전달하여 예외처리를 떠맡긴다. (폭탄처리반)
2. UnsupportedFunctionExcpetion이라는 사용자정의 예외를 발생시킨다.
이때 new 연산자에 의해서 예외 클래스(UnsupportedFunctionException)의 인스턴스가 생성된다.
class UnsupportedFunctionException extends RuntimeException{
여기서 RuntimeException의 멤버를 상속받는데, RuntimeException의 최고조상은 Exception이다.
이 Exception클래스에는 생성 시에 String값을 받아서 메시지로 저장할 수 있는 기능이 있다.
3. 예외를 발생시키면서 인자 두 개를 전달한다.
하나는 String 타입의 "지원하지 않는 기능입니다."
또 하나는 int 타입의 "100"을 전달한다.
인자 두 개를 적절하게 받아줄 적절한 코드 작성이 필요하다.
UnsupportedFunctionException(String msg, int errCode){
super(msg); // 조상클래스 RuntimeException의 생성자를 호출
ERR_CODE = errCode;
}
먼저, 맨 위에 위치한 생성자에서 두 개의 인자를 전달받는다.
그런데 적절한 초기화를 진행한다.
위에서 언급했듯이, Exception 클래스에는 메시지를 저장할 수 있는 기능(function)이 있다.
자손클래스에 해당하는 UnsupportedFunctionException이 조상클래스의 멤버를 사용하려고 한다.
(자손이 사용하려는 기능은 "String값을 받아서 메시지를 저장할 수 있는 기능"이다.)
따라서 조상의 멤버를 먼저 초기화 ( super(msg);) 하고 있다.
그 아랫줄에는 errCode를 전달받아 final private int ERR_CODE; 를 초기화하고 있다.
UnsupportedFunctionException(String msg){
this(msg, 100);
}
그 아래 생성자에서는 msg를 전달받고, ERROR_CODE를 100으로 초기화하기 위해서
위 생성자로 다시 값을 전달하고 있다.
이로 인해서 초기화는
msg = " 지원하지 않는 기능입니다. "
final private int ERR_CODE = 100; 으로 초기화되는 것이다.
public int getErrorCode(){
return ERR_CODE;
}
public String getMessage(){
return "[ " + getErrorCode() + " ]" + super.getMessage(); // 오버라이딩
}
}
이제 메서드 부분을 살펴보도록 하자.
getErrorCode 메서드는 ERR_CODE 값을 반환하고
그 아래 메서드로 값을 전달한다.
1. super를 이용해서 조상클래스의 메서드를 이용하고 있다는 점을 배웠다.
2. return문을 이용할 때 자유도가 조금 존재한다는 것을 배웠다.
처음에 노란색 친 [100] 부분이 나오지 않아서 고민했는데
return 문에서 " " 를 쓰는 것이 가능하다는 것을 배웠다.
힌트를 맨 아랫줄에 getLocation 부분에서 영감을 얻었다.
'프로그래밍 > 코드분석' 카테고리의 다른 글
자바의 정석 연습문제 6-2 (0) | 2016.08.16 |
---|---|
자바의 정석 연습문제 9-4 (0) | 2016.08.13 |
자바의 정석 연습문제 9-3 (0) | 2016.08.13 |
자바의 정석 연습문제 9-1 (0) | 2016.08.13 |
자바의 정석 9-20 코드분석 (0) | 2016.08.12 |