name mangling

Name Mangling 파이썬에서 “name mangling"은 클래스 내부의 속성이나 메서드의 이름을 변경하는 기능이다. 이 기능은 주로 정보 은닉과 캡슐화를 위해 사용된다. 네임 맹글링의 작동 방식 더블 언더스코어 사용: 클래스 내에서 속성이나 메서드 이름 앞에 두 개의 언더스코어(__)를 붙이면 자동으로 네임 맹글링이 적용된다. 1 2 3 4 5 6 7 8 9 10 11 class Person: def __init__(self): self.__name = "김철수" # 실제로는 '_Person__name'으로 변환됨 def __private_method(self): # 실제로는 '_Person__private_method'로 변환됨 return "비공개 메서드" person = Person() print(dir(person)) # 실제 변환된 이름을 확인할 수 있음 print(person.__name) # AttributeError 발생 print(person._Person__name) # 김철수 출력 이름 변환 규칙: ...

November 25, 2024 · 2 min · Me

Python Super

Python Super super()는 상속 관계에서 부모 클래스의 메서드를 호출하는 데 사용되는 중요한 도구. 부모 클래스(슈퍼클래스)의 메서드를 호출할 때 사용된다. 주로 자식 클래스에서 부모 클래스의 메서드를 확장하거나 재정의할 때 활용된다. 사용 예제: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 class Animal: def __init__(self, name): self.name = name def speak(self): return f"{self.name} makes a sound" class Dog(Animal): def __init__(self, name, breed): # 부모 클래스의 __init__ 메서드 호출 super().__init__(name) self.breed = breed def speak(self): # 부모 클래스의 speak 메서드를 확장 base_sound = super().speak() return f"{base_sound} - specifically, a woof!" # 사용 예시 my_dog = Dog("Rex", "Golden Retriever") print(my_dog.speak()) # 출력: "Rex makes a sound - specifically, a woof!" 특징 부모 클래스 참조: super()는 현재 클래스의 부모 클래스를 참조한다. 메서드 연결: 부모 클래스의 메서드에 접근하여 호출할 수 있게 한다. 동적 결정: 런타임에 메서드 호출을 결정한다. MRO(Method Resolution Order) 활용: 다중 상속 시 메서드 해석 순서를 따른다. 장점 코드 재사용: 부모 클래스의 코드를 재사용하여 중복을 줄인다. 유연성: 부모 클래스의 구현을 변경해도 자식 클래스에서 수정할 필요가 없다. 다중 상속 지원: 복잡한 상속 구조에서도 적절한 부모 메서드를 호출할 수 있다. 단점 복잡성: 다중 상속 시 상속 구조가 복잡해질 수 있다. 예상치 못한 동작: 상속 계층에 따라 의도하지 않은 메서드가 호출될 수 있다. 주요 사용 방법 super().init(): 부모 클래스의 생성자를 호출한다. super().method_name(): 부모 클래스의 특정 메서드를 호출한다. super()의 고급 기능과 특징 다중 상속에서의 활용 super()는 다중 상속 상황에서 메서드 해결 순서(MRO)를 따라 적절한 메서드를 찾아준다: ...

November 25, 2024 · 4 min · Me

Method Resolution Order (MRO)

Method Resolution Order (MRO) 파이썬에서 클래스의 상속 관계에서 메서드를 찾는 순서를 정의하는 규칙으로 자식과 부모 클래스를 모두 포함하여 메서드의 실행 순서를 정한다. 이는 특히 다중 상속이 있을 때 매우 중요하다. 파이썬은 C3 선형화 알고리즘을 사용하여 이 순서를 결정한다. MRO와 관련된 문제가 발생하면 __mro__ 속성을 통해 메서드 해결 순서를 확인하고, 필요한 경우 클래스 계층 구조를 재설계하거나 명시적인 메서드 호출을 사용하여 문제를 해결할 수 있다. 동작 방식 호출된 자식 클래스를 먼저 확인한다. 그 다음 상속된 클래스들을 나열한 순서대로 확인한다. 우선순위 자식 클래스 부모 클래스 (먼저 상속받을수록 우선순위가 높음) 부모 클래스의 부모 클래스 (존재하는 경우) object 클래스 (최상위) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 class A: def method(self): print("A's method") class B(A): def method(self): print("B's method") class C(A): def method(self): print("C's method") class D(B, C): pass # MRO 확인 print(D.__mro__) # 출력: (<class '__main__.D'>, <class '__main__.B'>, # <class '__main__.C'>, <class '__main__.A'>, <class 'object'>) d = D() d.method() # B's method가 출력됨 다이아몬드 문제와 MRO 다이아몬드 문제는 다중 상속에서 발생할 수 있는 고전적인 문제. 파이썬의 MRO는 이 문제를 해결하는 방법을 제공한다. ...

November 25, 2024 · 3 min · Me

classmethod and staticmethod

Classmethod and Staticmethod Python의 클래스에서 사용되는 두 가지 다른 종류의 메서드 데코레이터 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class MyClass: class_var = 0 # 클래스 변수 def __init__(self): self.instance_var = 0 # 인스턴스 변수 # 일반 인스턴스 메서드 def instance_method(self): return f"instance method: {self.instance_var}" # 클래스 메서드 @classmethod def class_method(cls): return f"class method: {cls.class_var}" # 정적 메서드 @staticmethod def static_method(): return "static method" Classmethod 특징 @classmethod 데코레이터 사용 첫 번째 매개변수로 클래스 자신(cls)을 자동으로 받음 클래스 변수에 접근 가능 상속 시 cls는 현재 클래스를 참조 주요 사용 사례 대체 생성자(Alternative Constructor) 구현 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class Date: def __init__(self, year, month, day): self.year = year self.month = month self.day = day @classmethod def from_string(cls, date_string): year, month, day = map(int, date_string.split('-')) return cls(year, month, day) @classmethod def from_timestamp(cls, timestamp): import datetime date = datetime.datetime.fromtimestamp(timestamp) return cls(date.year, date.month, date.day) # 사용 예시 date1 = Date.from_string('2024-03-20') date2 = Date.from_timestamp(1710915600) # 2024-03-20의 타임스탬프 클래스 상태 관리 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 class Student: total_students = 0 # 클래스 변수 def __init__(self, name): self.name = name Student.total_students += 1 @classmethod def get_total_students(cls): return cls.total_students @classmethod def reset_total_students(cls): cls.total_students = 0 # 사용 예시 student1 = Student("John") student2 = Student("Jane") print(Student.get_total_students()) # 출력: 2 Student.reset_total_students() print(Student.get_total_students()) # 출력: 0 Staticmethod 특징 @staticmethod 데코레이터 사용 첫 번째 매개변수로 아무것도 자동으로 받지 않음 클래스/인스턴스 변수에 직접 접근 불가 유틸리티 함수처럼 독립적으로 동작 주요 사용 사례 유틸리티 함수 구현 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 class MathOperations: @staticmethod def is_even(number): return number % 2 == 0 @staticmethod def is_prime(number): if number < 2: return False for i in range(2, int(number ** 0.5) + 1): if number % i == 0: return False return True @staticmethod def get_factors(number): return [i for i in range(1, number + 1) if number % i == 0] # 사용 예시 print(MathOperations.is_even(4)) # 출력: True print(MathOperations.is_prime(7)) # 출력: True print(MathOperations.get_factors(12)) # 출력: [1, 2, 3, 4, 6, 12] 헬퍼 메서드 구현 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class FileProcessor: def __init__(self, filename): self.filename = filename @staticmethod def is_valid_file_format(filename): return filename.endswith(('.txt', '.csv', '.json')) @staticmethod def get_file_extension(filename): return filename.split('.')[-1] if '.' in filename else '' def process_file(self): if not self.is_valid_file_format(self.filename): raise ValueError("Invalid file format") # 파일 처리 로직… # 사용 예시 print(FileProcessor.is_valid_file_format('data.txt')) # 출력: True print(FileProcessor.get_file_extension('data.csv')) # 출력: csv Classmethod와 Staticmethod 비교 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 class Example: class_var = 10 def __init__(self): self.instance_var = 5 # 인스턴스 메서드 def instance_method(self): return self.instance_var, self.class_var # 클래스 메서드 @classmethod def class_method(cls): return cls.class_var # 클래스 변수 접근 가능 # return self.instance_var # 인스턴스 변수 접근 불가 # 정적 메서드 @staticmethod def static_method(): # 클래스/인스턴스 변수 직접 접근 불가 return "I am static" 사용 시 고려사항 Classmethod 사용 시기 클래스 상태를 수정하거나 접근해야 할 때 대체 생성자가 필요할 때 상속 시 다형성이 필요할 때 Staticmethod 사용 시기 클래스/인스턴스 상태와 무관한 유틸리티 함수가 필요할 때 네임스페이스 조직화가 필요할 때 순수 함수가 필요할 때 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 class DataProcessor: data_format = 'json' # 클래스 변수 def __init__(self, data): self.data = data # classmethod 사용이 적절한 경우 @classmethod def change_data_format(cls, new_format): if cls.is_valid_format(new_format): # staticmethod 호출 cls.data_format = new_format return True return False # staticmethod 사용이 적절한 경우 @staticmethod def is_valid_format(format_str): return format_str.lower() in ['json', 'xml', 'yaml'] # 일반 인스턴스 메서드 def process(self): if not self.is_valid_format(self.data_format): raise ValueError("Invalid format") # 데이터 처리 로직… # 사용 예시 print(DataProcessor.is_valid_format('json')) # 출력: True DataProcessor.change_data_format('xml') # 데이터 형식 변경 Self와 Cls 기본 개념 self: 인스턴스 메서드에서 인스턴스 자신을 참조 cls: 클래스 메서드에서 클래스 자신을 참조 ...

November 24, 2024 · 6 min · Me

Generator and Iterator

Generator and Iterator 이터레이터는 값을 차례대로 반환하는 객체로, __iter__()와 __next__() 메서드를 구현한다. 제너레이터는 yield 키워드를 사용하여 값을 하나씩 반환하는 함수로, 이터레이터를 생성한다. 제너레이터와 이터레이터의 주요 차이점 비교 항목 이터레이터 제너레이터 정의 방식 __iter__와 __next__ 메서드를 구현하는 클래스 yield 키워드를 사용하는 함수 상태 저장 인스턴스 변수를 통해 명시적으로 상태 저장 함수의 실행 상태가 자동으로 저장 메모리 사용 모든 상태를 명시적으로 저장해야 함 필요한 값만 생성하여 메모리 효율적 구현 복잡도 상대적으로 복잡함 (여러 메서드 구현 필요) 매우 단순함 (일반 함수처럼 작성) 용도 복잡한 이터레이션 로직이 필요한 경우 간단한 순차적 데이터 생성 재사용성 클래스로 구현되어 재사용 용이 한 번 순회하면 소진됨 기능 확장성 클래스이므로 추가 메서드와 속성 정의 가능 함수 범위로 제한됨 성능 상태 관리를 위한 추가 오버헤드 존재 매우 가벼움 코드 가독성 구조화된 형태로 명확하나 장황할 수 있음 간결하고 직관적 양방향 통신 메서드를 통해 구현 가능 send() 메서드로 기본 제공 이러한 차이점들은 실제 사용에서 다음과 같은 의미를 가진다. ...

November 24, 2024 · 5 min · Me

Python - Generators

Generators 파이썬의 제너레이터(Generator)는 반복 가능한 객체를 생성하는 강력한 도구 제너레이터의 기능과 역할 메모리 효율성: 필요한 값만 생성하여 메모리를 절약합니다. 지연 평가: 필요할 때만 값을 생성하여 불필요한 연산을 피합니다. 무한 시퀀스 생성: 끝없는 데이터 스트림을 모델링할 수 있습니다. 복잡한 로직 간소화: 복잡한 반복 로직을 간단하게 표현할 수 있습니다. 제너레이터의 특징 yield 키워드 사용: 함수 내에서 yield를 사용하여 값을 반환합니다. 상태 유지: 함수의 로컬 변수를 통해 내부 상태를 유지합니다. 이터레이터 프로토콜 준수: next() 함수를 통해 값을 하나씩 가져올 수 있습니다. StopIteration 예외: 모든 값을 생성한 후 StopIteration 예외를 발생시킵니다. 제너레이터의 주요 장점 메모리 효율성: ...

November 24, 2024 · 3 min · Me

내장 데코레이터 (Built-in Decorator)

내장 데코레이터 (Built-in Decorators) 파이썬에는 다양한 내장 데코레이터가 있으며, 이들은 코드를 최적화하고 기능을 확장하는 데 중요한 역할을 한다. @property @property는 메서드를 속성처럼 사용할 수 있게 해주는 데코레이터. getter, setter, deleter 기능을 제공하여 데이터의 캡슐화와 접근 제어를 가능하게 한다. 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 class Person: def __init__(self): self._age = 0 @property def age(self): """getter 메서드""" return self._age @age.setter def age(self, value): """setter 메서드""" if value < 0: raise ValueError("나이는 음수일 수 없습니다") self._age = value @age.deleter def age(self): """deleter 메서드""" print("나이 정보가 삭제되었습니다") del self._age # 사용 예시 person = Person() person.age = 25 # setter 호출 print(person.age) # getter 호출 del person.age # deleter 호출 @abstractmethod 추상 메서드를 정의하는 데코레이터. abc(Abstract Base Classes) 모듈과 함께 사용되며, 하위 클래스에서 반드시 구현해야 하는 메서드를 지정할 때 사용. ...

November 24, 2024 · 2 min · Me

Docstring

Docstring python에서 함수, 클래스, 모듈에 대한 문서화를 위해 사용되는 문자열. 이는 코드의 가독성을 높이고 다른 개발자들이 코드를 이해하는 데 도움을 준다. 주요 특징 큰따옴표 세 개(""") 또는 작은따옴표 세 개(’’’)로 둘러싸인 문자열이다. 함수, 클래스, 모듈의 첫 번째 문장으로 위치한다. __doc__ 속성을 통해 프로그램 실행 중에 접근할 수 있다. 내장 함수 help()를 통해 문서를 볼 수 있다. 기능 코드의 목적과 동작을 설명한다. 함수의 매개변수, 반환값, 예외 등을 문서화한다. 모듈이나 클래스의 전반적인 기능을 설명한다. 자동 문서 생성 도구(예: Sphinx)를 통해 API 문서를 생성할 수 있다. 고려해야 할 중요한 점들 일관성: 프로젝트 전체에서 동일한 스타일을 사용해야 한다. 명확성: 설명은 간단하고 명확해야 하며, 예시가 있으면 더 좋다. 완전성: 모든 매개변수, 반환값, 예외 상황을 문서화해야 한다. 최신성: 코드가 변경될 때 Docstring도 함께 업데이트해야 한다. 활용 방법 1 2 3 4 5 6 # Docstring 확인하기 help(google_style) # help() 함수 사용 print(google_style.__doc__) # __doc__ 속성 직접 접근 # 대화형 셸에서 사용 >>> google_style? # IPython/Jupyter에서 자동 문서 생성을 위한 도구들 Sphinx: Python 프로젝트의 표준 문서화 도구. pdoc: 간단한 API 문서를 자동으로 생성한다. MkDocs: Markdown 기반의 문서 생성 도구이다. 각 스타일은 프로젝트의 성격이나 팀의 선호도에 따라 선택할 수 있다. 중요한 것은 프로젝트 내에서 일관성 있게 사용하는 것. 또한, IDE나 문서 생성 도구와의 호환성을 고려하여 선택하는 것이 좋다. ...

November 24, 2024 · 4 min · Me

Fastify

Fastify Fastify는 Node.js를 위한 빠르고 낮은 오버헤드의 웹 프레임워크. 2016년에 처음 출시되었으며, 성능과 개발자 경험을 모두 중요하게 고려하여 설계되었다. Express.js와 유사한 API를 제공하면서도, JSON 스키마를 기반으로 한 검증과 높은 성능이 특징이다. 주요 특징 높은 성능: 최적화된 HTTP 레이어를 통해 높은 처리량과 낮은 지연 시간 제공 JSON 스키마 기반 검증: 내장된 데이터 검증 및 직렬화 기능 플러그인 아키텍처: 강력한 확장성을 위한 모듈식 구조 비동기 지원: async/await를 기본적으로 지원 TypeScript 지원: 타입 안전성과 자동 완성 기능 제공 장점 뛰어난 성능: 초당 많은 요청을 처리할 수 있는 높은 처리량 개발자 친화적: 직관적인 API와 풍부한 문서 제공 유연성: 다양한 플러그인과 미들웨어 지원 보안: 내장된 보안 기능과 데이터 검증 단점 및 한계 학습 곡선: 초보자에게는 다소 복잡할 수 있음 생태계 규모: Express.js에 비해 상대적으로 작은 커뮤니티와 플러그인 생태계 사용 방법 기본적인 설치와 서버 설정부터 살펴보겠습니다: ...

November 22, 2024 · 5 min · Me

Koa

Koa Koa는 Express.js 팀이 개발한 새로운 세대의 웹 프레임워크. Node.js를 위한 더 가벼운 미들웨어 아키텍처를 제공하면서도, 현대적인 JavaScript 기능들을 활용할 수 있도록 설계되었다. async/await를 기본적으로 지원하여 비동기 코드를 더 우아하게 작성할 수 있게 해주며, 더 작고 표현력 있는 기반을 제공한다. 주요 특징 비동기 함수 지원: Koa는 async/await를 사용하여 비동기 코드를 간결하게 작성할 수 있다. 미들웨어 기반 아키텍처: 요청 처리 흐름을 제어하는 미들웨어를 사용하여 유연한 구조를 제공한다. 경량화: Koa는 기본적으로 미들웨어를 포함하지 않으며, 필요한 기능을 플러그인 형태로 추가할 수 있다. 컨텍스트 객체: 각 요청에 대해 ctx 객체를 제공하여 요청 및 응답을 쉽게 처리할 수 있다. 모듈화된 구조: Koa는 다양한 기능을 모듈화하여 필요한 기능만 선택적으로 사용할 수 있다. 장점 높은 성능: Koa는 미니멀한 디자인 덕분에 빠른 성능을 제공한다. 개발자 친화적: 직관적인 API와 간결한 코드로 개발자 경험이 향상된다. 유연성: 필요에 따라 미들웨어를 추가하거나 제거할 수 있어 프로젝트 요구에 맞게 조정 가능하다. 최신 JavaScript 기능 활용: ES6와 async/await 문법을 통해 현대적인 코드 작성을 지원한다. 단점 및 한계 작은 커뮤니티: Express.js에 비해 상대적으로 작은 커뮤니티와 생태계를 가지고 있다. 미들웨어 부족: 기본적으로 제공되는 미들웨어가 없기 때문에 필요한 기능을 직접 구현하거나 외부 라이브러리를 찾아야 한다. 학습 곡선: 비동기 프로그래밍에 익숙하지 않은 개발자에게는 다소 복잡할 수 있다. 사용 방법 설치: ...

November 22, 2024 · 5 min · Me