본문 바로가기

PYTHON

[TIL] 20240422 48일차

10주차 모의면접 문항 정리


Python

 

1. Python의 장점과 단점은 무엇이라고 생각하시나요?

 

[장점]

Python의 문법은 간결하고 직관적입니다. 코드를 작성할 때 들여쓰기, 즉 탭을 사용하여 코드블럭을 구분하기 때문입니다. 이렇게 작성된 코드는 가독성이 좋으며, 가독성이 좋으면 코드를 이해하고 유지보수를 하는 데에 용이합니다.

파이썬은 동적 타입 언어입니다. 즉 변수의 자료형을 지정해줄 필요 없이 변수를 선언할 때의 값에 따라 자동으로 타입이 결정됩니다. 따라서 개발자가 자료형 선언을 신경 쓰지 않아도 됩니다.

 

[단점]

Python은 인터프리터 언어로써, 다른 컴파일 언어에 비해 실행 속도가 느릴 수 있습니다.

따라서 실시간 성능이 중요하거나 빠른 실행 속도를 요구하거나 하드웨어를 직접 제어해야 하는 프로그램에는 적합하지 않을 수 있습니다.

또한 동적 타입 언어는 코드 작성 단계에서 이점이 있지만 예상치 못한 타입 관련 오류가 발생했을 때 디버깅이 어려울 수 있습니다.

 

 


2. '파이썬은 느리다'라는 문장에 대해 본인의 생각을 기술적 근거를 기반으로 말해주세요.

 

Python은 인터프리터 언어이고 동적 타입 언어이기 때문에 다른 컴파일 언어에 비해 실행 속도가 느릴 수 있습니다. 또한 GIL로 인해 병렬 처리에 제한이 있어 높은 성능을 내기 어렵습니다.

 

2-1. 인터프리터 언어가 무엇인가요? 컴파일 언어와 무슨 차이가 있나요?

 

프로그래밍 언어는 크게 컴파일 언어와 인터프리터 언어로 나눌 수 있습니다. 컴파일 언어는 컴파일을 거쳐 작성한 코드를 기계어로 변환하여 실행 파일을 만든 뒤에 프로그램을 실행합니다. 인터프리터 언어는 컴파일을 거치지 않고 작성한 코드의 한 줄씩을 실행합니다. 컴파일 과정이 없기 때문에 이를 수행하는 시간은 소요되지 않으나, 실행 파일을 별도로 생성하지 않기 때문에 실행 속도가 느립니다.

 

2-2. 동적 타입 언어는 무엇인가요? 반대 개념도 있나요? 차이점이 있나요?

 

동적 타입 언어는 변수의 자료형을 프로그램을 실행할 때 결정합니다. 정적 타입 언어는 반대로 변수의 자료형을 컴파일 때 결정합니다. 따라서 변수의 자료형이 이미 결정된 상태의 실행 파일을 다루는 정적 타입 언어와 다르게 프로그램 실행 시마다 변수의 자료형을 결정하기에 실행 속도가 느립니다.

 

2-3. GIL은 무엇인가요?

 

GIL은 Global Interpreter Lock으로, 하나의 스레드만 파이썬 인터프리터의 제어를 유지할 수 있도록 잠그는 것입니다. 즉 Python은 한 시점에 하나의 스레드만 실행할 수 있습니다. 멀티 쓰레드로 병렬 처리를 하려고 해도 싱글 스레드처럼 동작하는 성능병목 현상이 발생합니다. 따라서 병렬 처리를 할 수 있는 다른 언어들에 비해 프로그램 성능을 올리기 어렵습니다.

 

 


3. 가상환경이란 무엇인지에 대해서 설명해주세요.

 

가상환경은 특정 프로그램 개발에 필요한 기능(인터프리터, 라이브러리 등) 만을 사용하기 위해 만든 가상의 독립된 공간입니다.

Python의 여러 기능을 수행하는 라이브러리는 각각의 버전이 있고, 버전에 따라 기능이 추가, 삭제, 변경됩니다. 따라서 협업을 할 때 프로젝트에서 사용하는 라이브러리들의 종류와 버전을 통일한 가상환경을 만들고 이 환경 안에서 프로젝트를 진행합니다. 즉, 프로젝트 간 버전 및 의존성 충돌을 방지하고 일관된 환경(버전)에서 프로젝트를 수행할 수 있습니다.

 

 


4. 환경변수란 무엇인지 설명해주세요.

 

환경 변수는 운영체제가 참조하는 변수입니다. 대표적인 환경 변수로 PATH가 있습니다. 시스템 내의 필요한 파일을 실행하기 위해서는 파일이 있는 경로로 들어가서 직접 실행해야 하지만, 이 경로를 PATH에 설정해두면 어느 경로에 있든 설정해둔 환경 변수 만으로 실행할 수 있게 됩니다. python도 PATH 설정을 마쳤기 때문에 커맨드 창에서 python 단어 하나로 실행할 수 있습니다.

 

 


5. 파이썬에서 매개변수와 인자의 차이를 설명해주세요.

 

매개변수는 함수 내부에서 사용하는 변수이고, 인자는 해당 함수를 호출하여 사용할 때 매개변수에 전달할 값을 의미합니다. 예를 들어 두 수의 합을 리턴하는 sum 함수를 선언하고, 해당 함수의 매개변수로 A와 B를 설정한다면 리턴값으로 A + B를 작성할 것입니다. 여기서 A와 B는 매개변수에 해당합니다. 이 sum 함수를 호출할 때 sum(1, 2)라고 한다면 1과 2는 A, B 각각의 인자 값에 해당합니다. 즉 1은 A에, 2는 B에 인자로 하여 sum 함수를 호출하는 것입니다.

 

 


6. 클로저(closure)란 무엇이며 어디에 유용한가요?

[편집 필요]

클로저는 함수와 그 함수가 정의된 환경을 함께 기억하는 개념입니다. 이는 함수가 다른 함수 내에 중첩됐을 때 내부 함수가 외부 함수의 지역 변수에 접근할 수 있게 됩니다. 즉 클로저를 사용하면 프로그램의 흐름을 변수에 저장할 수 있습니다. 파이썬에서 클로저는 보통 함수 내에 또 다른 함수가 정의될 때 생성됩니다. 이때 내부 함수는 외부 함수의 지역변수에 접근할 수 있으며, 이를 통해 외부 함수의 상태를 기억합니다. 클로저는 데이터 은닉과 보호, 콜백 함수, 팩토리 함수 등의 다양한 상황에서 활용됩니다. 예를 들어 객체 지향 프로그래밍에서 데이터 은닉을 달성하거나, 콜백 함수로서 비동기 작업을 처리하거나 팩토리 함수로 동일한 패턴의 함수를 여러개 생성하는 데에 사용될 수 있습니다. 이렇게 클로저는 파이써에서 함수의 유연성을 높여주는 강력한 개념으로 함수를 이해하고 활용하는데 데 중요한 역할을 합니다. 클로저를 사용하면 코드를 더 간결하게 작성하고 데이터를 보호하며 유연하게 프로그래밍할 수 있습니다.

 

 


7. Generator란 무엇이고 어떻게 사용하나요?

 

Generator는 이터레이터를 생성하는 함수입니다.

일반 함수처럼 처음부터 끝까지 한 번에 실행되지 않고, 특정 지점까지 실행한 뒤 원하는 때에 다시 함수를 실행하여 값을 얻을 수 있습니다. 이를 함수 호출자에게 함수 실행의 제어권을 양도한다고 하며, yield라는 메서드를 통해 제너레이터 함수를 조작할 수 있습니다. 따라서 일반 함수와 달리 필요할 때만 연산할 수 있어 효율적입니다. 주로 큰 데이터셋이나 무한한 시퀀스를 다루는 경우에 사용합니다.

 

 


8. 데코레이터란 무엇인가요?

 

함수나 메서드에 적용되어 기능을 확장하거나 변경하는 역할을 하는 고차함수입니다.

즉, 함수를 인자로 받아 필요한 코드를 추가하고 이를 다시 함수의 형태로 반환합니다. 데코레이터를 적용하려는 함수의 내부를 수정하지 않고 기능에 변화를 주고 싶을 때 주로 사용합니다.

 

8-1. 고차함수가 무엇인가요?

 

함수를 인자로 전달받거나 함수를 결과로 반환하는 함수입니다.

 

 


9. 파이썬의 메모리 관리 방식에 대해 알려주세요

[편집 필요]

파이썬의 메모리 관리는 참조 계수 기반으로 이루어지며, 객체가 생성될 때마다 그 객체를 참조하는 변수의 개수를 추적하는 방식입니다.객체를 참조하는 변수의 개수가 0이 되면 해당 객페의 메모리는 자동으로 해제가 되지만, 2개 이상의 객체가 서로를 참조하는 상황(순환참조)이 발생하게 되면 객체가 더이상 사용되지 않아도 참조 계수가 0이 되지 않아 메모리 누수가 발생할 수 있습니다.이때 메모리 누수가 발생하게 되는데 파이썬은 가비지 컬랙션을 사용하여 해결할 수 있지만, 명시적으로 가비지 컬렉션을 수해아거나, 순환 참조를 방지하는 코드를 작성하는 것이 좋습니다.일반적으로 가비지 컬렉션은 개발자가 직접 호출하지 않아도 자동으로 수행되지만 가끔 명시적으로 가비지 컬랙션을 수행하려는 경우가 생기기도 합니다.이때는 gc 모듈을 사용할 수 있습니다.

 

 


10. 파이썬에서 일급객체가 무엇인지 설명해주세요.

 

일급 객체(First Class Object 또는 First Class Citizen)는 해당 언어 내에서 일반적으로 다른 모든 개체에 통용 가능한 동작이 지원되는 개체를 의미합니다. 동작은 주로 함수의 인자로 전달되거나, 함수의 반환값이 되거나, 수정되고 할당되는 것을 뜻합니다. Python에서 일급 객체에 해당하는 것으로 int, float, str, list 등이 있습니다.

 

 


11. 객체지향이란 무엇인지? 주요 원칙이 무엇인지 설명해주세요

 

OOP는 객체 지향 프로그래밍의 약어로써, 프로그램을 객체(object)라는 기본 단위로 나누고 이들의 상호작용으로 서술하는 프로그래밍 방식입니다. 객체 지향의 주요 원칙 4가지로 추상화, 상속, 다형성, 캡슐화가 있습니다. 추상화는 객체의 공통적인 속성과 기능을 추출하여 정의하는 것입니다. 상속은 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 것입니다. 다형성은 어떤 객체의 속성이나 기능이 상황에 따라 여러 형태를 가질 수 있는 성질입니다. 캡슐화는 클래스 안에 서로 연관 있는 속성과 기능들을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것입니다. 이러한 특성 때문에 개발 생산성을 올릴 수 있게 되어 객체 지향 프로그래밍을 선호합니다.

 

 


12. 절차지향 프로그래밍, 함수형 프로그래밍, 객체지향프로그래밍의 차이점이 무엇인가요?

[편집 필요]

절차지향, 함수형, 객체지향 프로그래밍의 차이점은 크게 다섯 가지 기준으로 나눌 수 있는데, 프로그래밍 방식 별로 말씀드려보겠습니다.우선 절차지향 프로그래밍의 경우 데이터와 함수가 분리되어 있고, 상태 변이가 일어날 수 있으며, 함수와 프로시저(특정 기능을 수행하는 코드의 묶음)에 중점을 둡니다. 또한 프로그램의 구조가 명령어의 흐름이 중점이 되며, 코드의 재사용성이 떨어집니다. 그리고 함수형 프로그래밍은 함수가 일급 객체로 취급되며 데이터와 함수가 밀접하게 연결되어 있고, 불변성을 강조해 상태 변이를 피합니다. 그리고 함수를 모듈로 사용하며, 함수 간의 평가를 중심으로 프로그램의 구조가 짜입니다. 함수형은 함수의 재사용성이 절차지향에 비해 코드의 재사용성이 높아지며, 확장성이 좋습니다.마지막 객체지향은 데이터와 그 데이터를 처리하는 메소드가 객체에 묶여 있으며, 객체의 상태를 변경할 수 있고, 클래스와 객체를 사용해 모듈화/캡슐화하여 데이터와 메소드를 하나로 묶습니다. 객체 간의 상호작용에 중점으로 구조가 짜였고, 객체의 재사용성이 높고, 상속 등을 통해 확장성이 좋다는 특징을 갖고 있습니다.

 

 


13. list comprehension이란? 사용시 장단점을 본인 사용경험에 근거하여 설명해주세요.

[편집 필요]
리스트 컴프리헨션은 쉽게 말해 ‘리스트를 쉽게, 짧게 한 줄로 만들 수 있는 파이썬의 문법’이라고 할 수 있습니다. 지금은 조금 익숙해졌지만 코딩테스트문제를 풀기 시작한지 얼마 되지 않았을 때 문제를 풀고 다른사람의 답변을 참고 하려고 하면 해당 코드를 원래 익숙한 형태로 해석부터 해야해서 더욱 시간이 오래 걸렸던 적이 있습니다. 리스트 컴프리헨션은 코드가 짧고 간결해지면서 효율적이지만 이에 익숙하지 않거나 복잡한 표현이나 조건등이 추가될 경우 가독성이 떨어질 수 있습니다.

 

 


14. PEP8에 대해 읽어보신 내용 또는 아는 내용에 대해 설명해주세요. 아울러 팀프로젝트 코드 작성시 컨벤션을 맞추기 위한 어떤 노력을 하셨는지 말해주세요.

[편집 필요]

PEP8은 python 코드를 작성할 때 지켜야 하는 스타일 가이드입니다. 이는 코드의 가독성과 일관성을 높이기 위한 규칙을 제공합니다. 예를 들어 들여쓰기는 공백 4개를 사용하고, 코드간 간격은 어떻게 유지할지 등이 포함됩니다. 팀 프로젝트에서 저희는 PEP8 준수를 위해 코드 리뷰를 정기적으로 진행하고, vscode의 extension을 사용하여 코드 스타일을 관리했습니다.

 

 


15. mutable 자료형과 immutable 자료형에는 어떤 것들이 있고 각각 어떤 특징을 가지고 있나요?

 

mutable 자료형은 값이 변할 수 있고, immutable 자료형은 값이 변할 수 없는 자료형입니다. 이를 더 풀어서 설명하면 mutable 자료형은 내부 값이 변해도 메모리 주소가 변하지 않는, 즉 새로운 객체를 할당하지 않는 것입니다. 반면 immutable 자료형은 값이 변하는 즉시 새로운 객체를 할당하면서 메모리 주소가 변하게 됩니다.

Python에서 list, dictionary가 mutable 자료형에 해당하고, 그 외 대부분의 자료형들은 immutable 합니다. mutable 자료형인 list와 dictionary에 대해 특징을 간략히 설명하겠습니다. list는 각 요소에 인덱싱이 되어있는 iterable한 객체입니다. dictionary는 key-value 쌍으로 이루어진 요소들이 모인 객체입니다.

 

 


16. *args와 **kwargs의 용도와 사용 예제를 설명해주세요.

 

함수에서 복수의 인자를 받고자 할 때 사용합니다. *args와 **kwargs를 사용하는 예시를 차례대로 설명하겠습니다.

 

*args를 사용하는 예시를 설명하겠습니다.

*args를 parameter로 하는 greet 함수(greet(*args))를 정의합니다. 해당 함수에선 args에 인자로 받은 각 이름들에 대해 '안녕하세요 name님' 이라고 print(print(f"안녕하세요. {name}님"))한다고 가정합니다. args는 tuple 자료형으로 iterable 하기 때문에 for name in args 형태로 해서 args에 인자값으로 받은 모든 이름들을 print 할 수 있습니다.

 

**kwargs를 사용하는 예시를 설명하겠습니다.

**kwargs를 parameter로 하는 greet_by_case 함수(greet_by_case(**kwargs))를 정의합니다. **kwargs에 인자로 받은 각 key-value 쌍들에 대해서, key가 'name' 일 경우 '안녕하세요 name님' 이라고 print(print(f"안녕하세요. {name}님"))하고 key가 'weather' 일 경우 '오늘 날씨는 OO입니다.' 이라고 print(print(f"오늘 날씨는 {value}입니다."))한다고 가정합니다. **kwargs는 dict 자료형이므로 if 'name' in **kwargs.keys() 와 같은 조건문으로 각 key에 따른 분기 처리를 할 수 있습니다.

 

 


17. 멀티스레딩과 멀티프로세싱의 차이점과 각각의 장단점을 설명해주세요.

 

멀티 스레딩은 하나의 프로세스 내에서 2개 이상의 스레드를 사용해 작업을 처리하는 방식입니다. 멀티 프로세스와 다르게 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원 소모가 적게, 효율적으로 관리할 수 있고 메모리의 Code, Data, Heap 영역을 공유하기 때문에 데이터 통신이 간단한 이점이 있습니다. 그러나 하나의 스레드라도 작동이 멈출 경우 프로세스 전체의 작동이 멈추고, 병목 현상으로 인한 성능 저하가 발생할 수 있습니다.

 

멀티 프로세싱은 2개 이상의 프로세스를 사용해 작업을 처리하는 방식입니다. 멀티 스레딩과 다르게 각 프로세스 당 별도의 메모리 공간을 가지므로 시스템 콜이 증가하여 자원 소모가 많아지며 프로세스 간 자원을 공유하기 위해서 복잡한 방법을 사용해야 하는데, 이를 IPC 기법이라고 합니다. 그러나 프로세스 하나의 작동이 멈춰도 다른 프로세스에 영향을 주지 않아 안정성이 높고 새로운 기능을 추가할 때 용이하기에 확장성이 더 좋습니다.

 


Python Django

 

1. 장고 외 타 프레임워크가 무엇이 있고 차이점은 무엇이 있나요?

 

 


2. 다른 웹 프레임워크와 비교했을 때 Django의 장점과 단점은 무엇이라고 생각하시나요?

꼬리 질문

 


3. Django와 Flask는 같은 파이썬 언어로 되어있지만 차이가 있습니다. 어떤 차이가 있는지 설명해주세요.

 

 


4. 장고의 ORM과 SQL 쿼리 간에 어떤 장단점이 있나요? 어떤 상황에서 각각을 사용하시나요?

 

 


5. MVT 구조에 대해서 설명해주세요.

MTV 구조는 Django에서 기존의 MVC 모델에 대응하는 구조입니다. MVC 모델이란 소프트웨어 디자인 패턴입니다. M은 Model, 데이터와 관련된 로직을 관리합니다. V는 View, 레이아웃과 관련된 화면을 처리합니다. C는 Controller, Model과 View를 연결하는 로직을 처리합니다. Django의 MTV 구조 중 M은 Model로, MVC 모델의 M과 대응합니다. T는 Template로, MVC 모델의 V에 대응합니다. V는 View로 MVC 모델의 C와 대응합니다.

 

 


6. django에서 프로젝트를 생성했을 때 어떤 파일들이 생성되며, 각 파일들의 역할이 뭔지 설명해주세요

 

 


7. 장고에서 app을 나누는 기준에 대해 본인 생각을 말씀해주세요.

 

 


8. 장고에서 app 생성시 urls.py는 생성되나요? 생성이 안된다면 왜 안되는지 본인의 생각을 말해주세요.

 

Django에서 app을 생성할 때 각 app의 urls.py 파일은 생성되지 않습니다. urls.py는 어떠한 주소로 요청이 들어왔을 때 해당 주소에 대응하는 view를 실행하게 도와주는 dispatch 역할을 합니다. Django 프로젝트는 단일 앱으로 진행하는 경우도 있을 것이므로 만약 각 앱마다 urls.py가 생성되는 방식이라면 앱의 urls.py는 불필요할 수 있습니다. 따라서 기본 설정 상 프로젝트의 urls.py만 기본 생성되고, 각 앱의 urls.py는 앱의 개수가 여러개가 되어 관리가 필요할 경우 필요에 따라 생성하는 것이 좋다고 생각합니다.

 

 


9. 장고에서 미들웨어가 무엇인지 설명해주세요.

 

 


10. 장고에서 트랜잭션을 처리하기 위한 방법이 어떤 것이 있는지, 본인 사용 경험 근거하여 설명해주세요.

 

 

 

11. FBV, CBV에 대해 각각 장단점 위주로 설명해주세요.

 

 


12. 장고로 어떤 프로젝트를 하셨고 어떤 에로사항이 었었는지 그리고 어떻게 해결 하셨나요?

 

 


13. AWS 서비스를 어떻게 사용하셨나요? (예: S3, EC2)

 

 


14. docker 이미지와 도커 컨테이너의 차이는 무엇인가요?

 

 


15. 웹어플리케이션서버와 웹서버의 차이에 대해서 설명해주세요

 

 


16. django rest framework를 사용하는 이유가 뭔가요?

 

 


17. DRF의 시리얼라이저의 역할에 대해서 설명해주세요

 

 


18. wsgi가 뭔지 설명해주세요

 

 


19. ForeignKey, OneToOneField, ManyToManyField의 차이점을 설명해주세요.

 

 


20. Django에서 쿼리셋(QuerySet)의 eager loading, lazy loading에 대해 설명해주세요.

 

 

'PYTHON' 카테고리의 다른 글

[TIL] 20240424 50일차  (0) 2024.04.24
[TIL] 20240423 49일차  (0) 2024.04.23
20240408 ~ 20240412 9주차 정리  (0) 2024.04.12
[TIL] 20240412 42일차  (0) 2024.04.12
[TIL] 20240409 40일차  (0) 2024.04.09