study/CS
CS 면접 예상 질문 - Java(2)
으녕오리
2025. 2. 26. 20:41
Java의 제네릭에 대해 설명해주세요.
더보기
-> 제네릭은 타입을 매개변수로 사용할 수 있게 하여 코드의 재사용성과 타입 안정성을 높이는 기능입니다.
예를 들어, List는 String 타입만 저장하도록 제한할 수 있습니다.
- 제네릭을 사용하면 어떤 장점이 있나요?
→ 타입 안정성을 확보하고, 불필요한 형변환을 줄여 코드의 가독성을 높일 수 있습니다. - 제네릭을 사용하지 않으면 어떤 문제가 발생할까요?
->타입 안정성이 보장되지 않아 형 변환 오류가 발생할 수 있고, 코드의 가독성과 재사용성이 떨어집니다. - 제네릭은 컴파일 타임에만 적용된다고 하는데, 런타임에는 어떤 영향을 미칠까요?
-> 런타임에는 제네릭 정보가 사라지고 Object로 처리됩니다.
자바의 동시성 문제와 멀티쓰레드에 대해 설명하고 해결방법을 말씀해주세요.
더보기
-> 멀티쓰레드는 하나의 프로그램에서 여러 개의 작업을 동시에 수행할 수 있도록 하는 기술입니다.
하지만 여러 스레드가 공유 자원에 접근할 때 충돌이 발생하는 현상을 동시성 문제라고 합니다.
이를 해결하기 위해 synchronized, Lock, volatile, Atomic 클래스, Executor Framework 등을 사용합니다.
- synchronized → 특정 블록이나 메서드에 대해 한 번에 하나의 스레드만 접근할 수 있도록 제한하는 키워드입니다.
- Lock → synchronized보다 세밀한 제어가 가능한 동기화 도구로, ReentrantLock 등이 대표적입니다.
- volatile → 변수 값을 메인 메모리에 직접 저장하여 스레드 간 값이 즉시 반영되도록 보장하는 키워드입니다.
- Atomic 클래스 → AtomicInteger, AtomicBoolean 등으로, 동기화 없이도 원자적(Atomic) 연산을 지원하는 클래스입니다.
- Executor Framework → 스레드 풀(Thread Pool)을 제공하여 스레드를 효율적으로 관리하고 생성, 실행을 최적화하는 프레임워크입니다.
- 동기화하면 성능이 저하될 수 있는데, 이를 개선할 방법이 있을까요?
→ 락을 최소화하고, Concurrent 패키지를 활용하거나 비동기 처리로 개선할 수 있다. - 멀티쓰레드를 사용하는 이유는?
→ CPU 활용도를 높이고 여러 작업을 동시에 처리하기 위해서입니다. - 멀티쓰레드와 멀티프로세스의 차이점은?
→ 멀티쓰레드는 메모리를 공유하고, 멀티프로세스는 독립적인 메모리를 가집니다. - 멀티쓰레드 환경에서 발생할 수 있는 문제는?
→ 레이스 컨디션, 데드락, 라이브락 등이 발생할 수 있습니다. - 스레드 간 데이터를 안전하게 공유하는 방법은?
→ synchronized, Lock, Concurrent 패키지를 사용합니다. - 멀티쓰레드의 과도한 생성이 문제를 일으키는 이유는?
→ 컨텍스트 스위칭 비용이 증가하고 시스템 리소스가 낭비되기 때문입니다.
자바에서 동기화와 비동기화란?
더보기
-> 동기화는 여러 스레드가 공유 자원에 접근할 때 한 번에 하나의 스레드만 실행되도록 하는 방식이고,
비동기화는 작업이 완료될 때 까지 기다리지 않고 별도의 스레드에서 실행하는 방식이다.
- 동기화의 단점은 무엇인가요?
→ 성능 저하와 데드락 발생 가능성이 있습니다. - 데드락이 뭔가요?
-> 데드락은 두 개 이상의 스레드가 서로 상대방의 자원을 점유하기를 기다리며 영원히 종료되지 않는 상태를 말합니다. - 비동기 방식이 항상 더 좋은 선택인가요?
→ 상황에 따라 다르며, 단순한 작업에서는 오히려 복잡성을 증가시킬 수 있습니다. - 동기화와 비동기화의 차이점은?
→ 동기화는 작업이 순차적으로 실행되고, 비동기화는 독립적으로 실행됩니다. - 비동기 처리를 할 때 주로 사용하는 방법은?
→ CompletableFuture, ExecutorService, Future, Reactive Streams 등을 사용합니다. - 멀티쓰레드 환경에서 동기화를 하지 않으면 어떤 문제가 발생할까요?
→ 데이터 불일치나 레이스 컨디션이 발생할 수 있습니다. - 비동기 처리가 필요한 경우는 언제인가요?
→ 네트워크 요청, 파일 I/O, 대량 데이터 처리 등 긴 시간이 걸리는 작업이 필요할 때입니다.
자바에서 캡슐화를 해야하는 이유?
더보기
-> 캡슐화를 해야 하는 이유는 데이터 보호와 유지보수성 향상을 위해서입니다.
- getter와 setter를 무조건 사용해야 할까요?
→ 불필요한 접근을 제한하는 것이 더 좋은 설계입니다. - getter와 setter를 최소화하는 설계 방식이 있을까요?
→ 생성자를 활용하거나 필요한 메서드만 노출하는 방식이 있습니다. - 캡슐화를 제외한 객체 지향 프로그래밍의 핵심 개념에는 어떤 것이 있나요?
-> 다형성, 추상화, 상속이 있습니다. - 캡슐화의 장점은 무엇인가요?
→ 데이터 보호, 코드 수정 용이성, 유지보수성 향상, 결합도 감소 등이 있습니다. - 접근 제어자에는 어떤 것들이 있나요?
→ private, default, protected, public 네 가지가 있습니다. - 캡슐화를 깨뜨릴 수 있는 위험 요소는 무엇인가요?
→ public 필드 사용, 불필요한 getter/setter 남용, 직접적인 필드 조작 등이 있습니다.
자바에서 Optional이 무엇일까요?
더보기
-> Optional은 null을 직접 다루지 않고, 값이 있을 수도 없을 수도 있음을 명식적으로 표현하는 래퍼 클래스이다.
- Optional을 사용하면 어떤 장점이 있나요?
→ null 체크를 명시적으로 처리하여 NullPointerException을 방지할 수 있습니다. - Optional을 사용할 때의 단점은 무엇인가요?
→ 지나치게 많이 사용하면 코드가 복잡해질 수 있고, 성능에 영향을 미칠 수 있습니다. - Optional을 필드 변수로 사용하는 것은 좋은 방식일까요?
→ 권장되지 않으며, 주로 반환값으로 사용하는 것이 좋습니다. - Optional을 남용하면 성능상 문제가 있을까요?
→ 불필요한 객체 생성을 초래하여 오버헤드가 발생할 수 있습니다.