반응형
Finally 블록에서 예외가 발생하면 어떻게 되나요?
자바에서, try-catch에서 finally 블록 내에서 예외가 발생할 때의 동작은, try-catch 블록의 예외 처리와 약간 다릅니다.
[Try-Catch 블록의 예외]
- 정상적인 플로우가 중지됩니다.
- 예외 유형과 일치하는 catch 블록이 있다면, 해당 블록 내의 코드가 실행됩니다. 이를 통해 예외를 처리할 수 있습니다.
- catch 블록이 완료되거나 어떤 catch 블록과도 일치하지 않으면 finally 블록의 코드가 실행됩니다.
[Finally 블록의 예외]
- 원래의 예외가 중지됩니다. 이는 원래의 예외가 메서드 호출자에게 전달되지 않는 것을 의미합니다.
- finally 블록에서 던진 예외가 호출자에게 전파되는 새로운 예외가 됩니다.
[키 포인트]
- finally 블록은 try-catch 블록에서 예외가 발생하는지 여부에 관계없이 항상 실행됩니다.
- finally 블록의 예외는 원래의 예외를 억제합니다.
- finally 블록에서 던진 예외는 호출자가 처리해야 하는 새로운 예외가 됩니다.
[Finally 블록의 쓰임새]
- 리소스(데이터베이스 연결, 파일 클로징)를 해제합니다.
- 예외에 관계없이 항상 수행해야 하는 정리 작업을 처리합니다.
자바의 다이아몬드 문제란 무엇인가요?
"다이아몬드 문제"란 여러 상속 시나리오에서 발생하는 특정한 문제를 의미합니다. 클래스 상속 다이어그램을 그릴 때 발생하는 다이아몬드 모양에서 이름을 따왔습니다.
- 자바의 접근방식: 자바는 클래스의 다중상속을 지원하지 않습니다. 그러나 자바는 인터페이스의 다중상속은 허용합니다.
- 자바 인터페이스의 다이아몬드 문제: 클래스가 두 개의 인터페이스를 구현하고 두 인터페이스가 모두 동일한 메소드명을 가진다면, 구현 클래스는 모호성을 해결하기 위해 메서드를 자체적으로 구현해야 합니다.
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의 차이는 무엇인가요?
Parameter | String | StringBuilder | StringBuffer |
mutability | 불변 | 변함 | 변함 |
Storage | String 상수 풀 | heap | heap |
Thread safety | 스레드 환경에서 사용되지 않음 | Not Thread-safe | Thread-safe |
Speed | 비교적 느림 | 비교적 빠름 | String 보다는 빠르고 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의 차이는 무엇인가요?
Feature | ArrayList | LinkedList |
기본 자료구조 | 요소들의 연속적인 배열 | 링크로 연결된 노드 |
접근 방법 | 랜덤 접근 | 순차적인 접근 |
요소 제거/추가 | 느림 | 빠름 |
메모리 사용량 | 적은 메모리 사용량 | 비교적 많은 메모리 사용량 |
Thread-safe | Not thread-safe | Not thread-safe |
사용 | 랜덤 접근, 빈번한 요소 검색 | 빈번한 삽입/삭제, 순서 유지 |
Set과 Arraylist의 차이는 무엇인가요?
Feature | Set | ArrayList |
Uniqueness | 중복 없음 | 중복 있음 |
정렬 | 삽입 때의 순서를 유지하지 않음 | 삽입때의 순서를 유지함 |
구현 | HashSet | ArrayList |
요소 추가/삭제 | 비교적 빠름 | 비교적 느림 |
요소 검색 | 빠름 | 비교적 느림 |
사용 | 중복 제거 | 순서가 중요한 컬렉션 저장 |
출처
반응형
'레퍼런스' 카테고리의 다른 글
[Medium] 300개 이상의 리트코드 문제를 해결한 방법 (0) | 2024.04.24 |
---|---|
[Medium] 개발 세계에서 인기 있는 API 아키텍처 스타일 (0) | 2024.04.17 |
[Medium] 2024 버클리즈 Java SpringBoot 인터뷰 질문 (2) (0) | 2024.04.03 |
[Medium] 2024 버클리즈 Java SpringBoot 인터뷰 질문 (1) (0) | 2024.04.01 |
[Medium] Kafka vs. RabbitMQ: 알맞은 메시지 브로커 찾기 (0) | 2024.03.25 |