Home CS 간단 질의 정리
Post
Cancel

CS 간단 질의 정리

관련 링크

  1. [eagle5424.log] 면접 질문 정리 - 백엔드

프로그래밍 언어

기계어 vs 어셈블리어

  • 기계어: 이진법으로 이루어진 언어
  • 어셈블리어: 기계어 대신 의미있는 언어로 만들어 사용한 언어

고급언어 vs 저급언어

  • 저급언어: 기계어와 유사한 언어
  • 고급언어: 실제 언어와 유사해 사람들이 이해하기 쉬운 언어

컴파일러 vs 인터프리터

  • 컴파일러: 작성한 소스 코드 전체를 기계어로 번역한 뒤, 이 번역된 코드를 한 번에 실행하는 두 단계를 거쳐 진행
    • 컴파일 자체에 대부분 시간 소요
      • 어떤 코드에서 컴파일이 3시간 걸렸다고 했을 때, 번수 이름에 오타가 나서 에러가 발생 한다면 다시 컴파일을 수행
    • 이미 컴파일이 된 프로그램이라면, 매우 빠른 속도로 실행 가능
    • 낮은 운영체제(OS) 이식성
      • OS마다 실행할 수 있는 기계어에 차이
      • 해당 OS에 맞는 컴파일 요구
    • Ex. C, C++, Go, JAVA(Java Compiler, JVM) 등
  • 인터프리터: 컴파일러와 같이 번역 기능을 하지만, 컴파일러와 달리 Line-by-Line으로 명령을 처리
    • 실행 속도 저하(Line-by-Line 번역)
    • 디버깅에 용이
    • Ex. Python, Javascript, R, JAVA(JAVA Interpreter) 등

메모리 관리

  • 메모리를 직접 관리할 때 생기는 문제점
    • 필요없는 메모리를 비워주지 않으면, 메모리 누수가 이어져 치명적인 문제 발생
    • 사용 중인 메모리를 비워버리면, 프로그램이 중단되어 일부 데이터가 손상

Garbage Collector(GC)

  • JAVA, Python 등의 모던한 언어에 필수적으로 탑재
  • Python의 경우, GC를 통해 비사용되는 메모리에 대해서 힙 공간을 관리

Reference Counting

  • 객체를 만들 때 마다 해당 객체가 사용이 되고 있는지를 Counting

call by value, call by reference

  • call by value
    • 함수의 인자를 받을 때, 변수에 담긴 값 자체를 stack에다가 복사하여 저장
      • 원본을 건드리지 않아 안전
      • 함수의 사용으로 해당 전역 변수를 바꾸고 싶을 때, 리턴 값을 다시 전역 변수로 집어넣어야 하는 비용 발생
  • call by reference
    • 함수의 인자를 받을 때, 변수가 가리키는 주소 값을 전달 한다.
      • 인자를 조작하면 원본 변수의 주소 값으로 타고 들어가 해당 값 자체를 변경

클래스

객체를 만들기 위한 청사진

추상화

복잡한 내용을 숨기고 주요 기능만 보여주는 것으로, 프로그래밍 언어에서는 변수, 함수, 객체 따위를 추상화

Python

Python 장점

  • 쉽고 간결하므로, 빠른 개발이 가능
  • 빠른 배포로 시장의 피드백이 활성화
  • 오픈소스 언어이므로 많은 모듈 등이 존재

Python 단점

  • 인터프리터 언어로써 속도 저하

Python 메모리 관리

  • Python의 경우, 개별의 힙을 사용해서 메모리를 유지
    • 힙은 모든 파이썬 객체와 자료구조를 보유
    • 인터프리터만 접근 가능
  • Python 내장 메모리 관리 방법
    • Garbage Collector, Reference Counting

GIL(Global Interpreter Lock)

  • GIL: 파이썬 객체가 다중 스레드에 동시에 실행되지 않도록 하는 일종의 Mutex
  • 멀티 스레드 프로그램에서 레퍼런스 카운팅에 의해 발생할 수 있는 문제를 미리 예방
    • 레퍼런스 카운팅 변수가 멀티 스레드 환경에서 두 스레드가 동시에 값을 늘리거나 줄이는 Race Condition이 발생 가능
    • 메모리 누수가 발생하거나 객체에 대한 참조가 남아있는 데도 메모리를 해제 가능
  • 메모리 안전성을 보장하기 위한 디자인

자료구조

List

  • 배열로 구성
  • 내부적으로 다른 객체를 참조하기 위한 연속적인 배열
  • 배열 변수에 대한 포인터와 그 길이를 목록 헤드 구조에 미리 저장
  • C의 Linked list는 다른 구조
    • 실제 배열과 다르게 길이가 고정되어 있지 않아 데이터의 추가/삭제가 용이
    • 파이썬이 리스트에서 실제 필요한 메모리 보다 조금 더 여유 있게 메모리를 마련

Tuple

  • Collection 데이터 타입의 하나로 immutable한 자료형
  • 리스트와 비슷한 구조를 갖지만 수정이 불가

    List vs Tuple

  • List는 Mutable(Variable)한 객체로, 내부 수정이 가능
  • Tuple은 Immutable(Const)한 객체로, 내부 수정이 불가

Set

  • 집합으로, 순서가 없고 유니크한 원소만을 보유

Dictionary

  • Key와 Value 구조로 이루어진 자료구조
  • 해쉬, 맵, 해쉬맵 등으로도 명명

lambda vs def

  • def
    • 다중 표현 가능
    • 이름을 지정
    • 선언 가능
  • lambda
    • 단일 함수
    • 이름이 없으며, 함수 객체를 구성하고 반환
    • 선언 불가

Docstring

  • 파이썬의 모듈, 함수, 클래스, 매소드의 정의에 처음 부분에 선언되는 유니크한 텍스트
  • Reference 설명서로써 주로 활용

Function call / A Callable Object

  • Callable: __call__ 메서드가 있는 클래스 인스턴스거나, 호출 가능한 메서드/함수

Call by Assignment/Object-reference

  • Python은 모든 것을 객체로 판단
  • global인지, local인지 영역에 따라 변수들의 정보를 저장하는 namespace가 따로 존재
    • 즉, 전역변수를 함수에서 인자로 받아오더라도 함수 내에서는 지역변수(이름표)에 불과

Decorater

  • 선행적으로 실행이 되어야하는 함수가 반복적으로 사용되어야할 때 사용
  • 함수를 수정하지 않고도 유연하게 함수에 특정 동작을 추가하거나 작동 방식 변경 가능
  • 일반적으로 함수의 전처리나 후 처리에 대한 필요가 있을 때 사용
  • 데코레이터를 사용하며, 반복을 사용하여 메소드를 확장
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def trace(func):                           
    def wrapper():
        print(func.__name__, '함수 시작')  
        func()                             
        print(func.__name__, '함수 끝')
    return wrapper


@trace    # @decorator
def hello():
    print('hello')
 
@trace    # @decorator
def world():
    print('world')
 
hello()    # 함수를 그대로 호출
world()    # 함수를 그대로 호출

# 실행 결과
# ---------------
## hello 함수 시작
## hello
## hello 함수 끝
## world 함수 시작
## world
## world 함수 끝
# ---------------

args, kwargs

  • *args: 추가로 입력되는 매개변수를 List로 전달하며, args(arguments)로 약속된 네이밍을 사용
  • **kwargs: 추가로 입력되는 매개변수를 Key:value 형태(Dictionary)로 전달하며, kwargs(Keyword arguments)로 약속된 네이밍을 사용

main Method

  • 파이썬은 인터프리터 언어이기 때문에 일반적으로는 code by code로 실행
  • __name____main__일 때 main 메소드와 같이 활용 가능

클래스 Attribute

  • 클래스 속성
    • 메서드 단계와 동일한 영역에 위차한 변수
    • 모든 클래스에게 동일하게 영향
  • 인스턴스 속성
    • self를 통해 할당된 인스턴스만의 변수

Errors vs Exceptions

  • Errors: 코딩 이슈로서 프로그램이 비정상적으로 종료
  • Exceptions: 외부적인 이벤트로 인해 발생하는 것 (ex. 인터럽트)

Iterators

값을 차례대로 꺼낼 수 있는 객체로, next()로 다음 구성 성분으로 이동

Iterable

Iterable: value를 하나씩 차례로 반환 가능한 object (ex. list, str, tuple …)

  • 리스트, 튜플, 딕셔너리 및 세트와 같은 컬렉션 유형은 모두 반복 가능한 객체인 반면 순회하는 동안 iterator를 반환하는 반복 가능한 컨테이너
  • list는 iterable(하나로 차례로 반환 가능한 object)이지만 iterator는 아닌 관계

Generator

Iterator를 생성해주는 Function

  • yield를 사용하여 값을 반환
  • Memory 효율성 증대
    • list의 경우, 모든 데이터를 메모리에 적재하지만, generator의 경우 데이터 값을 next() 메소드를 통해 차례대로 값에 접근하여 메모리에 적재

Yield

함수를 해당 상태에서 정지시켜 next()를 호출한 쪽으로 전달

  • 함수에서 사용한 local 변수나 instruction pointer 등과 같은 함수 내부에서 사용된 데이터들이 메모리에 그대로 유지

Enumerate

Iterator와 함께 사용하여 iterators의 index를 추출 가능

globals()

global로 정의된 변수들을 딕셔너리 테이블처럼 반환

Cpython

C와 python으로 작성된 Python의 가장 기본적인 구현체

  • 인터프리터 과정 이전에 파이썬 코드를 바이트 코드로 컴파일

pypy

유연함과 쉬운 실험을 위해 파이썬 프로그래밍 언어 자체로 작성된 파이썬 구현체

  • 최적화된 PyPy의 파이썬 구현이 현재의 C구현보다 빠르도록 개선하는 것이 목표

Operating system

커널(Kernel)

컴퓨터의 핵심이 되는 컴퓨터 프로그램의 하나로, 시스템의 모든 것을 완전히 통제

  • 운영체제의 다른 부분 및 응용 프로그램 수행에 필요한 여러가지 서비스를 제공

프로그램

파일이 저장 장치에 저장되어 있지만 메모리에 올라가 있지 않은 상태(실행되지 않은 파일)

프로세스

프로그램이 실행되어 동적으로 상태로 메모리에 프로그램을 할당 해준 것

  • 시간이 흐를수록 프로세스가 복잡해지면서 프로세스 하나만을 사용해서 프로그램을 실행에 부담
  • 운영체제는 안전성을 위해 프로세스마다 자신에게 할당된 메모리 내의 정보만 접근

스레드

프로세스의 코드에 정의된 절차에 따라 실행되는 특정한 수행 경로

  • 멀티스레드가 용이한 이유: 멀티태스킹에 비해 기본 구조 자체가 메모리를 공유하는 구조이므로 정보 공유에 용이

프로세스 vs 스레드

  • 프로세스
    • 운영체제로 부터 자원을 할당받은 작업의 단위
    • 운영체제로부터 stack, heap, data, code 메모리 영역을 할당
  • 스레드
    • 프로세스 안에 포함되어, 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위
    • 프로세스의 stack 영역을 제외한 메모리 영역을 다른 스레드와 공유

멀티 프로세스 대신 멀티 스레드를 사용하는 이유

  • 멀티프로세스
    • 기본적으로 프로세스는 서로 간의 접근 불가
    • IPC, LPC를 사용하면 접근 가능해서 사용 가능하지만 이런 멀티프로세스를 사용하기 위해 이런 번거로운 행위
  • 멀티 스레드
    • 원래 서로 접근이 가능한 스레드로 멀티 스레드를 사용하는 것이 더욱 효율적
    • 운영체제의 가장 작은단위가 프로세스이기 때문에 스레드의 동기화가 일어나게 될 경우 프로그래머가 처리를 해줘야 한다.

Mutex vs Semaphore

  • Mutex: 동기화 대상이 하나일 때 사용하며, 프로세스 범위를 가져 프로세스가 종료될 때 자동으로 해제
  • Semaphore: 동기화 대상이 하나 이상일 때 사용하며, 시스템 범위에 걸쳐있어 파일 시스템 상의 파일 형태로 존재

스케쥴링

다중 프로그래밍을 가능하게 하는 운영체제의 동작 기법

  • CPU 등의 자원에 프로세스를 적절히 배정
  • ex. Round Robin

가상 메모리

한정된 크기의 메모리 내에서 최대한 많은 프로세스를 할당하여 효율적으로 사용하기 위해 만든 기술

##

Network

This post is licensed under CC BY 4.0 by the author.