반응형

C 언어는 하드웨어와 가까운 수준에서 메모리와 데이터를 다룰 수 있는 언어다. 포인터와 배열, 구조체, 컴파일 과정을 이해하면 시스템 프로그래밍의 기초가 잡힌다.

핵심 특징

  • C는 값의 저장 위치와 크기를 개발자가 비교적 직접적으로 의식해야 한다.
  • 포인터는 메모리 주소를 값처럼 다루는 문법이며 배열, 문자열, 동적 할당과 깊게 연결된다.
  • 헤더 파일과 소스 파일을 나누어 선언과 구현을 관리한다.

처음 볼 때 어려운 부분

  • 배열 이름과 포인터가 비슷하게 동작하는 상황이 있어 혼동하기 쉽다.
  • 문자열은 문자 배열과 널 종료 문자 개념을 함께 이해해야 한다.
  • 메모리 할당과 해제를 직접 다룰 때 누수와 dangling pointer를 주의해야 한다.

학습 팁

  • 작은 예제로 주소값, sizeof, 배열 인덱스를 직접 출력해 보면 감이 빨리 온다.
  • 컴파일 경고를 무시하지 말고 타입과 포인터 경고를 먼저 해결한다.
  • 자료구조를 직접 구현해 보면 포인터의 쓰임새가 자연스럽게 연결된다.

읽을 때 확인할 점

C 언어 기본 개념: 포인터와 메모리 모델 이해하기를 볼 때는 먼저 용어의 정의와 적용 조건을 분리해서 보는 것이 좋다. 같은 표현이라도 개발 환경, 데이터 형태, 사용 목적에 따라 실제 의미가 달라질 수 있기 때문이다.

  • 지금 해결하려는 문제가 개념 이해인지, 구현 적용인지, 결과 해석인지 먼저 나눈다.
  • 예제의 전제 조건이 내 상황과 같은지 확인한 뒤 필요한 부분만 가져온다.
  • 결과가 기대와 다르면 입력, 설정, 경계 조건을 순서대로 좁혀서 확인한다.

적용 체크리스트

  • 핵심 용어를 한 문장으로 설명할 수 있는지 확인한다.
  • 작은 예제나 샘플 데이터로 동작을 먼저 검증한다.
  • 실제 적용 전에는 입력 조건, 예외 케이스, 결과 해석 기준을 따로 적어 둔다.

함께 보면 좋은 글

마무리

C 언어 기본 개념: 포인터와 메모리 모델 이해하기는 개념 자체보다 적용 상황과 한계를 함께 보는 것이 중요하다. 작은 예제로 동작을 확인하고, 실제 환경에서는 입력 조건과 예외 케이스를 따로 점검하는 습관을 두면 시행착오를 줄일 수 있다.

반응형
반응형

Max Flow는 방향 그래프에서 source에서 sink로 보낼 수 있는 최대 유량을 구하는 문제다. 간선마다 용량이 정해져 있고, 그 한계를 넘지 않도록 흐름을 배분한다.

문제 구성

  • source는 유량이 시작되는 정점이고 sink는 유량이 모이는 정점이다.
  • 각 간선에는 보낼 수 있는 최대 용량이 있다.
  • 중간 정점에서는 들어온 유량과 나간 유량이 같아야 한다는 보존 조건을 따른다.

대표 알고리즘

  • Ford-Fulkerson은 증가 경로를 반복해서 찾아 유량을 늘린다.
  • Edmonds-Karp는 BFS로 증가 경로를 찾아 시간복잡도를 안정적으로 제한한다.
  • Dinic은 레벨 그래프와 blocking flow를 활용해 더 효율적으로 동작한다.

활용 예시

  • 이분 매칭, 작업 배정, 네트워크 대역폭 계산 같은 문제로 변환할 수 있다.
  • 최소 컷 정리와 연결되어 그래프를 나누는 최적 경계도 해석할 수 있다.
  • 모델링할 때는 정점 분할, 역간선, 잔여 용량 개념을 정확히 잡는 것이 중요하다.

읽을 때 확인할 점

Max Flow 개념 정리: 네트워크 유량 문제 이해하기를 볼 때는 먼저 용어의 정의와 적용 조건을 분리해서 보는 것이 좋다. 같은 표현이라도 개발 환경, 데이터 형태, 사용 목적에 따라 실제 의미가 달라질 수 있기 때문이다.

  • 지금 해결하려는 문제가 개념 이해인지, 구현 적용인지, 결과 해석인지 먼저 나눈다.
  • 예제의 전제 조건이 내 상황과 같은지 확인한 뒤 필요한 부분만 가져온다.
  • 결과가 기대와 다르면 입력, 설정, 경계 조건을 순서대로 좁혀서 확인한다.

적용 체크리스트

  • 핵심 용어를 한 문장으로 설명할 수 있는지 확인한다.
  • 작은 예제나 샘플 데이터로 동작을 먼저 검증한다.
  • 실제 적용 전에는 입력 조건, 예외 케이스, 결과 해석 기준을 따로 적어 둔다.

함께 보면 좋은 글

마무리

Max Flow 개념 정리: 네트워크 유량 문제 이해하기는 개념 자체보다 적용 상황과 한계를 함께 보는 것이 중요하다. 작은 예제로 동작을 확인하고, 실제 환경에서는 입력 조건과 예외 케이스를 따로 점검하는 습관을 두면 시행착오를 줄일 수 있다.

반응형
반응형

Visual Studio는 C#, C++, .NET 개발에서 많이 쓰이는 통합 개발 환경이다. 프로젝트 구조와 단축키, 빌드 흐름을 이해하면 작업 속도가 빨라진다.

프로젝트와 솔루션

  • Solution은 여러 Project를 묶는 상위 단위다.
  • Project는 실제 빌드 대상이며 소스 파일, 참조, 리소스, 빌드 설정을 가진다.
  • 파일을 폴더에 복사하는 것과 프로젝트에 포함하는 것은 다를 수 있으므로 Solution Explorer에서 상태를 확인한다.

자주 쓰는 기능

  • Go to Definition으로 선언 위치를 빠르게 이동할 수 있다.
  • Find All References는 함수나 클래스가 어디에서 쓰이는지 확인할 때 유용하다.
  • Breakpoints와 Watch 창을 쓰면 런타임 상태를 단계적으로 추적할 수 있다.

관리 팁

  • 빌드 설정은 Debug와 Release가 다를 수 있으므로 문제 재현 시 구성을 확인한다.
  • NuGet 패키지 버전은 팀원과 동일하게 맞추는 편이 좋다.
  • 자동 생성 파일과 빌드 산출물은 버전 관리에서 제외해 저장소를 깔끔하게 유지한다.

읽을 때 확인할 점

Visual Studio 기본 사용법: 프로젝트와 소스 폴더 관리를 볼 때는 먼저 용어의 정의와 적용 조건을 분리해서 보는 것이 좋다. 같은 표현이라도 개발 환경, 데이터 형태, 사용 목적에 따라 실제 의미가 달라질 수 있기 때문이다.

  • 지금 해결하려는 문제가 개념 이해인지, 구현 적용인지, 결과 해석인지 먼저 나눈다.
  • 예제의 전제 조건이 내 상황과 같은지 확인한 뒤 필요한 부분만 가져온다.
  • 결과가 기대와 다르면 입력, 설정, 경계 조건을 순서대로 좁혀서 확인한다.

적용 체크리스트

  • 핵심 용어를 한 문장으로 설명할 수 있는지 확인한다.
  • 작은 예제나 샘플 데이터로 동작을 먼저 검증한다.
  • 실제 적용 전에는 입력 조건, 예외 케이스, 결과 해석 기준을 따로 적어 둔다.

함께 보면 좋은 글

마무리

Visual Studio 기본 사용법: 프로젝트와 소스 폴더 관리는 개념 자체보다 적용 상황과 한계를 함께 보는 것이 중요하다. 작은 예제로 동작을 확인하고, 실제 환경에서는 입력 조건과 예외 케이스를 따로 점검하는 습관을 두면 시행착오를 줄일 수 있다.

반응형
반응형

grep은 파일이나 명령 출력에서 원하는 문자열을 찾는 기본 도구다. 로그 분석, 코드 검색, 설정 확인처럼 반복적인 확인 작업에서 많이 쓰인다.

기본 사용법

  • grep 'keyword' file.txt 형태로 파일 안에서 문자열을 찾는다.
  • 여러 파일을 대상으로 검색하면 어떤 파일에서 매칭되었는지도 함께 확인할 수 있다.
  • 파이프와 함께 쓰면 다른 명령의 출력 중 필요한 줄만 걸러낼 수 있다.

자주 쓰는 옵션

  • -i는 대소문자를 구분하지 않고 검색한다.
  • -n은 매칭된 줄 번호를 함께 출력한다.
  • -v는 특정 문자열을 포함하지 않는 줄만 보여 준다.

활용 예시

  • 로그에서 ERROR만 찾거나, 반대로 DEBUG 라인을 제외할 수 있다.
  • 소스 코드에서 함수명이나 설정 키워드가 등장하는 위치를 빠르게 확인할 수 있다.
  • 정규표현식을 함께 쓰면 단순 문자열보다 복잡한 패턴도 찾을 수 있다.

읽을 때 확인할 점

grep 명령어 사용법: 문자열 검색과 자주 쓰는 옵션를 볼 때는 먼저 용어의 정의와 적용 조건을 분리해서 보는 것이 좋다. 같은 표현이라도 개발 환경, 데이터 형태, 사용 목적에 따라 실제 의미가 달라질 수 있기 때문이다.

  • 지금 해결하려는 문제가 개념 이해인지, 구현 적용인지, 결과 해석인지 먼저 나눈다.
  • 예제의 전제 조건이 내 상황과 같은지 확인한 뒤 필요한 부분만 가져온다.
  • 결과가 기대와 다르면 입력, 설정, 경계 조건을 순서대로 좁혀서 확인한다.

적용 체크리스트

  • 핵심 용어를 한 문장으로 설명할 수 있는지 확인한다.
  • 작은 예제나 샘플 데이터로 동작을 먼저 검증한다.
  • 실제 적용 전에는 입력 조건, 예외 케이스, 결과 해석 기준을 따로 적어 둔다.

함께 보면 좋은 글

마무리

grep 명령어 사용법: 문자열 검색과 자주 쓰는 옵션는 개념 자체보다 적용 상황과 한계를 함께 보는 것이 중요하다. 작은 예제로 동작을 확인하고, 실제 환경에서는 입력 조건과 예외 케이스를 따로 점검하는 습관을 두면 시행착오를 줄일 수 있다.

반응형
반응형

ES6는 JavaScript 코드 작성 방식을 크게 바꾼 기준점이다. let과 const, arrow function, class, module 문법을 이해하면 현대 프론트엔드 코드를 읽기 쉬워진다.

변수와 함수

  • let과 const는 블록 스코프를 가지며 var보다 의도를 명확하게 표현한다.
  • arrow function은 짧은 함수 표현에 유용하고 this 바인딩 방식도 다르다.
  • 템플릿 문자열은 문자열 조합과 여러 줄 표현을 편하게 만든다.

모듈 문법

  • export는 다른 파일에서 사용할 값을 내보낼 때 쓴다.
  • import는 필요한 함수나 객체를 명시적으로 가져온다.
  • 모듈을 쓰면 전역 네임스페이스 오염을 줄이고 파일 단위 의존성을 관리하기 쉽다.

주의할 점

  • 브라우저와 Node.js의 모듈 처리 방식이 다를 수 있어 실행 환경을 확인해야 한다.
  • default export와 named export를 섞어 쓰면 import 문이 헷갈릴 수 있다.
  • Babel이나 번들러 설정이 들어가면 실제 실행 코드는 원본 문법과 달라질 수 있다.

읽을 때 확인할 점

ES6 모듈과 JavaScript 문법 변화 정리를 볼 때는 먼저 용어의 정의와 적용 조건을 분리해서 보는 것이 좋다. 같은 표현이라도 개발 환경, 데이터 형태, 사용 목적에 따라 실제 의미가 달라질 수 있기 때문이다.

  • 지금 해결하려는 문제가 개념 이해인지, 구현 적용인지, 결과 해석인지 먼저 나눈다.
  • 예제의 전제 조건이 내 상황과 같은지 확인한 뒤 필요한 부분만 가져온다.
  • 결과가 기대와 다르면 입력, 설정, 경계 조건을 순서대로 좁혀서 확인한다.

적용 체크리스트

  • 핵심 용어를 한 문장으로 설명할 수 있는지 확인한다.
  • 작은 예제나 샘플 데이터로 동작을 먼저 검증한다.
  • 실제 적용 전에는 입력 조건, 예외 케이스, 결과 해석 기준을 따로 적어 둔다.

함께 보면 좋은 글

마무리

ES6 모듈과 JavaScript 문법 변화 정리는 개념 자체보다 적용 상황과 한계를 함께 보는 것이 중요하다. 작은 예제로 동작을 확인하고, 실제 환경에서는 입력 조건과 예외 케이스를 따로 점검하는 습관을 두면 시행착오를 줄일 수 있다.

반응형
반응형

안드로이드 앱은 화면 단위의 Activity, UI를 구성하는 View, 그리고 상태 변화에 대응하는 생명주기를 중심으로 이해하면 구조가 잡힌다.

Activity와 화면

  • Activity는 사용자가 보는 하나의 화면 또는 작업 흐름을 담당한다.
  • 레이아웃 XML이나 코드로 View 계층을 구성해 화면을 만든다.
  • 버튼 클릭, 입력, 화면 전환 같은 이벤트 처리가 Activity나 ViewModel 주변에 모인다.

생명주기 이해

  • onCreate는 초기화, onStart와 onResume은 화면 표시와 상호작용 준비에 가깝다.
  • onPause와 onStop에서는 저장, 해제, 일시 중단 처리를 고려해야 한다.
  • 화면 회전이나 프로세스 종료 후 복원까지 생각하면 상태 관리가 중요해진다.

실무 팁

  • UI 코드와 비즈니스 로직을 분리하면 테스트와 유지보수가 쉬워진다.
  • 네트워크나 DB 작업은 메인 스레드를 막지 않도록 비동기로 처리한다.
  • 권한, 리소스, 다양한 화면 크기는 초기 설계 단계에서 함께 고려한다.

읽을 때 확인할 점

안드로이드 개발 기본 개념: Activity, View, 생명주기를 볼 때는 먼저 용어의 정의와 적용 조건을 분리해서 보는 것이 좋다. 같은 표현이라도 개발 환경, 데이터 형태, 사용 목적에 따라 실제 의미가 달라질 수 있기 때문이다.

  • 지금 해결하려는 문제가 개념 이해인지, 구현 적용인지, 결과 해석인지 먼저 나눈다.
  • 예제의 전제 조건이 내 상황과 같은지 확인한 뒤 필요한 부분만 가져온다.
  • 결과가 기대와 다르면 입력, 설정, 경계 조건을 순서대로 좁혀서 확인한다.

적용 체크리스트

  • 핵심 용어를 한 문장으로 설명할 수 있는지 확인한다.
  • 작은 예제나 샘플 데이터로 동작을 먼저 검증한다.
  • 실제 적용 전에는 입력 조건, 예외 케이스, 결과 해석 기준을 따로 적어 둔다.

함께 보면 좋은 글

마무리

안드로이드 개발 기본 개념: Activity, View, 생명주기는 개념 자체보다 적용 상황과 한계를 함께 보는 것이 중요하다. 작은 예제로 동작을 확인하고, 실제 환경에서는 입력 조건과 예외 케이스를 따로 점검하는 습관을 두면 시행착오를 줄일 수 있다.

반응형
반응형

setuptools는 Python 프로젝트를 패키지로 묶고 설치할 수 있게 해 주는 도구다. 라이브러리를 재사용 가능한 형태로 만들 때 기본 개념을 알아 두면 좋다.

패키징에서 다루는 정보

  • 프로젝트 이름, 버전, 설명, 의존성, 포함할 패키지 목록을 메타데이터로 정의한다.
  • 소스 코드 디렉터리와 배포 파일에 포함할 파일을 구분한다.
  • 설치 후 실행 가능한 콘솔 명령을 entry point로 등록할 수 있다.

현재 기준의 흐름

  • 새 프로젝트는 pyproject.toml을 중심으로 빌드 설정을 두는 방식이 일반적이다.
  • setuptools는 여전히 널리 쓰이며, build와 pip를 통해 설치 파일을 만들고 검증할 수 있다.
  • 오래된 setup.py 직접 실행 방식은 가능하면 최신 빌드 흐름으로 바꾸는 편이 좋다.

확인할 부분

  • 패키지 이름과 import 이름이 다를 수 있으므로 설치 후 실제 import를 테스트한다.
  • 버전 번호는 배포 이력 관리와 문제 재현에 중요하다.
  • 의존성 범위를 너무 넓게 잡으면 설치 충돌이 생길 수 있고, 너무 좁으면 업그레이드가 어려워진다.

읽을 때 확인할 점

Python setuptools: 패키지 설치와 배포 구조 이해하기를 볼 때는 먼저 용어의 정의와 적용 조건을 분리해서 보는 것이 좋다. 같은 표현이라도 개발 환경, 데이터 형태, 사용 목적에 따라 실제 의미가 달라질 수 있기 때문이다.

  • 지금 해결하려는 문제가 개념 이해인지, 구현 적용인지, 결과 해석인지 먼저 나눈다.
  • 예제의 전제 조건이 내 상황과 같은지 확인한 뒤 필요한 부분만 가져온다.
  • 결과가 기대와 다르면 입력, 설정, 경계 조건을 순서대로 좁혀서 확인한다.

적용 체크리스트

  • 핵심 용어를 한 문장으로 설명할 수 있는지 확인한다.
  • 작은 예제나 샘플 데이터로 동작을 먼저 검증한다.
  • 실제 적용 전에는 입력 조건, 예외 케이스, 결과 해석 기준을 따로 적어 둔다.

함께 보면 좋은 글

마무리

Python setuptools: 패키지 설치와 배포 구조 이해하기는 개념 자체보다 적용 상황과 한계를 함께 보는 것이 중요하다. 작은 예제로 동작을 확인하고, 실제 환경에서는 입력 조건과 예외 케이스를 따로 점검하는 습관을 두면 시행착오를 줄일 수 있다.

반응형
반응형

Python의 super()는 부모 클래스를 직접 지목하는 문법이 아니라, 메서드 탐색 순서인 MRO를 따라 다음 구현을 호출하는 도구다.

super()가 하는 일

  • 단일 상속에서는 부모 클래스의 메서드를 호출하는 것처럼 보인다.
  • 다중 상속에서는 클래스 선언 순서와 MRO에 따라 다음 클래스가 결정된다.
  • 따라서 부모 클래스 이름을 직접 쓰는 방식보다 협력적 다중 상속에 잘 맞는다.

MRO를 확인하는 방법

  • 클래스의 __mro__ 속성이나 mro() 메서드를 보면 탐색 순서를 확인할 수 있다.
  • 예상과 다른 메서드가 호출된다면 상속 선언 순서를 먼저 점검한다.
  • 모든 클래스가 같은 메서드 시그니처를 따르도록 맞추면 super() 호출 흐름이 안정된다.

주의할 점

  • 다중 상속에서 특정 부모를 직접 호출하면 같은 초기화 코드가 중복 실행될 수 있다.
  • __init__에서 super()를 쓸 때는 인자 전달 방식을 일관되게 설계해야 한다.
  • 상속 구조가 복잡해진다면 조합이나 명시적 위임이 더 단순한 해법일 수 있다.

읽을 때 확인할 점

Python super()와 MRO: 상속 호출 순서 이해하기를 볼 때는 먼저 용어의 정의와 적용 조건을 분리해서 보는 것이 좋다. 같은 표현이라도 개발 환경, 데이터 형태, 사용 목적에 따라 실제 의미가 달라질 수 있기 때문이다.

  • 지금 해결하려는 문제가 개념 이해인지, 구현 적용인지, 결과 해석인지 먼저 나눈다.
  • 예제의 전제 조건이 내 상황과 같은지 확인한 뒤 필요한 부분만 가져온다.
  • 결과가 기대와 다르면 입력, 설정, 경계 조건을 순서대로 좁혀서 확인한다.

적용 체크리스트

  • 핵심 용어를 한 문장으로 설명할 수 있는지 확인한다.
  • 작은 예제나 샘플 데이터로 동작을 먼저 검증한다.
  • 실제 적용 전에는 입력 조건, 예외 케이스, 결과 해석 기준을 따로 적어 둔다.

함께 보면 좋은 글

마무리

Python super()와 MRO: 상속 호출 순서 이해하기는 개념 자체보다 적용 상황과 한계를 함께 보는 것이 중요하다. 작은 예제로 동작을 확인하고, 실제 환경에서는 입력 조건과 예외 케이스를 따로 점검하는 습관을 두면 시행착오를 줄일 수 있다.

반응형
반응형

Jupyter Notebook은 코드, 실행 결과, 설명을 한 화면에 함께 남길 수 있는 작업 환경이다. 데이터 분석이나 실험 과정을 기록하기에 특히 편하다.

기본 사용 흐름

  • 코드는 셀 단위로 작성하고 실행한다. 실행 순서가 결과에 영향을 주므로 셀 번호를 확인해야 한다.
  • Markdown 셀을 함께 쓰면 실험 목적, 변수 의미, 결과 해석을 코드 옆에 남길 수 있다.
  • 그래프는 셀 출력으로 바로 확인할 수 있어 데이터 분포와 모델 결과를 빠르게 비교하기 좋다.

디버깅할 때 보는 것

  • 변수가 어디에서 정의되었는지, 같은 이름을 다시 덮어쓴 적은 없는지 확인한다.
  • 긴 노트북은 위에서부터 순서대로 다시 실행해 재현성을 점검한다.
  • 에러가 난 셀만 보지 말고 그 전에 실행된 데이터 로딩과 전처리 셀도 함께 본다.

관리 팁

  • 실험용 노트북과 배포용 스크립트는 분리하는 편이 좋다.
  • 출력 결과가 너무 커지면 파일 크기가 커지고 버전 관리가 어려워질 수 있다.
  • 중요한 분석은 데이터 경로와 패키지 버전을 함께 기록해 둔다.

읽을 때 확인할 점

Jupyter Notebook 사용법: 셀 실행, 그래프 출력, 디버깅를 볼 때는 먼저 용어의 정의와 적용 조건을 분리해서 보는 것이 좋다. 같은 표현이라도 개발 환경, 데이터 형태, 사용 목적에 따라 실제 의미가 달라질 수 있기 때문이다.

  • 지금 해결하려는 문제가 개념 이해인지, 구현 적용인지, 결과 해석인지 먼저 나눈다.
  • 예제의 전제 조건이 내 상황과 같은지 확인한 뒤 필요한 부분만 가져온다.
  • 결과가 기대와 다르면 입력, 설정, 경계 조건을 순서대로 좁혀서 확인한다.

적용 체크리스트

  • 핵심 용어를 한 문장으로 설명할 수 있는지 확인한다.
  • 작은 예제나 샘플 데이터로 동작을 먼저 검증한다.
  • 실제 적용 전에는 입력 조건, 예외 케이스, 결과 해석 기준을 따로 적어 둔다.

함께 보면 좋은 글

마무리

Jupyter Notebook 사용법: 셀 실행, 그래프 출력, 디버깅는 개념 자체보다 적용 상황과 한계를 함께 보는 것이 중요하다. 작은 예제로 동작을 확인하고, 실제 환경에서는 입력 조건과 예외 케이스를 따로 점검하는 습관을 두면 시행착오를 줄일 수 있다.

반응형
반응형

핵심 정리

Python 디스크립터는 클래스 속성으로 배치되어 인스턴스의 속성 읽기, 쓰기, 삭제 동작에 개입하는 객체입니다. 원문은 RevealAccess 예제로 이 흐름을 보여 주지만 Python 2 시절 표기와 설명을 포함하므로, 현재 Python 3 기준의 프로토콜과 구분을 먼저 확인하는 편이 안전합니다.

  • 현재 Python 공식 문서에서는 __get__(), __set__(), __delete__() 중 하나를 정의한 객체를 디스크립터로 설명합니다.
  • __set__() 또는 __delete__()를 정의하면 data descriptor이고, __get__()만 정의한 경우 non-data descriptor입니다. 원문의 둘 다 있어야 data descriptor라는 문장은 이 기준에 맞게 고쳐 읽어야 합니다.
  • RevealAccess 객체를 MyClass.x 같은 클래스 속성에 두면 m.x를 읽을 때 __get__()이, m.x에 값을 쓸 때 __set__()이 호출되어 로깅이나 검증 같은 추가 동작을 넣을 수 있습니다.
  • 원문의 print 'Retrieving' 형태는 Python 2 문법입니다. Python 3에서 실행하려면 print('Retrieving', self.name)처럼 함수 호출 형태로 바꾸며, 일반 클래스에서 object 상속을 명시할 필요도 없습니다.
  • property, 인스턴스 메서드의 바인딩, staticmethod, classmethod, super 같은 Python 기능을 이해할 때도 디스크립터 프로토콜이 핵심 배경이 됩니다.

먼저 아래 예제에서 x가 인스턴스 안의 평범한 값이 아니라 클래스에 놓인 RevealAccess 객체라는 점을 보고, 읽기와 쓰기 시 출력이 생기는 순서를 따라가면 됩니다.

이어서 볼 글

 

descriptor

> __get__, __set__, and __delete__. If any of those methods are defined for an object, it is said to be a descriptor.

> descriptors only work for new style objects and classes.

__get__, __set__ 둘다 가진넘을 data descriptor라고 하고,

__get__ 하나만 가진넘은 non-data descriptor라고 한다.


class RevealAccess(object):
    """A data descriptor that sets and returns values
       normally and prints a message logging their access.
    """

    def __init__(self, initval=None, name='var'):
        self.val = initval
        self.name = name

    def __get__(self, obj, objtype):
        print 'Retrieving', self.name
        return self.val

    def __set__(self, obj, val):
        print 'Updating' , self.name
        self.val = val

>>> class MyClass(object):
    x = RevealAccess(10, 'var "x"')
    y = 5

>>> m = MyClass()
>>> m.x
Retrieving var "x"
10
>>> m.x = 20
Updating var "x"
>>> m.x
Retrieving var "x"
20
>>> m.y
5

위 예제보면 별것도 아니네..

그냥 클래스 멥버variable접근할때 함수불리게 해서 추가동작 할 수 있는걸로 보인다.

(decorator랑도 비슷?)

근데 여러가지 파이선 기능 구현할때 이 기능을 사용해서 구현했다는거 같다.

> Descriptors are a powerful, general purpose protocol. They are the mechanism behind properties, methods, static methods, class methods, and super(). They are used used throughout Python itself to implement the new style classes introduced in version 2.2. Descriptors simplify the underlying C-code and offer a flexible set of new tools for everyday Python programs.

반응형

+ Recent posts