본문 바로가기

Studying/Python

(25)
9. logging(로깅) - (1) python을 공부하면서 생소한 logging에 대한 개념이 등장했다. 얼핏 봤을 땐, 'print문을 대체하는 방법인가?' 라고 생각을 했지만 구글링을 하면 할수록, 더 많은 내용을 담고 있다는 것을 알았고 제대로 공부하면 좋겠다고 생각했다. 그렇다면 logging에 대해 공부해보자. 우리는 보통 코드를 작성할 때, 어느 부분에서 오류가 발생했는지 확인하기 위해 알림 또는 책갈피를 작성하곤한다. 이를 logging(로깅)이라 한다. 로깅은 현재 프로그램이 어떤 상태를 가지고 있는지 외부출력을 하게 만들어서 개발자가 눈으로 직접 확인하는 것이다. 보통 우리는 아래와 같이 print 문을 통해 콘솔로 출력하는 방식을 편하게 사용한다. 예) print("get method called.") print("여기..
8. descriptor(디스크립터) descriptor (디스크립터)란 파이썬 핵심 기능 중에 하나로, __get__, __set__, 또는 __delete__ 메소드 중 한 개 이상으로 구현되어 있는 객체를 말한다. 이렇게 구현된 디스크립터는 다른 객체의 속성으로 정의할 수 있으며, 그 속성에 대한 읽기, 쓰기, 삭제 연산을 할 때 동작에 따라 각각 구현된 메소드가 호출이 된다. 즉, 일반적인 상황에서는 속성 B를 찾를 찾기 위해 A의 namespace를 일일이 조회를 한다고 할 때, 디스크립터를 사용하면, A.B로 조회가 가능하다는 것이다. 이전에 배웠던, getter, setter를 high 레벨에서 사용한다면, 디스크립터는 보다 low 레벨에서 사용한다. 이렇게 low 레벨에서 사용할 수 있다면, 원하는 타이밍에 내 의도에 맞는 로..
7. meta class(메타 클래스) 우리가 pyhton에서 늘상 사용하는 instance(인스턴스)와 object(객체)에 대해 이야기해보자. 우리가 객체 지향 언어를 배울 떄, 일반적으로 클래스 즉, 붕어빵 틀에서 실체인 붕어빵이 생성된다고 배우곤 한다. 보통 그 붕어빵을 객체 또는 인스턴스라고 한다. 그렇다면 그 둘의 차이는 무엇일까? 위 예시를 보면, exampleA 클래스가 정의되었고, 이를 obj1이라는 변수(객체)에 할당한 것을 알 수 있다. 이는 obj1은 객체이고, 클래스(examplA)를 변수(obj1)에 인스턴스화 했다는 것을 의미한다. 즉, 인스턴스라는 말은 특정 객체가 어떤 클래스의 객체인지를 관계 위주로 설명할 때 사용한다. 여기서 변수 obj1, 즉 객체는 다른 변수에 할당할 수도, 복사할 수도, 새로운 속성을 추..
6. method overriding, method overloading(메소드 오버라이딩, 메소드 오버로딩) 1. method overriding(메소드 오버라이딩) method overriding(메소드 오버라이딩)은 상위 클래스(부모 클래스, 슈퍼 클래스)를 상속받는 하위 클래스(자식 클래스, 서브 클래스)에서 재정의하여 사용하는 것을 의미힌다. 부모 클래스의 메소드를 추상화, 재정의할 수 있고, 확장, 또는 다양한 방식으로 동작하도록 변주를 줘 구조적 접근이 가능하다. 쉽게 말하면, 상속받은 부모 클래스의 원래 기능을 유지하면서 자식 클래스에 새로운 기능을 덧붙일 때 사용한다. method overriding 을 활용하면 가독성 증가, 오류 가능성 감소, 메소드 이름 절약, 유지 보수성 증가 등의 장점이 있다. method overriding 의 기본적인 방식은 아래와 같다. 자식 클래스인 c1에서 부모 ..
5. getter, setter, property 앞선 글에서 이야기 했듯이, python에서의 private 변수는 강제로 변수를 클래스 이름까지 작성해가면서 수정하지 않는 한, 접근할 수 없다. 이 떄, 간편한 방법으로 나온 것이 get, set 메소드(getter, setter)를 활용하는 방법이다. 위처럼 get, set 메소드를 활용하면, "_example__y" 처럼 직접 작성하지는 않지만, 이 역시도 지양하는 방법이다. 어쨌든, 직접 인스턴스를 만들어 set 메소드를 통해 직접 지정해야하고, 수정하고 싶은 private 변수마다 get, set를 다 작성해야하므로 코드의 양이 방대하게 늘어나 가독성이 떨어질 수 있다. 이보다 더 간결하고, 가독성 높은 방법이 property 데코레이터를 사용하는 것이다. getter, setter, dele..
4. 접근 지정자(Access Modifier) 접근 지정자는 클래스 내의 속성에 접근을 제한하는 역할을 한다. java에서는 public, protected, default, private 이렇게 4개의 접근 지정자가 존재하지만, python은 속성과 메소드가 전부 public 이기 때문에 속성을 숨길 방법이 없고, 변수 앞에서 따로 자료형을 표시하지 않는다. 작명법을 통해 암묵적으로 접근 지정자를 사용하는 방법은 있지만, 이는 어디까지나 절대적인 것이 아니기에 사용을 삼가는 편이다. 그렇다면 구분법을 살펴보자. 구분 타입 의미 name public 클래스 안과 밖에서 자유롭게 호출, 사용 가능 _name protected 상속 클래스 안에서 정의되었을 경우, 클래스 정의부 밖에선 사용 불가능 __name private 일반적으로 접근과 확인 불가능..
3. Context manager 우리가 코드를 통해 파일을 열고 내용을 작성해본다고 가정해보자. 위의 코드가 아주 보편적이고 일반적인 방법이다. 파일을 열고 작업을 끝낸 후에는 file.close( )를 통해 직접 닫아줘야한다. 이 때, 많은 작업량 중 오류가 발생하여 file.close( )가 실행되지 않는 문제가 발생할 수 있다. 이런 문제점을 해결하기 위한 첫번째 방법은 try, finally 키워드를 사용하는 것이다 . 이 방법은 오류가 발생해도 최종적으로는 파일을 닫을 수 있다. 이보다 간편하고 더 많은 기능을 허용하는 방법이 있다. 바로 context manager 의 대표적인 예시 with문을 사용하는 방법이다. 단 두 줄짜리 코드는 위의 내용과 정확히 일치하게 작동한다. with 구문안에 finally와 close의 의미..
2. Lambda, Map, Reduce, Filter python에는 lambda라는 익명 함수 개념이 존재한다. 일반함수는 재사용을 하기 때문에 메모리에 누적, 저장이 되는 반면, lambda는 이름이 없는 익명함수라서 저장이 되지 않는다. 이런 점 때문에 주로 시퀀스형 전처리 과정에 lambda와 map, reduce, filter 함수를 같이 사용하는 경우가 많다. 이 글에서는 lambda와 map, reduce, filter 함수를 살펴보자. 1. Lambda pyhton에서는 def를 사용하여 함수를 생성, 호출하는 과정을 지나야 함수를 사용할 수 있다. 이런 과정을 건너뛰어 메모리의 절약과 간편함이라는 장점을 가지고 있는 함수가 lambda 함수이다. 일반적으로 위의 과정을 거쳐 함수가 생성된다. 이에 반해 lambda 함수를 사용할 경우, 한 ..