안녕하세요. 이번에는 Python 기초 정리 2번째를 해보도록 하겠습니다.
참고한 자료는 다음과 같습니다.
- 파이썬 자료구조와 알고리즘 (한빛미디어, 2019)
- 점프 투 파이썬
- 파이썬 코딩 도장
dojang.io/course/view.php?id=7
1. class
○ class란 사전에 정의된 특별한 데이터와 메서드의 집합을 말함
○ 객체(Object) : 클래스를 선언한 변수
ex)
a = school()라고 할 때 a는 객체가 됨
○ 인스턴스(Instance) : 위의 예시에서 a 객체는 school이라는 class의 인스턴스임
=> 객체와 인스턴스의 차이 : 설명할 때 어디에 중점을 두느냐에 따라 명칭이 달라짐
○ 생성자 : 객체가 생성될 때 자동으로 호출되는 메서드
● a = school() 할 때 생성자가 호출됨
● __new__라는 특수 메서드 호출되어 객체 할당된 후, __init__(메서드가 객체를 초기화 함)
○ 속성
● self.xxx에 해당하는 모든 변수
○ 특수화
● 슈퍼(부모) 클래스의 모든 속성을 상속하여 새 클래스를 만드는 절차
● 서브(자식) 클래스에서 상속 받은 메서드에 대해 모두 재정의 가능
● 상속 받지 않는 클래스는 object를 명시하는 것이 좋음
ex)
class Sample(object):
pass
○ 다형성
● 메서드가 서브 클래스 내에서 재정의 될 수 있다는 의미(Overriding)
● 슈퍼 클래스의 메서드 호출시, 내장된 super() 메서드 사용하여 호출 가능
○ 객체가 해시 가능 : hash() 속성을 호출할 수 있으며 불변 객체임을 의미함
○ 합성, 집합화 : 한 클래스에서 다른 클래스의 인스턴스 변수를 포함하는 것. 클래스 간의 관계를 나타냄
● 합성 : 의존성이 강함
ex) '아파트 단지'라는 class 안에 '101동', '102동' 등의 class가 있음
● 집합화 : 독립성 강함
ex) '대학생'이라는 class 안에 '경영학과', '미술학과' 등의 주전공 class가 있을 때 1번 '대학생' class에는 '경영학과', 2번 '대학생' class에는 '미술학과'가 들어가 있는 등.
=> '경영학과', '미술학과'를 동시에 포함하지 않음
2. 디자인 패턴 : 잘 설계된 구죠의 형식적 정의를 소프트웨어 엔지니어링으로 옮긴 것
○ 데커레이터 패턴
● @ 표기를 사용해 함수 또는 메서드의 변환을 지정함
● 함수의 객체, 함수를 변경하는 다른 객체의 wrapping을 허용함
□ wrapping : 호출할 함수를 함수로 감싸는 형태
ex)
def printing(function):
def wrapping():
print(function.__name__, 'start function')
function()
print(function.__name__, 'end function')
return wrapper
@printing
def hi():
print('hi')
@printing
def goodbye():
print('goodbye')
hi()
goodbye()
● @classmethod : 메서드를 클래스로 변환시킴. 클래스 내 변수에 접근시 classmethod의 첫 번째 인수 사용 가능
● @staticmethod : 메서드를 정적 메서드로 변환시킴
○ 옵저버 패턴
● 객체의 일대다 의존 관계에서 한 객체 상태가 변경되면, 그 객체에 종속된 모든 객체에 대해 자동으로 상태 갱신하는 방식
● @property로 구현
○ 싱글턴 패턴
● 초기화된 객체의 인스턴스를 전역에서 사용하려는 목적에서 사용
● 즉, 해당 인스턴스는 1개만 존재해야 함
ex) x = school(), y= school()이라면 x == y는 True로 나와야 함
● python 은 private 접근 제한이 없으므로 __new__() 클래스 메서드로 하나의 인스턴스만 생성되도록 구현해야 함
● 커넥션 풀, 스레드 풀 등의 객체인 경우 인스턴스를 여러 개 만들면 자원을 낭비하게 되므로 이를 방지하기 위해 싱글턴 패턴 활용
3. 멀티 프로세스
○ 프로세스 : 운영체제에서 실행되는 각 프로그램
● 독립적인 스택, 힙, 코드, 데이터 영역을 가짐
○ 스레드 : 프로세스 내에서 실행되는 흐름 단위. 프로세스가 할당 받은 자원을 이용하는 실행의 단위
● 한 프로세스에 여러 스레드가 있으면 여러 작업을 동시에 수행하는 것 처럼 보이게 됨
● 한 프로세스에 속한 스레드는 스택 영역을 제외한 메모리 영역을 공유함
○ 멀티 프로세스
● 여러개의 cpu를 사용해서 여러 프로세스를 동시에 수행하는 것
● 별도의 메모리 영역 가지며, 특정한 메커니즘으로만 프로세스 간 통신 가능.
● 각 스레드에 대해 별도의레지스터 집합을 불러오거나 저장함
● python : subprocess 모듈 사용
○ 멀티 스레드
● 한 프로세스를 여러 스레드로 나눠서 처리하는 방법
=> 보다 빠르게 작업 처리 가능할 수도 있음
● 단일프로세스 내의 멀티 스레드 : 동일한 메모리에 접근함
● 스레드는 데이터 공유 통해 통신 가능
● python : threading 모듈 처리 통해 한번에 한 스레드만 메모리 영역에 접근 할 수 있음
● 한 스레드는 인터프리터 락을 획득해야만 실행이 가능함.
=> python에선 이러한 인터프리터 락이 1개만 있으며 이를 GIL이라 함. 즉, GIL이 없는 나머지 스레드는 해당 자원에 접근하지 못하여 대기 상태에 놓이게 됨.
● 문제점 : 서로 다른 스레드 간 데이터, 힙 영역 등을 공유하기 때문에 수정된 자료 구조 등을 공유하여 잘못된 결과값을 만들 수도 있음
=> 코딩에 주의
○ 동시성 : 논리적으로 여러 작업이 동시에 실행되는 것처럼 보이게 함.
ex) I/O 연산 동안 다른 작업 수행
○ 병렬성 : 물리적으로 여러 작업이 동시에 처리되는 것
● 데이터 병렬성 : 같은 작업을 병렬처리 하는 것으로 하나의 큰 작업을 전체 데이터로 나눠서 병렬 처리
● 작업 병렬성 : 서로 다른 작업을 병렬처리 함. 즉, 다수의 독립적인 요청을 병렬로 개별적으로 처리함
○ subprocess 모듈
● '부모-자식' 프로세스 쌍의 생성에 사용
□ 부모 프로세스 : 차례로 다른 일을 처리하는 자식 프로세스 인스턴스 실행
□ 자식 인스턴스를 사용하여, 멀티 코어 이점 활용 및 동시성 문제를 운영체제가 알아서 처리하도록 함
● 파라미터 튜닝 때 활용 가능
○ threading 모듈
● 멀티 스레드 사용시 이용하는 모듈
● 스레드가 여러 개로 분리시, 스레드 간 데이터 공유의 복잡성 증가 주의
● 락, 데드락 회피에 주의해야 함
□ 락 : 여러 스레드를 실행하는 환경에서 자원에 대한 접근에 제한을 강제하기 위한 동기화 메커니즘. 즉, 한 스레드가 쓰는 동안 다른 스레드가 못 쓰게 하는 것
□ 데드락 : 둘 이상의 스레드가 락을 획득하기 위해 계속 기다리는 것
● 순서가 보장되지 않는 점에 주의
● 내부적으로 락을 관리시 queue 모듈 사용
=> 한 번에 하나의 스레드만 데이터에 접근 할 수 있도록 만듦
● 뮤텍스, 세마포어 등으로 스레드 통제 가능
4. 기타
○ 프로그램 성능 향상 방법
● 읽기 전용 데이터 : 리스트 대신 튜플 사용
● 반복문 : 항목 많은 리스트, 튜플 대신 제너레이터를 사용하여 순회
● 문자열 연결 시, '+' 대시니 리스트에 문자열 추가 후 마지막에 리스트 항목을 모두 하나로 연결함
=> 리스트 써서 연결
여기까지가 python 기초에 대한 정리 2였습니다. 잘못된 부분이나 궁금하신 사항 있으시면 말씀해주세요!
'Python > 기타' 카테고리의 다른 글
파이썬 기초 정리(1) (0) | 2020.10.15 |
---|