🕊️ 2024 버클리즈 Java SpringBoot 인터뷰 질문 (3) | Finally 블록에서 예외가 발생하면 어떻게 되나요?
자바에서, try-catch에서 finally 블록 내에서 예외가 발생할 때의 동작은, try-catch 블록의 예외 처리와 약간 다릅니다.
[Try-Catch 블록의 예외]
* 정상적인 플로우가 중지됩니다.
* 예외 유형과 일치하는 catch 블록이 있다면, 해당 블록 내의 코드가 실행됩니다. 이를 통해 예외를 처리할 수 있습니다.
* catch 블록이 완료되거나 어떤 catch 블록과도 일치하지 않으면 finally 블록의 코드가 실행됩니다.
[Finally 블록의 예외]
* 원래의 예외가 중지됩니다. 이는 원래의 예외가 메서드 호출자에게 전달되지 않는 것을 의미합니다.
* finally 블록에서 던진 예외가 호출자에게 전파되는 새로운 예외가 됩니다.
[키 포인트]
* finally 블록은 try-catch 블록에서 예외가 발생하는지 여부에 관계없이 항상 실행됩니다.
* finally 블록의 예외는 원래의 예외를 억제합니다.
* finally 블록에서 던진 예외는 호출자가 처리해야 하는 새로운 예외가 됩니다.
[Finally 블록의 쓰임새]
* 리소스(데이터베이스 연결, 파일 클로징)를 해제합니다.
* 예외에 관계없이 항상 수행해야 하는 정리 작업을 처리합니다.
자바의 다이아몬드 문제란 무엇인가요?
"다이아몬드 문제"란 여러 상속 시나리오에서 발생하는 특정한 문제를 의미합니다. 클래스 상속 다이어그램을 그릴 때 발생하는 다이아몬드 모양에서 이름을 따왔습니다.
1. 자바의 접근방식: 자바는 클래스의 다중상속을 지원하지 않습니다. 그러나 자바는 인터페이스의 다중상속은 허용합니다.
2. 자바 인터페이스의 다이아몬드 문제: 클래스가 두 개의 인터페이스를 구현하고 두 인터페이스가 모두 동일한 메소드명을 가진다면, 구현 클래스는 모호성을 해결하기 위해 메서드를 자체적으로 구현해야 합니다.
interface InterfaceA {
default void display() {
System.out.println("Inside InterfaceA");
}
}
interface InterfaceB {
default void display() {
System.out.println("Inside InterfaceB");
}
}
class MyClass implements InterfaceA, InterfaceB {
// Here, we must provide our own implementation of display to resolve the ambiguity.
@Override
public void display() {
InterfaceA.super.display(); // calling InterfaceA's default implementation
InterfaceB.super.display(); // calling InterfaceB's default implementation
}
}
어떻게 해결할 수 있을까요?
1. 메서드 오버라이딩: 구현 클래스에서 자신만의 구현을 제공하여 모호함을 해결합니다. 이 방식은 기본 구현 중 하나를 선택하거나 완전히 새로운 구현을 제공하고자 할 때 적합합니다.
class MyClass implements InterfaceA, InterfaceB {
@Override
public void display() {
System.out.println("Hello world");
}
}
2. 특정 인터페이스의 메서드 호출: 특정한 인터페이스의 메서드를 호출합니다.
class MyClass implements InterfaceA, InterfaceB {
@Override
public void display() {
InterfaceA.super.display(); // or InterfaceB.super.display()
// Additional logic if needed
}
}
Multilevel 상속이란 무엇인가요?
Multilevel 상속에서 A 클래스는 B 클래스를 상속하며, B 클래스 역시 C 클래스를 상속합니다.
자식 클래스는 부모 클래스를 통해 조부모 클래스에서 간접적으로 상속됩니다. 자식 클래스는 부모 및 조부모 클래스의 모든 public/protected 멤버에 접근할 수 있습니다.
String, Stringbuffer, Stringbuilder의 차이는 무엇인가요?
(번역/원문 참고)
메서드 오버라이딩과 오버로딩은 무엇인가요?
[메서드 오버로딩]
* 단일 클래스 내에서 발생합니다. 이름은 같지만 매개 변수가 다른 동일한 클래스의 여러 메서드를 말합니다.
* 메서드 오버로딩을 사용하면 유사한 작업을 수행하지만 입력/출력이 다른 메서드를 만들 수 있습니다.
class Calculator {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
}
[메서드 오버라이딩]
* 상속에서 클래스 간에 메서드 오버라이딩이 발생합니다. 하위 클래스가 상위 클래스에서 상속된 메서드를 재정의하는 것을 말합니다. 메서드는 상위 클래스 메서드와 동일한 이름, 반환 유형 및 매개 변수를 갖습니다.
* 메서드 오버라이딩을 사용하면 하위 클래스가 상위 클래스에서 상속된 메서드를 자체적으로 구현하여 하위 클래스에 대한 동작을 전문화할 수 있습니다.
class Animal {
public void makeSound() {
System.out.println("Generic animal sound");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Woof!");
}
}
예외 클래스의 계층구조는 무엇인가요?
Arraylist와 Linkedlist의 차이는 무엇인가요?
Set과 Arraylist의 차이는 무엇인가요?
(번역/원문 참고)
번역: [https://ducktopia.tistory.com/119]
원문:
좋아요 39 • 저장 106