본문 바로가기

프로그래밍/코드분석

자바의 정석 8-9 코드분석

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