CS 기초 · 중급
동시성 프로그래밍에서 불변 객체(Immutable Object)가 갖는 장점은 무엇이며, 어떻게 불변 객체를 설계하여 스레드 안전성을 높일 수 있는지 구체적인 방법을 설명해주세요. 단점이나 제약 사항도 있다면 함께 언급해주세요.
힌트 · 불변 객체는 상태가 변경되지 않아 여러 스레드가 동시에 접근해도 안전합니다. 모든 필드를 final로 선언하고, setter를 제공하지 않으며, 방어적 복사를 통해 스레드 안전성을 확보합니다.
스레드 안전성불변성공유 상태얕은 복사방어적 복사
모범답안
면접관님, 동시성 프로그래밍에서 불변 객체는 스레드 안전성을 확보하는 데 매우 유용합니다. 왜냐하면 불변 객체는 생성 후 내부 상태가 변하지 않기 때문에 여러 스레드가 동시에 접근해도 데이터 경쟁 조건이 발생하지 않기 때문입니다.
불변 객체를 설계하는 방법은 다음과 같습니다. 첫째, 클래스의 모든 필드를 final로 선언하여 변경을 막습니다. 둘째, 객체의 상태를 변경하는 setter 메서드를 제공하지 않습니다. 셋째, 가변 객체를 필드로 가질 경우, 생성자에서 방어적 복사를 수행하여 외부에서 객체 내부의 가변 상태를 변경하는 것을 방지합니다.
하지만 불변 객체는 모든 변경 사항에 대해 새로운 객체를 생성해야 하므로, 객체 생성 비용이 증가할 수 있습니다. 또한, 복잡한 객체의 경우 불변성을 유지하기 위한 코드가 복잡해질 수 있다는 단점도 있습니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.
함께 보는 동시성 / 멀티스레딩 면접 질문
- 교착 상태(Deadlock)는 멀티스레드 애플리케이션에서 심각한 문제를 야기할 수 있습니다. 교착 상태의 4가지 필요조건을 설명하고, 이를 해결하거나 예방하기 위한 실용적인 방법들을 제시해주세요.
- 특정 언어(예: Java, C#)에서 `volatile` 키워드가 멀티스레딩 환경에서 어떤 역할을 하는지 설명해주세요. `volatile`이 보장하는 것과 보장하지 못하는 것을 구분하여 설명하고, `synchronized` 또는 `Atomic` 클래스와의 차이점을 언급해주세요.
- 스레드 풀(Thread Pool)을 사용하는 주된 이유와 이점이 무엇인지 설명해주세요. 스레드 풀의 크기를 결정할 때 고려해야 할 요소들과, 잘못된 스레드 풀 사용으로 발생할 수 있는 문제점들을 함께 설명해주세요.
- 멀티스레딩 환경에서 문맥 교환(Context Switching)이 발생하는 시점과 그 과정에 대해 설명해주세요. 문맥 교환이 시스템 성능에 미치는 영향은 무엇이며, 이를 최소화하기 위한 방법에는 어떤 것들이 있는지 설명해주세요.
- Java Memory Model (JMM)의 happens-before 관계에 대해 설명하고, volatile 키워드가 JMM 관점에서 어떻게 가시성(visibility)과 순서(ordering)를 보장하는지 내부 동작 원리를 상세히 설명해 주십시오.
- 락(Lock)을 사용하지 않고 스레드 안전한(thread-safe) 큐를 구현한다고 가정할 때, 어떤 기법들을 활용할 수 있으며, 특히 CAS(Compare-And-Swap) 연산을 사용하여 어떻게 원자성(atomicity)을 보장할 수 있는지 구체적인 예시와 함께 설명해 주십시오. 락 프리(lock-free) 방식의 장단점은 무엇입니까?