떼닝로그

[Python] Python 기술 면접 대비 본문

개발로그/기타 이론 정리

[Python] Python 기술 면접 대비

떼닝 2024. 4. 24. 17:12

출처 : https://www.edureka.co/blog/interview-questions/python-interview-questions/#basicinterviewquestions

참고 : https://heehehe-ds.tistory.com/142

 

1. List와 Tuple의 차이?

    - List는 mutable(가변. 수정 가능)하며, tuple보다 느림

    - Tuple은 immutable(불변. 수정 불가능)하며, list보다 빠름

 

2. Python의 주요 특징들?

    - Interpreter 언어. C, PHP, Ruby처럼 실행 전에 컴파일이 필요하지 않음.

    - Dynamically Typed 언어. 변수 선언 시 자료형 명시할 필요 없음.

    - OOP(객체 지향 언어). class 정의, 상속 사용 가능. C++의 public, private 같은 접근 제한자 X 

    - 함수들이 first-class object임. 변수에도 함수 할당 가능하며, 함수의 반환값으로 함수를 내보낼 수도 있음

          - First-Class Object : 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체.

          - 함수의 실질적인 매개변수, 함수의 반환값, 할당의 대상이 될 수 있으며, 비교 연산을 적용할 수 있음.

     - python code를 작성하는 것은 빠르지만, 다른 compiled language보다 실행하는 속도는 느리다. 

          - 해결 위해 C-based extension을 사용하기도 함. (ex. numpy package)

    - 여러 분야에서 사용 중임. (ex. web app, automation, scientific modeling, ...)

 

3. Python은 Programming 언어인지, Scripting  언어인지?

    - Scripting도 가능하지만, General-Purpose Programming 언어가 조금 더 맞는 표현...

         - Script Language는 다른 응용 프로그램에 삽입되어서 동작하는 언어

         - General-Purpose Programming Language는 다양한 도메인의 소프트웨어를 개발하기 위해 설계된 언어

         - WWW 웹 페이지 작성에 사용되는 HTML은 범용 언어가 아님. C, Java는 범용 언어

 

4. Python은 Interpreted Language?

     - 컴파일 언어는 컴파일러를 통해 구현되며, 소스 코드를 기계어로 바꾸는 과정을 사전에 처리하여 컴퓨터에서 빠르게 구동될 수 있도록 한 방법

     - 인터프리터 언어는 대부분 소스코드를 기계어로 컴파일하지 않고, 인터프리터를 통해 소스코드 실행 시 각 statement를 하나 이상의 서브루틴 순서로 변환한 후, 기계어나 바이트코드 등 다른 언어로 변환되어 구현

     - 인터프리터 언어는 인터프리터가 실행을 하기 때문에, 코드가 플랫폼의 영향을 받지 않는다. 하지만 느림

 

5. PEP8?

     - Python Enhanced Proposal으로, Python 코드의 가독성을 maximize 하기 위해 설정된 규칙들

 

6. Python 사용했을 때의 좋은 점은?

     - 쉽게 사용 가능 : python은 high-level programming language

     - Interpreted Language : 인터프리터 언어로 line by line으로 실행하고, 에러 발생 시 line 멈춤

     - Dynamically typed : 변수 선언 시 자료형 지정하지 않음. 실행하며 자동 할당

     - Free and Open Source

     - Extensive support for Libraries : 다양한 라이브러리를 갖추고 있음. Python Package Manager(pip)로 쉽게 다른 패키지들도 사용 가능

     - Portable : 큰 변경 사항 없이도 다양한 플랫폼에서 운용 가능

 

7. Python의 namespace?

    - 특정한 객체(object)를 이름(name)에 따라 구분할 수 있는 범위 (특정한 하나의 이름이 통용될 수 있는 범위)

    - Built-in namespsace : 기본 내장 함수 및 기본 예외들의 이름. 파이썬으로 작성된 모든 코드 범위가 포함

    - Global namespace : 모듈별로 존재하며, 모듈 전체에서 통용될 수 있는 이름들이 소속됨

    - Enclosing namespaces : 상위 단계, 또는 외부 함수의 namespace

    - Local namespaces : 함수 및 메서드 별로 존재. 함수 내의 지역 변수들의 이름들이 소속

 

8. Python Decorator?

    - 구조를 바꾸지 않고 함수에 디자인 패턴을 덧입히기 위해 사용.

    - 데코레이터 함수를 먼저 정의하고, 적용할 함수 위에 @ symbol과 함께 데코레이터 함수명을 작성.

    - https://bluese05.tistory.com/30 여기에 설명 잘 되어있음

 

9. Python 기본 내장 자료형은?

    - Numbers : integer(정수), floating-point numbers(실수), complex numbers(복소수)

    - List : 순서가 있는 요소들의 나열형

    - Tuple : list와 마찬가지로 순서가 있는 요소들의 나열형이나, 수정 immutable함.

    - String : 문자들의 나열. '나 " 사용해서 선언

    - Set : 중복이 없는 원소들의 집합. 순서 X

    - Dictionary : {key:value} 쌍으로 묶인 형태. 각 아이템에 대한 순서는 중요하지 않음.

    - Boolean : True/False 값

 

10. Python의 memory 관리 방법?

    - Python은 private heap space로 메모리를 관리하고, 주체는 python interpreter. 모든 파이썬 object와 데이터 구조들은 private heap에 위치함.

    - python object들의 heap space 할당은 python의 memory manager가 진행. 코어 API들이 몇 개의 툴에 접근 권한을 주기도 함.

    - 자체 내장 garbage collector 존재. 미사용 메모리를 재활용함으로써 heap space 관리

 

11. PYTHONPATH는 무엇인가?

    - module을 import할 때 사용하는 환경변수. 어떤 module을 load해올지, interpreter가 사용

 

12. Python Module은 무엇이고, 어떤 것들이 있는지?

    - Python module은 python code를 포함하고 있는 파일들. 함수, 객체, 변수, 모든 것들이 해당. 

    - python 내장 module : os, sys, math, random, data time, JSON, ...

 

13. Python에서의 지역변수와 전역변수?

    - 전역변수 : 함수 밖에서 선언되거나, 전역 공간에서 선언된 변수들. 프로그램 내 어느 함수에서든 접근 가능

    - 지역변수 : 함수 안에서 선언된 변수

 

14. Python은 Case Sensitive한 언어인가?

    - Yes. 대문자와 소문자를 다르게 취급함. 변수 x와 X는 다름.

 

15. Python의 형변환

    - int(), float() : 정수, 실수로 형 변환

    - ord() : character type을 정수형으로 변환. ord('A') = 65, ord('a') = 97

    - hex(), oct() : 정수 값을 16진수, 8진수로 변환 

    - tuple(), set(), list(), dict(), str() : 각 type으로 형 변환.

    - complex(real, imag) : 복소수 변환. complex(3, 5) = 3+5i

 

16. Python에서의 array와 list의 차이?

     - array와 list 둘 다 데이터를 저장하고 있따는 점은 같으나,

     - array는 동일한 data type의 원소들만 가질 수 있고, list는 data type 상관 없음.

 

17. __init__은 무엇인가?

      - 함수, 또는 생성자의 역할을 함. 

      - 클래스에 새로운 object/instance가 생겼을 때 메모리를 할당하기 위해 자동으로 호출함.

      - 모든 클래스는 __init__ method를 가지고 있음.

 

18. lambda 함수는 무엇인가?

     - 익명 함수. parameter의 개수는 상관 없지만, 하나의 statement만 가질 수 있음.

     - https://wikidocs.net/64 여기 참고 ㅎㅎ

 

19. Python에서의 self는 무엇인가?

     - self는 객체의 object로, 보통 첫 번째 파라미터로 포함된다.

     - class 내의 함수나 속성에 대한 지역 변수와의 구분을 위해 사용.

 

20. break, continue, pass?

     - break : loop에서 특정 조건에 성립될 때 빠져나와 다음 statement로 넘어갈 때 사용

     - continue : loop에서 특정 조건이 성립될 때 아래 부분을 건너뛰고 loop의 시작 부분으로 돌아갈 때 사용

     - pass : code block이 필요는 하나, 실행을 건너뛰고 싶을 때 사용. 그냥 null 역할로, 실행되었을 때도 아무 일도 일어나지 않음

 

21. Python iterator는 무엇인가

     - iterator는 순서대로 다음 값을 반환할 수 있는 객체 (자체적으로 내장하고 있는 __next__ method 통해 다음 값 가져옴)

     - for문을 토해 순회할 수 있는 객체럴 iterable. (iterable은 __next__ 존재하지 않음)

     - python의 for문은 내부적으로 iterator를 생성하여 동작.

     - https://tibetsandfox.tistory.com/27

 

22. Python에서 랜덤하게 번호를 만드는 방법들

    - random.randrange(a, b) : a 이상 b 미만의 값들 사이에서의 정수값을 가져옴. 

    - random.uniform(a, b) : a 이상 b 미만의 값 사이에서의 실수값을 반환

 

23. Python에서 exit 했을 때, 왜 메모리 할당 해제가 되지 않는 것인지?

    - 다른 object와의 circular reference가 있거나, global namespace로 참조 중인 object의 경우 항상 de-allocate나 free 되지 않는다.

    - C library에서 사용(?) 중인 memory의 일부만을 de-allocate 하는 것은 불가능함

    - 하지만 exit 했을 때, 효율적인 clean up 매커니즘을 위해 python은 다른 object들을 de-allocate/destroy 시도

 

24. Python에서의 삼항 연산자 사용 방법?

    - [on_true] if [expression] else [on_false]. 

    - x, y = 25, 50 \n big = x if x < y else y

 

25. *args, **kwargs는 무엇이며, 왜 써야 하는가?

    - *args는 함수로 몇 개의 인자들이 넘어갈 지 확실하지 않을 때 사용하거나, 함수의 인자로 list나 tuple을 보내고 싶을 때 사용

    - **kwargs는 몇 개의 keyword arguments들이 사용될 지 모를 때, 또는 dictionary의 값들을 보내고 싶을 때 사용.

    - **args, **kwargs는 그냥 일반적인 convention(반복문에서 사용하는 i, j같은)이므로 그냥 *bob **billy로도 바꿀 수 있음

 

26. list와 비교했을 때 numpy.array의 장점?

    - list는 효율적인 general-purpose container. insert, delete, append, concat의 작업을 하기에 좋음.

    - list는 "vectorized"된 작업들을 지원하지 않음. 각 요소들에 대한 덧셈, 곱셈 등이 불가능

    - NumPy는 효율적이고, 편리함. vector와 matrix 작업을 쉽게 할 수 있으며, 더 빠른 searching, basic statistics 작업 등이 가능

 

27. Python도 OOP인가?

    - python은 객체 지향 프로그래밍 언어... (밑에 가서 잔뜩 할 거임 ><)

 

28. 깊은 복사와 얕은 복사의 차이?

    - 얕은 복사는 참조 포인터를 복사하기 위함. 참조자는 원본 object를 가리키고 있으며, 변동이 있을 경우 원본에도 적용이 됨. 

    - 깊은 복사는 참조 포인터를 복사하는 것이 아니라, 값만을 가져옴. 원본에 영향을 끼치지 않으며, 프로그램이 느려짐.

 

29. Python에서의 multi-threading?

    - python에도 multi-threading과 관련된 패키지가 있으나, 속도를 빠르게 하기 위해서 사용하는 것은 좋지 않음

    - python에는 Global Interpreter Lock(GIL)이라는 구조가 있는데, 이것은 한 번에 하나의 'thread'가 실행될 수 있도록 함. (일종의 mutex) thread가 GIL을 얻으면, 소량의 작업 진행 후에, 다음 thread에 GIL을 넘겨줌

    - 굉장히 빠르게 작업이 진행되어 우리가 봤을 땐 parallel하게 실행되는 것처럼 보일 수 있으나, 실제로는 같은 CPU core를 사용

    - GIL을 넘겨주는 것은 결국 실행 overhead를 늘려주는 것

    - https://it-eldorado.tistory.com/160

 

 

여기서부턴 Python OOP 관련

 

1. Python의 상속에 대해 설명해보쇼

    - 상속은 하나의 클래스가 다른 클래스의 모든 멤버(속성, 함수)들을 가지는 것. 기존 기능 재사용 가능.

    - 상속으로 코드 재사용성을 제공하고, application을 유지 보수하기에도 쉽게 만듦.

    - 상속당하는 클래스(기능을 물려주는 클래스)를 super-class, 상속을 받아 새롭게 만드는 클래스를 derived/child-class라고 부름

 

    - 단일 상속 : 하나의 파생 클래스가 하나의 슈퍼 클래스에서 멤버들을 가져오는 것

    - 멀티레벨 상속 : 파생 클래스 d1은 base class base1을 상속, d2는 base2를 상속하는 것

    - 계층 상속 : 하나의 base class에서 여러 개의 child class들을 상속할 수 있음

    - 다중 상속 : 한 개 이상의 base class로부터 상속을 받아서 한 개의 파생 클래스가 상속되는 것

 

2. Python의 monkey patching?

    - monkey patch는 프로그램이 내부 프로그램을 로컬에서 잠시 다른 기능을 수행ㅎ아도록 수정하거나 확장하도록 하는 방법. 로컬이므로 런타임시에만 영향을 주는 방식.

     - test 시에 주로 사용. 다른 기능을 수행하도록 하는 부분 또한 mock object를 원하는 기능을 수행하도록 만든 뒤 그것으로 replace

 

3. Python은 다중 상속을 지원하는가?

    - 다중 상속은 하나 이상의 parent class에서 상속을 받는 것.

    - 자바와 다르게 파이썬은 다중 상속이 가능하다.

 

4. Python에서의 다형성은 무엇인가?

    - 다형성은 같은 이름의 메서드나 연산자를 다른 클래스에서 다르게 구현하는 것. 서로 다른 클래스에서 같은 이름의 메서드를 호출하더라도, 결과가 서로 다르게 반환될 수 있도록 하는 것.

    - 코드의 가독성과 유연성을 높일 수 있음. 같은 이름의 메서드를 가진 클래스들을 상황에 맞게 선택하여 사용할 수 있고, 코드의 재사용성을 높일 수 있음

 

5. Python에서의 캡슐화?

    - python의 class가 캡슐화의 예시.

    - 데이터와 그 데이터를 처리하는 메서드를 하나의 단위로 묶어(캡슐화) 외부에서 직접적으로 접근하지 못하도록 제한(정보은닉)하는 것.

    - 객체 내부의 데이터가 보호되고, 외부에서는 메서드를 통해서만 객체에 접근할 수 있음.

    - ex. 은행 입금, 출금, ...

 

6. Python에서의 데이터 추상화

    - 자료 추상화는 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단히 만드는 것.

    - 파이선에서 인터페이스와 추상 클래스를 사용함으로써 데이터 추상화 가능.

 

7. Python의 접근 제어자

    - 객체지향 기반 프로그래밍에서는 접근 제어자(private, protected, public)을 이용한 정보 은닉을 통해 외부로부터 데이터 보호.

    - 객체의 속성과 메소드를 하나로 묶고, 실제 구현 내용의 일부는 외부에 감추어 은닉할 수 있는 캡슐화 가능

 

    - public(name) : 외부로부터 모든 접근 허용

    - protected(_name) : 자기 클래스 내부 혹은 상속받은 자식 클래스에서만 접근 허용

    - private(__name) : 자기 클래스 내부의 메서드에서만 접근 허용

Comments