Python의 장점과 단점은 무엇이라고 생각하시나요?
장점
단점
'파이썬은 느리다'라는 문장에 대해 본인의 생각을 기술적 근거를 기반으로 말해주세요.
가상환경이란 무엇인지에 대해서 설명해주세요.
파이썬에서 매개변수와 인자의 차이를 설명해주세요.
인터프리터와 컴파일러에 대해서 설명해주세요. (장단점을 비교해주세요)
컴파일러: 프로그램 전체를 스캔하여 이를 기계어로 번역, 전체를 스캔하기 때문에 초기 스캔 시간이 오래 걸린다. 초기 스캔을 마치면 실행파일을 만들어 다음에 실행할 때 이전에 만든 실행파일을 실행하기 때문에 전체 실행시간은 인터프리터보다 빠르다. 고급언어를 기계어로 번역하는 과정에서 오프젝트 코드를 만들고 이를 실행파일로 만드는 링킹이라는 작업을 하기 때문에 인터프리터보다 많은 메모리를 사용, 전체 코드를 검사한 후에 오류 메시지를 생성하기 때문에 실행전에 오류를 발견할 수 있다
인터프리터: 한 문장씩 번역하여 실행시키는 과정을 반복하기 때문에 컴파일러보다 느리다. 오브젝트 코드, 링킹의 과정이 없기 때문에 메모리 효율이 좋다. 중간에 오류를 발견하면 프로그램을 중지하기 때문에 프로그램을 실행해봐야 오류 발견이 가능하다.
정적 타입과 동적 타입의 차이에 대해서 설명해주세요. (장단점을 비교해주세요)
정적 타입: 자료형이 고정된 언어, 자료형을 컴파일 시에 결정, 소스코드 상에 자료형을 지정, 컴파일 시 타입에 대한 정보를 결정하기 때문에 속도가 빠르고 타입 에러로 인한 문제점을 초기에 발견할 수 있어 안정성이 올라간다.
동적 타입: 자료형이 동적으로 변하는 언어, 자료형을 실행될 때 결정, 타입을 덜 신경써도 되므로 간단한 프로그램을 만들 때 개발 속도 면에서 빠르다, python은 동적타입의 강타입 언어(자료형이 맞지 않으면 에러, 암묵적 변환을 지원하지 않음), JS는 동적타입의 약타입 언어(자료형이 맞지 않으면 암묵적으로 타입을 변환, 1+"1" = "11")
클로저(closure)란 무엇이며 어디에 유용한가요?
Generator란 무엇이고 어떻게 사용하나요?
발전기라는 의미를 가지며 호출할 때마다 yeild가 작동되 값을 순차적으로 산출, yield가 사용되면 그 함수는 generator가 되고 generator는 iterator(순서대로 다음 값을 리턴할 수 있는 객체)를 생성해주는 함수, iterator는 iter, next 등 메서들르 구현해야 하지만 generator는 yield를 사용하면 손쉽게 생성할 수 있다.
generator로 iterator를 생성하지 않으면 선언과 동시에 메모리를 소모하지만 generator는 순서를 기억한 객체가 생성되고 호출 전까지 메모리를 사용하지 않기 때문에 메모리 효율이 높다.(이를 지연 평가 방식이라 한다.)
yield는 왼쪽 변수에 할당하여 함수 외부에서 값을 전달 받을 수 있다.(양방향 통신이 가능, 왼쪽에 할당, 오른쪽은 산출)
데코레이터란 무엇인가요?
파이썬의 메모리 관리 방식에 대해 알려주세요
레퍼런스 카운팅은 파이썬에서 생성된 객체가 객체를 가리키는 참조의 수를 추적하는 참조 카운트 변수를 가진다는 것
레퍼런스 카운팅 변수가 멀티 스레드 환경에서 두 스레드가 동시에 값을 늘리거나 줄이는 Race Condition이 발생할 수 있다는 것이다. 이러한 상황이 발생하면 메모리 누수가 발생하거나 객체에 대한 참조가 남아있는 데도 메모리를 잘못 해제할 수 있다.
Race Condition
두 개 이상의 프로세스가 공통 자원을 병행적으로(concurrently) 읽거나 쓰는 동작을 할 때, 공용 데이터에 대한 접근이 어떤 순서에 따라 이루어졌는지에 따라 그 실행 결과가 같지 않고 달라지는 상황
두 개의 스레드가 하나의 자원을 놓고 서로 사용하려고 경쟁하는 상황
파이썬에서 일급객체가 무엇인지 설명해주세요.
객체지향이란 무엇인지? 주요 원칙이 무엇인지 설명해주세요
절차지향 프로그래밍, 함수형 프로그래밍, 객체지향프로그래밍의 차이점이 무엇인가요?
list comprehension이란? 사용시 장단점을 본인 사용경험에 근거하여 설명해주세요.
반복되거나 특정 조건을 만족하는 리스트를 만들 수 있는 방법
익숙해지면 반복문, 조건문을 한 줄로 편하게 만들 수 있다.
익숙하지 않다면 가독성이 떨어지고 코드를 이해하는데 시간이 걸린다.
Python의 GIL(Global Interpreter Lock)이란 무엇이고, 어떤 문제를 발생시키나요?
GIL은 Global Interpreter Lock의 약어로, 여러 개의 스레드가 파이썬 바이트코드를 한번에 하나만 사용할 수 있게 락을 거는 것을 의미한다. 쉽게 말해서 하나의 스레드만 파이썬 인터프리터를 제어할 수 있도록 하는 뮤텍스
뮤텍스
- 공유된 자원의 데이터를 여러 스레드가 접근하는 것을 막는 방법
- Critical Section(각 프로세스에서 공유 데이터를 엑세스하는 프로그램 코드 부분)을 가진 쓰레드들의 Running time이 서로 겹치지 않게 각각 단독으로 실행되게 하는 기술
- 다중 프로세스들이 공유 리소스에 대한 접근을 조율하기 위해 locking과 unloking을 사용하는데, 다시 말해서 상호배제를 함으로써 두 쓰레드가 동시에 사용할 수 없다는 뜻
파이썬 프로그램은 특정 시점에 오직 하나의 스레드만 실행된다
파이썬 멀티 스레드 프로그램에서 멀티 스레드가 싱글 스레드처럼 동작하는 성능병목 현상을 발견할 수 있다.
따라서 동시다발적인 멀티스레드를 처리하거나 CPU에 집중된 많은 스레드를 처리하는 데 적합하지 않다
mutable 자료형과 immutable 자료형에는 어떤 것들이 있고 각각 어떤 특징을 가지고 있나요?
mutable
생성 후에 그 내용이 변경될 수 있는 자료형, list, dictionary
immutable
한번 생성되면 그 상태가 변경될 수 없는 자료형, 값을 변경하려 시도할 경우 새로운 객체가 생성
integer, string, tuple
args와 **kwargs의 용도와 사용 예제를 설명해주세요.
args: 함수에 임의의 개수의 positinal argument를 전달할 때 사용
def my_function(*args)
argument들을 튜플로 받아 처리할 수 있습니다.
kwargs: 함수에 임의의 개수의 keyword argument를 전달할 때 사용
def my_function(**kwargs)
keyword argument들을 딕셔너리로 받아 처리할 수 있습니다.
멀티스레딩과 멀티프로세싱의 차이점과 각각의 장단점을 설명해주세요.
멀티스레딩
가볍지만 GIL로 인해 계산 처리를 하는 작업은 한번에 하나의 쓰레드에서만 작동하여 cpu 작업이 적고 I/O 작업이 많은 병렬 처리 프로그램에서 효과를 볼 수 있다.
멀티프로세싱
각자가 고유한 메모리 영역을 가지기 때문에 더 많은 메모리를 필요로 하지만, 각각 프로세스에서 병렬로 cpu 작업을 할 수 있고 이를 이용해 여러 머신에서 동작하는 분산 처리 프로그래밍도 구현할 수 있다.