레퍼런스

[Medium] 2024 버클리즈 Java SpringBoot 인터뷰 질문 (3)

둘기덕 2024. 4. 10. 20:54
반응형

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의 차이는 무엇인가요?


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
요소 추가/삭제 비교적 빠름 비교적 느림
요소 검색 빠름 비교적 느림
사용 중복 제거 순서가 중요한 컬렉션 저장

 

출처

반응형