면접준비[프론트,백,데이터,CS]/InterView 준비 [ 백엔드 ]

[ 백엔드 면접준비 : Java&Kotlin + SpringBoot ] Java 면접 질문 정리_03

안다미로 : Web3 & D.S 2024. 12. 22. 00:02

 

 

 

[ 백엔드 면접준비 : Java&Kotlin + SpringBoot ] Java 면접 질문 정리_03

 


 

Ⅰ, Java에서 멀티스레딩은 어떻게 작동하는가??


 

      ▣ JAVA 멀티 스레딩의 기본 개념.

 

             - 멀티스레딩은 하나의 프로세스 내에서 여러 스레드가 동시에 작업을 수행하는 프로그래밍 기법입니다.

 

            - 자바에서 멀티스레딩은

                CPU 자원을 효율적으로 활용하고 애플리케이션의 성능과 응답성을 향상시키는 핵심 메커니즘.

 

 

      ▣ JAVA 스레드 생성 방법 두가지.

 

               1. Thread 클래스 상속.

  • Thread 클래스를 직접 상속
  • run() 메서드 오버라이드
  • start() 메서드로 스레드 실행
class MyThread extends Thread {
    public void run() {
        // 스레드가 수행할 작업
    }
}

 

               2. Runnable 인터페이스 구현.

  • Runnable 인터페이스 구현
  • run() 메서드 정의
  • Thread 객체에 Runnable 객체 전달
class MyRunnable implements Runnable {
    public void run() {
        // 스레드가 수행할 작업
    }
}

 

 

      ▣ 멀티스레딩의 주요 특징.

 

                1. 동시성과 병렬성

 

                         ● 동시성 : 하나의 코어에서 여러 스레드를 빠르게 번갈아가며 실행합니다.

                         ● 병렬성 : 여러 코어에서 (실제로) 동시에 스레드 실행.

 

                2. 메모리 구조.

 

                         ● Code, Data, Heap 영역은 모든 스레드가 공유합니다.

                         ● Stack 영역은 각 스레드마다 독립적으로 할당합니다.

 

 

      ▣ 멀티스레딩의 장점.

            ● 자원 효율성 : 메모리 공유로 자원 절약.

            ● 응답성 향상 : 백그라운들 작업 동시 처리.

            ● CPU 활용도 증가 : 여러 작업 동시 수행

 

 

      ▣ 자바 멀티스레딩의 작동 방식.

                1.  스레드 생명 주기 

 

                       == 스레드 상태 전이

                           ● New : 스레드 객체 생성, 미실행 상태.

                           ● Runnable: 실행 중 또는 실행 가능한 상태.

                           ● Running: 실제 실행 중인 상태.

                           ● Blocked : 동기화 블럭에 의해서 일시정된 상태(lock이 풀릴 때까지 대기)

                           ● Waiting, Timed_Waiting : 스레드의 작업이 종료되지는 않았지만 실행가능하지 않은 일시정지 상태

                           ● Terminated : 스레드의 작업이 종료된 상태.

 

 

                2. 스레드 스케줄링.

 

                       == 컨텍스트 스위칭.

                           ● JVM의 스레드 스케줄러가 스레드 실행 관리.

                           ● 타임 슬라이드 방식으로 스레드 번갈아 실행

                           ●우선순위에 따라 실행 순서 결정.

 

 

                3. 스레드 동기화 메커니즘.

 

                       == 동기화 방법.

                           ● Synchronized, 키워드

                           ● Lock 인터페이스

                           ●volatile 키워드

                           ●AtomicInteger 등 동시성 유틸리티.

 

                4. 스레드 통신 메커니즘.

 

                           ● wait() : 스레드 일시 중지

                           ● notify() : 대기 중인 스레드 재개

                           ●join() : 다른 스레드 작업 완료 대기.

                   

 

 

      ▣ 핵심 작동 원리.

             1. 스레드 생성

             2. 스케줄링

             3. 동기화

             4. 자원 관리.

 

      ▣ 주의할 점.

              ● 과도한 스레드 생성 자제

              ● 명확한 동기화 메커니즘 설계

              ● 스레드 안전성 고려

              ● 성능 모니터링 필요.

 

 

 


 

 

Ⅱ, Java의 Garbage Collection의 기본 개념.


가비지 컬렉션(Garbage Collection)은 자바의 자동 메모리 관리 메커니즘으로,

JVM의 Heap 영역에서 더 이상 사용되지 않는 객체를 자동으로 탐지하고,

메모리에서 제거하는 프로세스입니다.

 

 

  ◆ 주요 특징.

 

            ▼ 메모리 자동 관리.

                     ○ 개발자가 수동으로 메모리를 해제할 필요 없음.

                     ○ 동적으로 할당된 메모리 중 사용하지 않는 영역 자동 탐지 및 해제.

 

            ▼ 작동 원리.

                     ○ Reachability 개념 사용.

                     ○ 객체에 유효한 참조가 있으면 Reachable.

                     ○ 참조가 없는 객체는 Unreachabel로 판단하여 제거.

 

 

  ◆ GC의 장점.

 

            1. 메모리 관리 간소화.

 

                    ● 메모리 누수 방지.

                    ● 유효하지 않은 포인터 접근 오류 예방

                    ● 이중 메모리 해제 방지.

 

            2. 자동 메모리 최적화

 

                    ● 개발자의 수동 메모리 관리 부담 소

                    ● 시스템 자원의 효율적 활용.

 

 

  ◆ 주의할 점.

 

            1. 성능 오버헤드

 

                    ● GC 작업 중 앱 일시 중지 ( Stop - the - World )

                    ● 예측 불가능한 메모리 해제 시점.

                    ● 실시간 시스템에 부적합.

 

            2. 제한된 최적화.

 

                    ● 개발자가 메모리 해제 시점을 완전히 제어할 수 없음.

                    ● 상황에 따라 성능에 영향을 미칠 수 있음.

 

 


 

 

Ⅲ, Java의 reflection은?


Java에서 리플렉션(Reflection)은 런타임에 객체의 메타데이터를 분석하고,

필요한 객체를 생성하거나 설정 값을 주입해주는 기능입니다.

[ == 구체적인 클래스 타입을 알지 못해도, 그 클래스의 메소드*타입*변수들을 접근할 수 있도록 해주는 자바 API)

 

자바는 컴파일 시점에 타입을 결정하는 정적인 언어인데,

동적으로 클래스를 사용할 때 '리플렉션'을 사용합니다.

 

이를 통해 개발자는 컴파일 시점에 클래스에 대한 구체적인 정보를 알지 못하더라도,

런타임에 클래스, 필드, 메소드, 생성자 등을 동적으로 검사하고 조작할 수 있습니다.

 

프로그램의 유연성과 확장성을 높여주는 기능이지만,

성능저하*보안문제*안정성 저하 등의 단점등도 있습니다.

 

리플렉션의 주요 특징은 다음과 같습니다:

  1. 클래스 정보 접근: JVM은 클래스 로더를 통해 클래스 정보를 읽어와 메모리에 저장합니다.
                                     이 정보는 마치 거울에 비친 모습처럼 클래스의 구조를 반영합니다.

  2. 동적 코드 생성: IDE(통합 개발 환경)나 프레임워크 개발 시, 리플렉션을 사용하여
                             동적으로 코드를 생성하거나 수정할 수 있습니다.
                             예를 들어, 런타임에 메소드를 호출하거나 필드 값을 변경하는 등의 작업이 가능합니다.

  3. 인스턴스화: 구성 파일에 기반하여 클래스를 인스턴스화하는 컨테이너 및 프레임워크에서 리플렉션을 활용합니다.
                            이를 통해 설정 파일에 정의된 클래스의 인스턴스를 동적으로 생성할 수 있습니다.

  4. 유연성: 리플렉션을 사용하면 코드의 유연성을 높일 수 있지만,
                 성능 저하와 보안 문제를 초래할 수 있으므로 신중하게 사용해야 합니다.

리플렉션의 사용 케이스

       - IDE 자동 완성 기능

       - 스프링 프레임워크의 어노테이션(@)

 

 

리플렉션은 강력한 도구이지만, 사용 시 주의가 필요.

 

첫째,

리플렉션은 성능 저하를 일으킬 수 있으므로, 성능에 민감한 애플리케이션에서는 사용을 자제해야 합니다.

왜냐하면 리플렉션은 추가적인 처리를 요구하기 때문입니다.

 

둘째,

리플렉션은 프로그램의 안정성을 저하시킬 수 있습니다.

왜냐하면 개발자가 의도치 않은 방식으로 내부 구조에 접근할 수 있기 때문에, 예상치 못한 에러가 발생할 수 있습니다.

 

셋째,

리플렉션을 사용할 때는 보안 문제에 주의해야 합니다.

왜냐하면 리플렉션을 통해 비공개 멤버에 접근할 수 있기 때문에, 보안 취약점이 될 수 있습니다.

 

넷째,

리플렉션은 코드의 가독성과 유지보수성을 저하시킬 수 있습니다.

왜냐하면 리플렉션을 사용한 코드는 직관적이지 않고, 디버깅이 어려울 수 있기 때문입니다.

 

마지막으로,

리플렉션을 사용할 때는 항상 대안을 고려해야 합니다.

가능하다면 리플렉션을 사용하지 않고 문제를 해결할 수 있는 방법을 찾는 것이 좋습니다.

왜냐하면 리플렉션은 강력하지만 위험할 수 있는 도구이기 때문입니다.