Java

[CS 스터디 회고] JAVA 면접 질문 대비

리콜 2024. 11. 8. 18:12

KB IT's Your Life 를 진행하면서 CS 스터디를 진행하고 다시 복습을 하면서 정리를 한다.

또한 추가 적으로 생긴 질문들 중 몇가지를 정리 해보았다.

 

 

1. JVM이 정확히 무엇이고, 어떤 기능을 하는지 설명해 주세요.

JVM이란 OS에 종속 받지 않고 CPU가 Java를 인식 실행할 수 있도록 하는 가상 컴퓨터 환경입니다. 자바를 실행하고 관리하는 중요한 구성 요소로서 가비지 컬렉터, 바이트 코드 실행, 보안관리, 라이브러리 관리 등의 기능을 제공합니다. JVM은 javac에 의해 소스코드에서 바이트 코드로 변환되는데 각 운영체제마다 JVM구현체가 존재하여 이 바이트 코드를 실행할 수 있습니다. 덕분에 자바는 플랫폼 독립성을 가질 수 있습니다. 또한 객체가 더 이상 사용되지 않으면 자동으로 메모리를 제거하는 가비지 컬렉터가 있어 메모리 누수를 방지하고 프로그램 안전성을 높여주어 메모리를 효율적으로 관리해줍니다. 자바 애플리케이션이 실행되는 동안 악의적인 코드 실행을 방지 하기 위해 클래스 로더를 통해 코드의 로딩을 관리하고 바이트 코드 검증을 통해 유효성 확인 작업을 합니다.

  • 그럼, 자바 말고 다른 언어는 JVM 위에 올릴 수 없나요?
    • 다른 언어를 JVM에 올릴 수 있습니다. 대표적으로 Kotlin이 있으며 kotlin은 자바와 100% 상호 운용이 가능합니다. 그외에도 그루비, 스칼라가 있습니다.
  • 반대로 JVM 계열 언어를 일반적으로 컴파일해서 사용할 순 없나요?
    • 가능합니다. GraalVM과 같은 jvm언어 런타임 및 컴파일러로 네이티브 이미지를 생성하여 사용할 수 있습니다. 빠른 시작시간과 낮은 메모리 사용이 장점이지만 리플렉션이나 동적 로딩등 제한이 있을 수 있습니다.
      • GraalVM : 다국어 지원- java, javascript,python 등
  • VM을 사용함으로써 얻을 수 있는 장점과 단점에 대해 설명해 주세요.
    • 장점으로는 vm을 사용하면 한번 작성하여 JVM이 설치된 모든 플랫 폼에서 실행 시킬 수 있습니다. 또한 내부의 가비지 컬렉터가 참조되지 않는 객체를 인식하여 메모리 공간을 확보해주어 메모리 관련 오류를 줄일 수 있습니다.
    • 단점으로는 물리적 보안 이외에도 하드웨어 및 운영체제 독립성에 의해 바이트 코드를 특정 하드웨어나 시스템에 맞게 최적화 시킬 수 없습니다. 클래스에서 바이트코드로 바이트 코드에서 기계코드로 두번 변환하여 다른언어에 비해 느립니다. 가비지 컬렉터가 주기적으로 수행하기 때문에 오버헤드가 발생하고 가비지 컬렉션 과정에서 자바 애플리케이션의 스레드가 멈출 수 있어 응답시간에 영향이 미칠 수 있습니다.
  • JVM과 내부에서 실행되고 있는 프로그램은 부모 프로세스 - 자식 프로세스 관계를 갖고 있다고 봐도 무방한가요?
  • JVM은 자바 애플리케이션의 보안성을 높이는 기능도 제공합니다. 예를 들어, 자바 애플리케이션이 실행되는 동안 악의적인 코드 실행을 방지하기 위해 클래스 로더(Class Loader)를 통해 코드의 로딩을 관리하고, 바이트코드 검증을 통해 코드의 유효성을 확인합니다.
  • JAVA JVM 에서 핫스팟 VM에 다양한 모드가 있다. Server mode, client 모드
  • 클래스 로더의 동작 방식, 종류, 원칙 - bootstrap 로딩 방식

2. final 키워드를 사용하면, 어떤 이점이 있나요?

final 키워드를 사용하면 오버라이딩을 방지하여 안정성 및 코드 보호를 할 수 있고 JIT 컴파일러가 메서드 인라이닝을 하기 쉽게 만들어 성능적 이점이 존재합니다.

또한 final 키워드를 사용하면 해당 요소가 변경되지 않음을 명확하게 하여 협업 환경에서 코드 이해와 유지 보수를 용이하게 합니다.

  • 그렇다면 컴파일 과정에서, final 키워드는 다르게 취급되나요?
    컴파일단계에서 final로 선언된 상수 변수는 인라인 상수로 취급됩니다. 컴파일러가 코드에서 해당 변수 명으로 되어 있는 곳을 모두 기존에 선언 했던 값으로 모두 바꾸어 처리 합니다. 이를 상수 폴딩이라고 합니다. 이를 통해 실행 속도를 향상 시키고 코드의 일관성을 보장합니다.클래스는 보안상의 이유로 사용되는데 중요한 class의 자식class를 생성해서 해당 클래스를 통해 시스템을 파괴할 수 있기 때문에 이를 방지합니다.
  • 또한 메서드에서는 오버라이딩 할 수 없도록, 클래스에서는 상속되지 않도록 해줍니다. 오버라이딩 하려 한다면 컴파일 오류를 발생 시킵니다. 이를 통해 부모 클래스에서 정의한 메서드가 자식클래스에서 그대로 쓰도록 하기 위해 사용됩니다.
  • final 검증은 누가 하냐 - 그냥 final 은 생성자에서 해준다.

3. 인터페이스와 추상 클래스의 차이에 대해 설명해 주세요.

인터페이스는 클래스에 다중 상속이 가능하지만 추상 클래스는 다중상속이 불가능하다는 차이가 있습니다.

추상 클래스의 추상메서드는 일부만 구현해도 되는가?

인터페이스는 구현객제들이 같은 동작을 하는 것을 보장하기 위함에 초점이 맞추어져 있고

추상클래스는 공통의 코드와 상태를 공유하면서도 일부기능의 구현을 서브클래스에 위임하고자 할때에 초점이 맞추어져 있습니다.

  • 왜 클래스는 단일 상속만 가능한데, 인터페이스는 2개 이상 구현이 가능할까요?하지만 클래스에서는 다이아몬드 문제가 발생하기 때문에 단일 상속만 가능합니다. 다이아몬드 문제란 다중 상속을 받았을때 동일한 메서드를 제공받으면 어떤 메서드를 따라야하는지 애매해지는 문제입니다.
  • 인터페이스는 구현을 제공하지 않기 때문에 메서드가 겹치더라도 실제 구현 코드가 겹치지 않기 때문에 다중 상속이 안전하게 가능합니다.

만약 인터페이스 구현체가 여러개라면 명시적으로 지정해주거나 spring에서는 primary나 quailfier를 통해서 지정할 수 있습니다.

4. 리플렉션에 대해 설명해 주세요.

리플렉션은 구체적인 클래스 타입을 알지 못하더라도 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API 입니다. 컴파일 시간이 아닌 실행 시간에 동적으로 특정 클래스의 정보를 추출 할 수 잇는 프로그래밍 기법이다.

작성 시점에는 어떠한 클래스를 사용해야할지 모르지만 런타임 시점에서 가져와 실행해야 하는 경우 필요하다.

  • 의미만 들어보면 리플렉션은 보안적인 문제가 있을 가능성이 있어보이는데, 실제로 그렇게 생각하시나요? 만약 그렇다면, 어떻게 방지할 수 있을까요?
  • 네 리플렉션을 사용하면 기본적으로 접근 할 수 없는 private필드나 메서드에 접근하고 이를 수정 할 수 있습니다. 클래스 설계자가 의도한 방식이 아니기 때문에 보안에 취약점이 발생 할 수 있습니다. 또한 리플렉션을 사용하여 특정부분을 동적으로 변경해 악성 코드를 삽입하거나 실행 할 수 있습니다. 이를 방지하기 위해 최소한의 권한만 부여하거나, 리플렉션을 사용하는 부분에서 예기치 않은 동작이 발생하지 않도록 코드 검사와 테스를 해야합니다. 또한 java의 Security Manager 라는 시스템을 이용해 보안정책을 수정하여 리플렉션을 사용한 접근을 허용 혹은 금지를 지정할 수 있습니다.
  • 리플렉션을 언제 활용할 수 있을까요?
    • spring의존성 주입시 사용
    • 또한 테스트 코드를 작성할때 private변수를 변경하고 싶거나 private 메서드를 테스트 할 경우 활용할 수 있습니다.
    • Jackson이나 GSON등 JSON Serializtion Library들 또한 리플렉션을 이용하여 객체 필드의 변수명 들을 JSON key와 매핑 해주는데 활용할 수 있습니다.
  • 리플렉션이 보안적인 부분이 존재하나 양날의 검처럼 이점이 확실하기 때문에 잘 사용한다면 좋은 기술이 될것이라 생각함
  • 리플렉션으로 프록시 객체를 만들면 GC가 처리해줄까?

5. static class와 static method를 비교해 주세요.

static class는 다른 클래스 내부에 존재하는 클래스에 존재합니다. 이를 감싸고 있는 외부 클래스와 독립적이어서 외부 클래스를 생성 하지 않고고 사용할 수 있습니다. 주로 외부 클래스와 밀접하게 필요하지만 외부 클래스 없이 사용해야 할 때 사용합니다.

static method는 인스턴스의 생성 없이 사용할 수 있어 인스턴스와 관계없이 동작하는 메서드를 정의 할 때 사용합니다.

  • static 을 사용하면 어떤 이점을 얻을 수 있나요? 어떤 제약이 걸릴까요?
    • static을 사용하면 클래스 당 하나만 생성되어 클래스의 모든 인스턴스에서 공유 되어 메모리 효율성을 높일 수 있습니다.
    • 또한 객체 생성없이 사용할 수 있다는 이점이 있습니다.
    • static 메소드는 오버 라이딩을 할 수 없고 static메소드는 클래스의 인스턴스 변수나 메소드에 직접적으로 접근할 수 없습니다. static메소드에서 인스턴스 변수를 사용하려면 객체의 인스턴스를 통해서 접근해야합니다.
    • 만약 자식 클래스에서 static 메소드를 정의 한다해도 메소드 실행시 부모 클래스가 실행된다.
  • 컴파일 과정에서 static 이 어떻게 처리되는지 설명해 주세요.
    • static이 붙은 메소드나 변수들은 힙영역이 아닌 메소드 영역에 할당되어 클래스 사용이 끝날때 까지 GC의 영향을 받지 않고 메모리에 계속 남아 있습니다.
  • static 변수 를 가진 클래스의 객체들은 static변수의 주소 값을 가지고 있나?
  • heap 영역의 metaspace에 대해서 알아보자

6. Java의 Exception에 대해 설명해 주세요.

Exception은 자바가 실행시 발생할 수 있는 오류나 비정상적인 상황을 처리하기 위한 메커니즘입니다.

  • 예외처리를 하는 세 방법에 대해 설명해 주세요.
    • 자바에서 예외 처리를 하는 방법으로는 예외가 발생한 메소드 내에서 직접 처리하는 방법 예외가 발생한 메소드를 호출한 곳으로 예외 객체를 넘겨주는 방법 사용자 정의 예외를 생성하여 처리하는 방법이 있습니다.
    • 첫번째는 try catch문으로 처리하고 두번째는 메소드 중 에러가 발생하면 throws를 사용하여 이 메소드를 사용한 곳으로 오류에 대한 책임을 전가 하는 방법입니다.
    • 세번째 방법은 직접 예외 클래스를 작성해서 해당되는 예외를 수행하게 하게 할 수 있습니다.
  • CheckedException, UncheckedException 의 차이에 대해 설명해 주세요.
    • CheckedException은 Exception을 상속 받아 컴파일 단계에서 예외처리를 강제하게 되어있습니다. 따라서 개발자의 실수를 줄일 수 있습니다. 하지만 번거롭다는 단점과 계속 throw를 올리기 때문에 레이어간의 의존성이 커집니다.
    • Runtime Exception은 실행단계에서 예외를 확인하고 예외처리를 강제적으로 명시하지 않습니다. throw를 해주기 않기 때문에 레이어간의 의존성이 낮아지지만 개발자의 실수가 많아질 수 있습니다.
  • 예외처리가 성능에 큰 영향을 미치나요? 만약 그렇다면, 어떻게 하면 부하를 줄일 수 있을까요?
    • 예외처리를 많이 하게 되면 프로그램의 안정성이 향상되고 유지보수와 디버깅이 쉬워지지만 너무 남발하게 된다면 스택 트레이스 캡처에서 비용이 많이 들고 스택에서 찾는데 많은 성능이 들어가게 됩니다.
      • 스택 트레이스 : 프로그램 실행 과정에서 호출된 메서드들의 순서와 위치 정보를 나타내는 것 EX) e.printStackTrace(); 스택 트레이스를 출력한다.
    • 예외처리를 부하를 줄이기 위해서는 필요할때에만 예외를 처리하고 가벼운 예외 객체를 사용하여 빠르게 만들 수 있습니다. 가벼운 예외 객체를 사용한다는게 무엇인가 → 예외전파를 줄인게 아닌가
      가벼운 예외 객체 : 간단한 정보만 담고 있는 예외 객체 , 생성과 소멸 속도가 빨라 예외 처리에 드는 시간을 단축 시킬 수 있다. 불필요한 정보를 담지 않아 메모리 사용량을 줄일 수 있다.

    • spring에서는 @ExceptionHandler @ControllerAdvice 로 잡을 수 있다.
public class LightWeightException extends RuntimeException {
    private final String message;

    public LightWeightException(String message) {
        this.message = message;
    }

    @Override
    public String getMessage() {
        return message;
    }
}
반응형

'Java' 카테고리의 다른 글

CS 스터디 회고 - 운영체제 1  (0) 2024.12.01
Java 면접(인터뷰) 스터디 회고 3  (0) 2024.11.21
CS 스터디 회고 - java 2  (0) 2024.11.15
JAVA JVM Memory 정리  (1) 2024.07.08
Java priority queue  (0) 2023.09.30