TIL 240417

hyeo71·2024년 4월 17일
0

2024 내배캠 AI 트랙

목록 보기
76/108

Python

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

    • 동적 타입언어로 변수의 자료형을 지정하지 않고 선언해서 사용할 수 있다. 변수의 자료형은 실행되는 시점에서 결정된다.
    • 문법이 쉬워서 사용하기 쉽다. 이는 생산성이 높다고도 할 수 있다.

    단점

    • 느리다. 이유는 2번

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

    • 파이썬은 스크립트 언어로 컴파일 과정없이 인터프리터에 의해 실행 되는데 이는 코드 전체를 컴파일하고 실행하는 것이 아닌 명령어를 한 줄마다 실행과정에서 컴파일링과 실행이 동시에 일어나서 컴파일 언어에 비해 느리지만 작성된 부분까지만 테스트할 수 있고 대화형 기능을 통해 코드의 수정을 빠르게 할 수 있습니다.

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

    • 프로젝트를 위한 격리된 환경 : 프로젝트마다 필요한 패키지, 모듈이 있고 그 버전이 있는데 가상환경을 쓰지 않으면 전역 환경에서 설치한 패키지 버전을 모든 프로젝트에서 사용해야 하고 특정 버전을 사용해야하는 프로젝트는 진행할 수 없는 상황이 생길 수 있다.

  1. 환경변수란 무엇인지 설명해주세요.
    • 프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는, 동적인 값들의 모임으로 쉽게 말하자면 운영체제가 참조하는 변수라고 할 수 있습니다. 가장 익숙한 환경변수로는 path가 있는데, path는 프로그램을 찾는 기본 경로로 python, pip 등의 명령어를 실행할 때 프로그램이 저장된 경로를 확인하여 실행합니다. 터미널에서 실행시 해당 명령어를 찾지 못한다는 문구가 뜬다면 해당 프로그램의 path를 확인해 보는 것도 좋습니다.

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

    • 매개변수: 함수 내에서 포함되는 특성을 가진 것
    • 인자: 함수에 전달하는 값

  1. 인터프리터와 컴파일러에 대해서 설명해주세요. (장단점을 비교해주세요)

    • 컴파일러: 프로그램 전체를 스캔하여 이를 기계어로 번역, 전체를 스캔하기 때문에 초기 스캔 시간이 오래 걸린다. 초기 스캔을 마치면 실행파일을 만들어 다음에 실행할 때 이전에 만든 실행파일을 실행하기 때문에 전체 실행시간은 인터프리터보다 빠르다. 고급언어를 기계어로 번역하는 과정에서 오프젝트 코드를 만들고 이를 실행파일로 만드는 링킹이라는 작업을 하기 때문에 인터프리터보다 많은 메모리를 사용, 전체 코드를 검사한 후에 오류 메시지를 생성하기 때문에 실행전에 오류를 발견할 수 있다

    • 인터프리터: 한 문장씩 번역하여 실행시키는 과정을 반복하기 때문에 컴파일러보다 느리다. 오브젝트 코드, 링킹의 과정이 없기 때문에 메모리 효율이 좋다. 중간에 오류를 발견하면 프로그램을 중지하기 때문에 프로그램을 실행해봐야 오류 발견이 가능하다.


  1. 정적 타입과 동적 타입의 차이에 대해서 설명해주세요. (장단점을 비교해주세요)

    • 정적 타입: 자료형이 고정된 언어, 자료형을 컴파일 시에 결정, 소스코드 상에 자료형을 지정, 컴파일 시 타입에 대한 정보를 결정하기 때문에 속도가 빠르고 타입 에러로 인한 문제점을 초기에 발견할 수 있어 안정성이 올라간다.

    • 동적 타입: 자료형이 동적으로 변하는 언어, 자료형을 실행될 때 결정, 타입을 덜 신경써도 되므로 간단한 프로그램을 만들 때 개발 속도 면에서 빠르다, python은 동적타입의 강타입 언어(자료형이 맞지 않으면 에러, 암묵적 변환을 지원하지 않음), JS는 동적타입의 약타입 언어(자료형이 맞지 않으면 암묵적으로 타입을 변환, 1+"1" = "11")


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

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

    • 어떤 함수의 내부 함수일 것
    • 내부 함수가 외부 함수의 변수를 참조할 것
    • 외부 함수가 내부 함수를 반환할 것

    • 장점 : 무분별한 전역함수의 남용 방지, 전역변수를 사용하면 변수가 섞이거나 변수의 책임 범위를 명확하게 할 수 없는 문제가 발생하지만 클로저를 사용하면 각 스코프에서 고유한 용도로 이용되기 때문에 책임 범위가 명확해진다.

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

    • 발전기라는 의미를 가지며 호출할 때마다 yeild가 작동되 값을 순차적으로 산출, yield가 사용되면 그 함수는 generator가 되고 generator는 iterator(순서대로 다음 값을 리턴할 수 있는 객체)를 생성해주는 함수, iterator는 iter, next 등 메서들르 구현해야 하지만 generator는 yield를 사용하면 손쉽게 생성할 수 있다.

    • generator로 iterator를 생성하지 않으면 선언과 동시에 메모리를 소모하지만 generator는 순서를 기억한 객체가 생성되고 호출 전까지 메모리를 사용하지 않기 때문에 메모리 효율이 높다.(이를 지연 평가 방식이라 한다.)

    • yield는 왼쪽 변수에 할당하여 함수 외부에서 값을 전달 받을 수 있다.(양방향 통신이 가능, 왼쪽에 할당, 오른쪽은 산출)


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

    • 대상 함수를 wrapping하고 대상 함수의 앞뒤에 추가적으로 꾸며질 구문들을 정의해서 손쉽게 재사용 가능하게 해주는 것

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

    • 레퍼런스 카운팅은 파이썬에서 생성된 객체가 객체를 가리키는 참조의 수를 추적하는 참조 카운트 변수를 가진다는 것

    • 레퍼런스 카운팅 변수가 멀티 스레드 환경에서 두 스레드가 동시에 값을 늘리거나 줄이는 Race Condition이 발생할 수 있다는 것이다. 이러한 상황이 발생하면 메모리 누수가 발생하거나 객체에 대한 참조가 남아있는 데도 메모리를 잘못 해제할 수 있다.

    Race Condition
    두 개 이상의 프로세스가 공통 자원을 병행적으로(concurrently) 읽거나 쓰는 동작을 할 때, 공용 데이터에 대한 접근이 어떤 순서에 따라 이루어졌는지에 따라 그 실행 결과가 같지 않고 달라지는 상황
    두 개의 스레드가 하나의 자원을 놓고 서로 사용하려고 경쟁하는 상황

    • GIL은 그래서 멀티 스레드 프로그램에서 이러한 레퍼런스 카운팅에 의해 발생할 수 있는 문제를 미리 예방하고자 한다.
    • 일종의 메모리 안전성을 보장하기 위한 디자인 선택이라고 볼 수 있다.

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

    • 아래 조건을 만족하는 객체

    • 변수 혹은 자료구조 안에 담을 수 있어야 한다.
    • 매개변수로 전달할 수 있어야 한다.
    • 리턴값으로 사용될 수 있어야 한다.
    • 모든 일급 객체는 비교 연산을 적용할 수 있다.

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

    • 모든 데이터를 객체로 취급하고 연관된 함수, 변수를 객체로 그룹핑, 처리 요청을 받았을 때 객체 내부의 기능을 사용해 처리하는 방식의 프로그래밍 방법

    • 추상화 : 공통적인 속성, 기능을 추출하여 정의하는 것
    • 캡슐화 : 외부에서 알 필요가 없거나 숨겨야하는 부분을 감춤으로써 대상을 캡슐 형태로 단순화 하는 것
    • 상속 : 상위클래스의 속성과 기능을 가져와 하위 클래스에서 재사용하는 것
    • 다형성 : 하나의 객체에 여러 타입을 대입할 수 있는 성질(오버로딩, 오버라이딩)

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

    • 절차지향 : 일이 진행되는 순서대로 프로그래밍 하는 방법
    • 장점 : 가독성이 좋고 컴퓨터의 처리구조와 비슷해서 속도가 빠름
    • 단점 : 순서에 민감해서 유지보수, 분석이 어려움

    • 함수형 : 순수 함수(동일한 입력값을 넣었을 때 항상 동일한 리턴값을 반환하여 외부에 영향을 받지 않는 함수, 비상태 불변성 유지(전달된 데이터를 변경하지 않고 새로운 버전, 새로운 오브젝트를 만들어서 리턴))를 사용해, 상태를 제어하는 것보다 빨리 처리하는데 초점을 둔 방법, 실행 순서를 저장할 필요가 없어 비절차형 언어라고도 한다.
    • 장점 : 객체지향에 비해 코드 이해도와 가독성이 좋음, 테스트가 쉬움
    • 단점 : 외부, 내부 데이터의 상태를 조작할 수 없음

    • 객체지향 : 13번에 있음
    • 장점 : 코드의 재사용, 확장, 유지보수, 분석과 설계의 전환이 쉬움
    • 단점 : 처리속도가 상대적으로 느림, 설계에 시간이 걸림

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

    • 반복되거나 특정 조건을 만족하는 리스트를 만들 수 있는 방법

    • 익숙해지면 반복문, 조건문을 한 줄로 편하게 만들 수 있다.

    • 익숙하지 않다면 가독성이 떨어지고 코드를 이해하는데 시간이 걸린다.


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

  1. Python의 GIL(Global Interpreter Lock)이란 무엇이고, 어떤 문제를 발생시키나요?

    • GIL은 Global Interpreter Lock의 약어로, 여러 개의 스레드가 파이썬 바이트코드를 한번에 하나만 사용할 수 있게 락을 거는 것을 의미한다. 쉽게 말해서 하나의 스레드만 파이썬 인터프리터를 제어할 수 있도록 하는 뮤텍스

      뮤텍스

      • 공유된 자원의 데이터를 여러 스레드가 접근하는 것을 막는 방법
      • Critical Section(각 프로세스에서 공유 데이터를 엑세스하는 프로그램 코드 부분)을 가진 쓰레드들의 Running time이 서로 겹치지 않게 각각 단독으로 실행되게 하는 기술
      • 다중 프로세스들이 공유 리소스에 대한 접근을 조율하기 위해 locking과 unloking을 사용하는데, 다시 말해서 상호배제를 함으로써 두 쓰레드가 동시에 사용할 수 없다는 뜻
    • 파이썬 프로그램은 특정 시점에 오직 하나의 스레드만 실행된다

    • 파이썬 멀티 스레드 프로그램에서 멀티 스레드가 싱글 스레드처럼 동작하는 성능병목 현상을 발견할 수 있다.

    • 따라서 동시다발적인 멀티스레드를 처리하거나 CPU에 집중된 많은 스레드를 처리하는 데 적합하지 않다


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

    • mutable
      생성 후에 그 내용이 변경될 수 있는 자료형, list, dictionary

    • immutable
      한번 생성되면 그 상태가 변경될 수 없는 자료형, 값을 변경하려 시도할 경우 새로운 객체가 생성
      integer, string, tuple


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

    • args: 함수에 임의의 개수의 positinal argument를 전달할 때 사용
      def my_function(*args)
      argument들을 튜플로 받아 처리할 수 있습니다.

    • kwargs: 함수에 임의의 개수의 keyword argument를 전달할 때 사용
      def my_function(**kwargs)
      keyword argument들을 딕셔너리로 받아 처리할 수 있습니다.


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

    • 멀티스레딩
      가볍지만 GIL로 인해 계산 처리를 하는 작업은 한번에 하나의 쓰레드에서만 작동하여 cpu 작업이 적고 I/O 작업이 많은 병렬 처리 프로그램에서 효과를 볼 수 있다.

    • 멀티프로세싱
      각자가 고유한 메모리 영역을 가지기 때문에 더 많은 메모리를 필요로 하지만, 각각 프로세스에서 병렬로 cpu 작업을 할 수 있고 이를 이용해 여러 머신에서 동작하는 분산 처리 프로그래밍도 구현할 수 있다.

0개의 댓글