본문 바로가기
내일배움캠프

면접준비 3

by useSword 2024. 4. 25.

8. 클로저(closure)란
짧게 요약하면 동적함수 생성기

클로저를 사용하면 내부 함수에서 외부 함수의 scope에 액세스 할 수 있습니다.

어떤 함수의 내부 함수가 외부 함수의 변수(*프리변수)를 참조할 때, 외부 함수가 종료된 후에도 내부 함수가 외부 함수의 변수를 참조할 수 있도록 어딘가에 저장하는 함수

 

아래의 조건을 충족해야함

· 어떤 함수의 내부 함수일 것

· 그 내부 함수가 외부 함수의 변수를 참조할 것

· 외부 함수가 내부 함수를 리턴할 것

 

아래의 함수를 예를 들어보면 make_counter안에 변수 number의 값을 내부함수인 counter가 가져와 사용한다.

def make_counter():
    number = 0

    def counter():
        nonlocal number
        number += 1
        return number

    return counter


counter1 = make_counter()
counter2 = make_counter()


print(counter1())  # 출력: 1
print(counter1())  # 출력: 2
print(counter2())  # 출력: 1
print(counter1())  # 출력: 3

자세한 내용은 https://tibetsandfox.tistory.com/9

 



9. Generator란
for문은 쓰고 싶은데 메모리를 많이 잡아먹기 때문에 사용하고 싶음
yield라는 반복자(이터레이터)를 사용함으로 for문과의 차이를 알 수 있음.
 


10. 데코레이터란  (고차함수?)

데코레이터는 어떤 함수를 인자로 받아 꾸며준 후 다시 함수로 리턴하는 함수입니다
함수의 내부를 수정하지 않고 기능에 변화를 주고 싶을 때 주로 사용합니다(확장 느낌)

단, 데코레이터는 꾸며주는 함수의 내부에 직접적인 수정이나 로직 변환을 가할 순 없습니다.

 

ex)

def decorator(func):
    def sentence(name):
        print("Nice to meet you")
        func()
        print(f"My name is {name}")
        return

    return sentence


@decorator
def say_hello():
    print("Hello")


say_hello("Fox")

#실행 결과
Nice to meet you
Hello
My name is Fox

 

ex) 클래스 형식 데코레이터

 

class Decorator:
    def __init__(self, func):  # 꾸며줄 함수를 매개변수로 전달
        self.func = func       # 꾸며줄 함수를 속성에 저장

    def __call__(self, *args, **kwargs):
        print("Nice to meet you")
        self.func()            #속성에 저장된 함수 호출
        print(f"My name is {args[0]}")


@Decorator
def say_hello():
    print("Hello")


say_hello("Fox")

#실행 결과
Nice to meet you
Hello
My name is Fox


11. 파이썬의 메모리 관리 방식

파이썬에 존재하는 모든 것은 객체임.
파이썬은 이러한 객체들에 대해 참조 횟수(Reference count)를 저장함.
참조 횟수는 각 객체들이 참조되는 횟수를 나타내고 참조 여부에 따라 알아서 증감함
참조 횟수가 0이 된다면 파이썬의 GC(Garbage Collector)가 그 객체를 메모리에서 삭제함.

12. 파이썬에서 일급객체가 무엇?

'일급' 이란 뜻은 일급 시민 처럼 무슨 혜택을 받는 다는 뜻이 아니라, 

사용할 때 다른 요소들과 아무런 차별이 없다는 것을 뜻

 

처음에 이해했을 때는 일급 객체가 다른 객체보다 혜택이 있는 줄 알았다.

 

두번째에는 일급 객체는 일반적인 객체라는 걸 알게 되었고

그러면 파이썬에서 일급 객체가 아닌 것이 무엇인지 알고 싶었다

 

세번째에서는 파이썬은 일급객체 언어이고 c,c++ 같은 언어들에서 일급객체가 아닌 객체를 찾을 수 있다는 걸 알았다.

c같은 경우 함수포인터를 사용해서 일급객체의 조건인 리턴 값으로 사용과 매개변수로 전달을 할 수 있다고 한다.

 

일급 객체는 OOP에서 사용되는 개념 중 하나로 아래의 조건을 만족하는 객체를 의미합니다.

1. 변수 혹은 데이터 구조(자료구조) 안에 담을 수 있어야 한다.

2. 매개변수로 전달할 수 있어야 한다.

3. 리턴값으로 사용될 수 있어야 한다.



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

데이터와 이 데이터를 처리하는 함수들을 하나의 "객체"로 묶어서 프로그래밍 하는 기법

체계적이고 모듈화된 개발을 가능하게 함

 

캡슐화, 상속성, 다형성, 추상화 4가지의 원칙을 가지고 있음.

 


14. 절차지향 프로그래밍, 함수형 프로그래밍, 객체지향프로그래밍의 차이점이 무엇

명령형 프로그래밍: 무엇(What)을 할 것인지 나타내기보다 어떻게(How) 할 건지를 설명하는 방식
  절차지향 프로그래밍: 수행되어야 할 순차적인 처리 과정을 포함하는 방식
  객체지향 프로그래밍: 객체들의 집합으로 프로그램의 상호작용을 표현
  
선언형 프로그래밍: 어떻게 할건지(How)를 나타내기보다 무엇(What)을 할 건지를 설명하는 방식
  함수형 프로그래밍: 순수 함수를 조합하고 소프트웨어를 만드는 방식 (클로저, 하스켈, 리스프)

 

 

 

절차지향 프로그래밍 : 절차지향 프로그래밍은 일련의 절차를 차례로 실행하는 구조

 

def calculate_total(scores):
    return sum(scores)

def calculate_average(scores):
    total = calculate_total(scores)
    return total / len(scores)

scores = [90, 80, 70]
total = calculate_total(scores)
average = calculate_average(scores)
print(f"Total: {total}, Average: {average:.2f}")

 

장점:

코드의 흐름을 쉽게 이해할 수 있습니다.
작은 프로그램에서는 구현이 간단하고 직관적입니다.
단점:

코드가 길어지면 관리가 어려워집니다.
함수 간의 데이터 공유가 전역 변수를 통해 이루어지면 사이드 이펙트를 유발할 수 있습니다.

 

 

함수형 프로그래밍
함수형 프로그래밍은 데이터의 불변성과 순수 함수를 중요시합니다.

 

장점:

  • 예측 가능성과 투명성: 프로그램의 동작이 입력에만 의존하기 때문에 이해하고 예측하기 쉽습니다.
  • 병렬 처리 용이성: 데이터 불변성으로 인해 다중 스레드 환경에서 안전하게 데이터를 처리할 수 있습니다.
  • 재사용성 및 모듈성: 고차 함수와 순수 함수를 활용하여 코드를 재사용하고 모듈화할 수 있습니다.


단점:

  • 성능 문제: 일부 경우에 재귀의 깊이가 깊어지면 성능 저하를 유발할 수 있습니다.
  • 학습 곡선: 함수형 프로그래밍의 개념은 전통적인 절차지향적 사고와 다르기 때문에 배우기가 어려울 수 있습니다.
  • 자원 사용: 불변 객체를 지속적으로 생성하고 제거하는 것은 메모리 사용량이 증가할 수 있습니다.




 

객체지향 프로그래밍
객체지향 프로그래밍은 데이터와 함수를 객체로 캡슐화합니다. 파이썬에서는 클래스를 정의하여 객체지향 프로그래밍을 수행합니다.

class Student:
    def __init__(self, scores):
        self.scores = scores

    def calculate_total(self):
        return sum(self.scores)

    def calculate_average(self):
        return self.calculate_total() / len(self.scores)

student = Student([90, 80, 70])
total = student.calculate_total()
average = student.calculate_average()
print(f"Total: {total}, Average: {average:.2f}")

장점:

데이터와 기능의 캡슐화로 코드의 재사용성이 높습니다.
큰 프로젝트에서 코드 관리가 용이합니다.
단점:

설계 초기에 많은 계획과 설계가 필요합니다.
때로는 시스템이 과도하게 복잡해질 수 있습니다.

 

 

 


15. list comprehension이란? 사용시 장단점을 본인 사용경험에 근거하여 설명
list comprehension은 리스트를 쉽게, 짧게 한 줄로 만들 수 있는 파이썬의 문법입니다.
list comprehension의 필요성을 느낀점은 코딩 테스트문제를 공부하다가 다른 사람의 코드를 보는데
짧은 list comprehension은 느낌상 이해가 되었지만 조건문이 3개가 넘어가면서부터 이해하기가 어렵다는걸 느꼈고
강의에서 "["부터 작성하는 것이 아닌 조건문부터 작성하여 완성하는 것을 보고 어떻게 작성해야하는지를 알게 되었습니다.



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

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

17. python의 GIL(Global Interpreter Lock)이란 무엇이고, 어떤 문제를 발생?


파이썬에서는 변수의 참조 횟수가 0이 된다면 파이썬의 GC(Garbage Collector)가 그 객체를 메모리에서 삭제함.
여러 스레드에서 동시에 한 객체에 접근하면 그 객체의 참조 횟수에 대해
race condition(하나의 자원을 동시에 사용하게 될 때 기대하지 않은 결과 발생)이 발생하게 되고 GC의 부적절한 행동을 야기함
이 때문에 GIL을 통해 한 스레드만 자원에 접근하게 만듬.
하나의 스레드에 모든 자원을 허락하고 나머지 스레드에 락을 걸어 다른 스레드가 실행되지 않도록 
막아버리는 기능 때문에 병렬로 작동하지 않아 느림.


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

mutable은 값이 변한다는 뜻이고, immutable은 값이 변하지 않는다는 의미
immutable의 예시로 number, string,tuple 
mutable의 예시로는 list,dictionary
이 속성에 따라 변수가 함수의 매개변수로 전달될 때 원래 입력 변수값이 변경되는지 안되는지 결정된다.


19. *args와 **kwargs의 용도와 사용 예제를 설명

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




'내일배움캠프' 카테고리의 다른 글

면접준비 2  (0) 2024.04.24
캠프 면접 문제 준비  (0) 2024.04.23