파이썬 개발자 면접 질문 이렇게 준비하자
질문 1: 파이썬에서 가상환경을 사용하는 이유는 무엇인가요?
파이썬에서 가상환경을 사용하는 이유는 여러 가지가 있습니다. 가장 큰 이유는 프로젝트 간에 필요한 패키지 버전 충돌을 방지하기 위해서입니다. 각 프로젝트마다 필요한 패키지의 버전이 다를 수 있으며, 가상환경을 사용하면 각 프로젝트마다 독립적인 파이썬 환경을 사용할 수 있습니다. 따라서, 한 프로젝트에서 패키지의 버전을 업그레이드하거나 변경하더라도 다른 프로젝트에는 영향을 주지 않습니다.
또한, 가상환경을 사용하면 프로젝트의 종속성을 쉽게 관리할 수 있습니다. 가상환경을 생성하고 필요한 패키지를 설치한 후, 해당 가상환경을 다른 개발자와 공유하면 다른 환경에서 동일한 종속성을 가지고 작업할 수 있습니다. 이는 프로젝트의 이식성과 협업을 용이하게 만들어줍니다.
가상환경은 또한 프로젝트의 안정성을 높일 수 있는 장점도 가지고 있습니다. 패키지를 설치하기 전에 가상환경을 활성화하여 패키지의 충돌 여부를 사전에 확인할 수 있습니다. 또한, 가상환경에서 패키지를 업그레이드하거나 삭제하는 것이 원래의 파이썬 환경에 영향을 주지 않기 때문에, 실수로 시스템 패키지를 손상시키는 일을 방지할 수 있습니다.
질문 2: 파이썬에서 제너레이터와 이터레이터의 차이점은 무엇인가요?
파이썬에서 제너레이터와 이터레이터는 모두 iterable한 객체를 만들기 위해 사용됩니다. 그러나 제너레이터와 이터레이터의 동작 방식과 사용성에는 차이점이 있습니다.
이터레이터는 \_\_iter\_\_()와 \_\_next\_\_() 메소드를 구현한 객체로, 값을 순차적으로 반환하는 역할을 수행합니다. 이터레이터는 모든 값을 메모리에 저장하지 않고, 필요한 값을 필요한 시점에 반환하므로 메모리를 효율적으로 사용할 수 있습니다. 그러나 한 번 반복되면 재사용할 수 없으므로, 값을 한 번만 소비할 수 있습니다.
제너레이터는 이터레이터를 생성하기 위해 사용되는 함수로, 제너레이터 함수 안에는 yield 키워드를 사용하여 값을 반환합니다. 제너레이터 함수는 실행 중에 여러 번 값을 반환할 수 있고, 호출 시 이터레이터를 생성하여 값을 반환합니다. 또한, 제너레이터는 상태를 유지하기 때문에 이터레이터와 달리 값을 여러 번 소비할 수 있습니다.
질문 3: GIL(Global Interpreter Lock)이란 무엇인가요? 파이썬에서 GIL의 역할은 무엇인가요?
GIL(Global Interpreter Lock)은 CPython 인터프리터에 딸린 스레드 동기화 메커니즘입니다. GIL은 CPython 인터프리터를 단일 스레드로만 동작하도록 제한합니다. 이는 한 번에 하나의 스레드만 파이썬 바이트코드를 실행할 수 있게 만듭니다.
GIL은 파이썬의 멀티스레드 프로그래밍을 약간 제한하기 때문에, CPU 바운드 작업에 대해서는 파이썬의 멀티스레딩이 실질적인 성능 향상을 가져오지 못하는 경우가 있습니다. 그러나 I/O 바운드 작업(네트워크 요청, 파일 입출력 등)이나 자원 공유가 필요하지 않은 작업에 대해서는 여전히 멀티스레딩을 사용할 수 있습니다.
GIL은 파이썬 인터프리터를 단순하고 안정적으로 만들어줍니다. 파이썬에서 스레드 동기화를 직접 관리할 필요가 없으므로 개발자가 스레드 관리에 대한 복잡성을 줄일 수 있습니다. 또한, C 확장 모듈의 안전성을 보장하여 스레드로부터의 데이터 경쟁 문제를 최소화하는 역할도 있습니다.
질문 4: 데코레이터(Decorator)란 무엇인가요? 파이썬에서 데코레이터를 사용해야하는 이유는 무엇인가요?
데코레이터는 파이썬의 함수나 클래스를 수정하지 않고 추가적인 기능을 제공하는 기술입니다. 데코레이터는 함수에 '@' 기호를 사용하여 함수의 호출을 수정하거나 함수 자체를 반환하는 방식으로 동작합니다.
데코레이터를 사용하는 이유는 코드 재사용과 코드 간결성을 높이기 위해서입니다. 데코레이터를 사용하면 기존의 코드를 수정하지 않고도 새로운 기능을 추가할 수 있으므로, 기존 코드를 재사용할 수 있습니다. 또한, 데코레이터를 사용하면 코드의 가독성을 높이고 중복을 줄일 수 있습니다.
데코레이터는 AOP(Aspect-Oriented Programming) 원칙을 따르므로, 코드의 핵심 기능과 부가 기능을 분리할 수 있습니다. 이는 코드의 유지보수를 쉽게 만들어주고, 객체 지향 프로그래밍의 SOLID 원칙을 준수할 수 있게 합니다. 또한, 데코레이터는 간단하고 직관적인 문법을 가지고 있어 사용하기 쉽습니다.
질문 5: GIL은 파이썬 프로그램 실행에 어떤 영향을 미치나요? GIL을 우회하기 위해 어떤 방법들이 있나요?
GIL(Global Interpreter Lock)은 파이썬의 멀티스레딩을 제한하여 한 번에 하나의 스레드만 파이썬 바이트코드를 실행할 수 있게 합니다. GIL은 CPU 바운드 작업에 대해서는 멀티스레딩의 성능 향상을 제한할 수 있습니다. 그러나 I/O 바운드 작업이나 자원 공유가 필요하지 않은 작업에 대해서는 여전히 멀티스레딩으로 성능을 향상시킬 수 있습니다.
GIL을 우회하기 위한 방법은 다음과 같습니다:
- 멀티프로세싱 사용: GIL이 프로세스마다 독립적으로 작동하기 때문에, 멀티프로세싱을 사용하면 여러 개의 프로세스를 동시에 실행할 수 있습니다.
- 서브프로세스 사용: 서브프로세스는 별도의 프로세스로 실행되기 때문에 GIL의 영향을 받지 않습니다. 따라서, 멀티프로세스 패키지인 multiprocessing 또는 subprocess를 사용하여 서브프로세스를 실행할 수 있습니다.
- 병렬 작업 라이브러리 사용: GIL이 영향을 미치지 않는 병렬 작업 라이브러리인 concurrent.futures나 multiprocessing.dummy를 사용하여 병렬 작업을 실행할 수 있습니다.