[ 백엔드 면접준비 : 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)
자바는 컴파일 시점에 타입을 결정하는 정적인 언어인데,
동적으로 클래스를 사용할 때 '리플렉션'을 사용합니다.
이를 통해 개발자는 컴파일 시점에 클래스에 대한 구체적인 정보를 알지 못하더라도,
런타임에 클래스, 필드, 메소드, 생성자 등을 동적으로 검사하고 조작할 수 있습니다.
프로그램의 유연성과 확장성을 높여주는 기능이지만,
성능저하*보안문제*안정성 저하 등의 단점등도 있습니다.
리플렉션의 주요 특징은 다음과 같습니다:
- 클래스 정보 접근: JVM은 클래스 로더를 통해 클래스 정보를 읽어와 메모리에 저장합니다.
이 정보는 마치 거울에 비친 모습처럼 클래스의 구조를 반영합니다. - 동적 코드 생성: IDE(통합 개발 환경)나 프레임워크 개발 시, 리플렉션을 사용하여
동적으로 코드를 생성하거나 수정할 수 있습니다.
예를 들어, 런타임에 메소드를 호출하거나 필드 값을 변경하는 등의 작업이 가능합니다. - 인스턴스화: 구성 파일에 기반하여 클래스를 인스턴스화하는 컨테이너 및 프레임워크에서 리플렉션을 활용합니다.
이를 통해 설정 파일에 정의된 클래스의 인스턴스를 동적으로 생성할 수 있습니다. - 유연성: 리플렉션을 사용하면 코드의 유연성을 높일 수 있지만,
성능 저하와 보안 문제를 초래할 수 있으므로 신중하게 사용해야 합니다.
리플렉션의 사용 케이스
- IDE 자동 완성 기능
- 스프링 프레임워크의 어노테이션(@)
리플렉션은 강력한 도구이지만, 사용 시 주의가 필요.
첫째,
리플렉션은 성능 저하를 일으킬 수 있으므로, 성능에 민감한 애플리케이션에서는 사용을 자제해야 합니다.
왜냐하면 리플렉션은 추가적인 처리를 요구하기 때문입니다.
둘째,
리플렉션은 프로그램의 안정성을 저하시킬 수 있습니다.
왜냐하면 개발자가 의도치 않은 방식으로 내부 구조에 접근할 수 있기 때문에, 예상치 못한 에러가 발생할 수 있습니다.
셋째,
리플렉션을 사용할 때는 보안 문제에 주의해야 합니다.
왜냐하면 리플렉션을 통해 비공개 멤버에 접근할 수 있기 때문에, 보안 취약점이 될 수 있습니다.
넷째,
리플렉션은 코드의 가독성과 유지보수성을 저하시킬 수 있습니다.
왜냐하면 리플렉션을 사용한 코드는 직관적이지 않고, 디버깅이 어려울 수 있기 때문입니다.
마지막으로,
리플렉션을 사용할 때는 항상 대안을 고려해야 합니다.
가능하다면 리플렉션을 사용하지 않고 문제를 해결할 수 있는 방법을 찾는 것이 좋습니다.
왜냐하면 리플렉션은 강력하지만 위험할 수 있는 도구이기 때문입니다.
'면접준비[프론트,백,데이터,CS] > InterView 준비 [ 백엔드 ]' 카테고리의 다른 글
[ 백엔드 면접준비 : Python ] Python 면접 질문 정리_01 (0) | 2024.12.21 |
---|---|
[ 백엔드 면접준비 : Java&Kotlin + SpringBoot ] Java 면접 질문 정리_02 (2) | 2024.12.20 |
[ 백엔드 면접준비 : Java&Kotlin + SpringBoot ] Java 면접 질문 정리_01 (0) | 2024.12.20 |
[ 백엔드 면접 준비 ] 백엔드 면접 준비 _ 02. (0) | 2024.12.16 |
[ 백엔드 면접 준비 ] 백엔드 면접 준비 _ 01. (2) | 2024.12.13 |