개린이 탈출기

[자바퀴즈] 정적메서드, try-finally return 본문

에러 해결 목록

[자바퀴즈] 정적메서드, try-finally return

yooverd 2025. 3. 5. 18:17
728x90
반응형
SMALL

회사 개발자 분께서 재밌고 간단한 자바 퀴즈를 내셨다.

너무 재밌어서 온 세상 사람들이 알았으면 해서 짧게 글을 남긴다.


문제 1. null 값의 메서드를 부를 수 있을까!?

문제 코드는 다음과 같다.

class MyClass {
    static void guessMe() {
        System.out.println("Did you get the right answer?");
    }
}

public class Main {
    public static void main(String[] args) {
        MyClass myClass = null;
        myClass.guessMe();
        
        // 위 코드는 실행될까요?
    }
}

 

 

부끄럽지만 나는 NullPointer Exception 이 발생할거라 생각했다...

static이라도 null 을 참조하니까 안될거라는 생각을 했는데 틀린 생각이었다!

myClass 는 비록 값이 null 이더라도 MyClass 라는 클래스라는 메타정보는 가지고 있다!
따라서 null 이라 인스턴스주소가 없더라도 guessMe라는 정적 메서드를 MyClass의 클래스 메서드로 호출하기 때문에

애초에 null을 참고하지 않으므로 NPE가 발생할 리가 없었던 것이다!!!

 

정답

Did you get the right answer?

 

 

문제 2. try return ? finally return 

문제는 다음과 같다.

public class Main {
    public static void main(String[] args) {
        System.out.println(test1());
        // return은 어디서 될까욥!?
    }

    static String test1() {
        try{
            System.out.println("I'm here try!");
            return "execute until try";
        } finally {
            System.out.println("I'm here finally");
            return "execute until finally";
        }
    }
}

나는.. 또 틀렸다... 내가 예상한 답은 

I'm here try!

execute until try.

 

허허 정답이 아니다!

finally 블록은 항상 실행된다는 점을 잊어선 안된다!

따라서 try가 모두 실행된 뒤, finally 블록이 실행되며 이때, return 값은 덮어 씌울 수 있다.

 

그리고 갑자기 다음과 같은 생각이 들었다.

그러면 try 블록의 return 뒤의 라인도 모두 실행되나? 라는 바보같은 생각을 잠깐 했다...ㅎㅎ

당연히 불가능하다. 애초에 컴파일러 에러가 발생한다.

 

아무튼 finally 의 return은 기존 return 값을 덮을 수 있다.

그러나 만일 예외가 발생하는 경우, finally의 return이 예외를 무시하고 값을 반환할 수 있기 때문이다.

 

정답

I'm here try!
I'm here finally
execute until finally

 


 

분명히 어려운 문제가 아니고 당연한 문제인데, 아직까지도 헷갈리는걸 보면 개념을 100% 정확히 이해하지 못했기 때문일 것이다.

앞으로 더 정진하자,,,!

728x90
반응형
LIST