
본 블로그 글은 박동민·강영민 저자님의 으뜸파이썬 교재를 참고하여 만들어진 글임을 밝힙니다.
id() 함수를 사용하여 확인이 가능하다.__)로 감싸져있는 형태이다.| 매직 메서드 | 설명 |
|---|---|
__init__(self) | 객체가 생성될 때 호출되는 생성자 메서드, 객체 초기화 작업을 담당 |
__str__(self) | print()나 str()로 객체를 출력할 때 호출되는 메서드, 객체의 문자열 표현을 정의 |
__repr__(self) | 객체를 표현하는 공식적인 문자열을 반환하는 메서드, repr()로 호출 |
__len__(self) | len() 함수 호출 시 객체의 길이를 반환하는 메서드 |
__getitem__(self, key) | 객체를 인덱스로 접근할 때 호출되는 메서드. 리스트처럼 동작할 수 있게 해줌 |
__setitem__(self, key, value) | 객체에 인덱스를 사용해 값을 설정할 때 호출되는 메서드 |
__delitem__(self, key) | 객체에서 인덱스로 값을 삭제할 때 호출되는 메서드 |
__iter__(self) | 객체를 반복할 수 있도록 하는 메서드, for문에서 사용될 때 호출됨 |
__next__(self) | 반복자 객체에서 다음 값을 반환하는 메서드, __iter__와 함께 사용 |
__call__(self, ...) | 객체가 함수처럼 호출될 때 호출되는 메서드, 함수처럼 동작하게 할 수 있음. |
int와 같은 기본 타입의 자료형도 실제로는 클래스이다.| 메서드 | 연산자 | 설명 |
|---|---|---|
__add__(self, other) | + | 덧셈 연산을 정의 |
__sub__(self, other) | - | 뺄셈 연산을 정의 |
__mul__(self, other) | * | 곱셈 연산을 정의 |
__truediv__(self, other) | / | 나눗셈 연산을 정의 |
__floordiv__(self, other) | // | 몫 연산을 정의 |
__mod__(self, other) | % | 나머지 연산을 정의 |
__pow__(self, other) | ``** | 거듭제곱 연산을 정의 |
__lshift__(self, other) | << | 왼쪽 비트 시프트 연산 정의 |
__rshift__(self, other) | >> | 오른쪽 비트 시프트 연산 정의 |
사용 예시
(200).__sub__(100) # 200 - 100과 동일
(200).__sub__(100) # 200 - 100과 동일
(5).__add__(3) # 5 + 3과 동일
(10).__mul__(4) # 10 * 4와 동일
객체 지향 프로그래밍 (Objected Oriented Programming)
절차적 프로그래밍 언어 (Procedural Programming)
개발이나 소프트웨어 업데이트시의 유지보수 비용이 매우 적게 들기 때문에 최근 프로그래밍 경향은 대부분 객체 지향 방식을 선호
class Cat:
# 생성자 메서드 (__init__)로 멤버 변수 초기화
def __init__(self, name, age):
self.name = name # 멤버 변수 name
self.age = age # 멤버 변수 age
# 메서드 정의
def meow(self):
print(f"{self.name} says: Meow!")
def introduce(self):
print(f"My name is {self.name} and I am {self.age} years old.")
def __str__(self):
return f'Cat(name = {self.name}, age = {self.age}'
# Cat 클래스의 인스턴스(객체) 생성
my_cat = Cat("Whiskers", 3)
# 메서드 호출
my_cat.meow() # 출력: Whiskers says: Meow!
my_cat.introduce() # 출력: My name is Whiskers and I am 3 years old.
__ (던더)를 앞에 붙여서 외부에서 클래스에 멤버변수에 직접 접근하는 것을 막는다.class Cat:
# 생성자 메서드 (__init__)로 멤버 변수 초기화
def __init__(self, name, age):
self.__name = name # 멤버 변수 name (캡슐화)
self.__age = age # 멤버 변수 age (캡슐화)
# getter 메서드
def get_name(self):
return self.__name
def get_age(self):
return self.__age
# setter 메서드
def set_name(self, name):
self.__name = name
def set_age(self, age):
if age > 0: # 나이가 0보다 클 때만 수정 가능
self.__age = age
else:
print("나이는 양수여야 합니다.")
def __str__(self):
return f'Cat(name = {self.__name}, age = {self.__age})'
# Cat 클래스의 인스턴스(객체) 생성
my_cat = Cat("Whiskers", 3)
# getter 메서드 호출
print(my_cat.get_name()) # 출력: Whiskers
print(my_cat.get_age()) # 출력: 3
# setter 메서드 호출
my_cat.set_name("Fluffy")
my_cat.set_age(4)
# 수정된 값 출력
print(my_cat.get_name()) # 출력: Fluffy
print(my_cat.get_age()) # 출력: 4
== 연산자를 사용한다.is와 is not은 두 객체의 id를 비교하는 함수이다.is : 객체가 같은 메모리 주소를 참조하는지 비교is not : 두 객체가 같은 메모리 주소를 참조하지 않는지 비교파이썬에서 메모리 절약을 위한 객체 재사용 (Interning
- 파이썬은 메모리 절약을 위해 특정 객체들을 재사용하는 방식인 객체 인터닝(interning)을 사용한다
문자열 인터닝 (String Interning)
- 문자열은 파이썬에서 자주 사용되는 불변 객체로, 동일한 문자열 값이 여러 곳에서 사용될 경우 인터닝을 통해 메모리 절약을 한다.
- 리터럴 문자열의 경우 자동으로 인터닝된다.
- 리터럴 문자열 : 코드에 하드코딩된 문자열
작은 정수 인터닝 (Small Integer Interning)
- 파이썬은
5에서256사이의 정수에 대해 인터닝을 수행합니다. 이 범위 내의 정수는 같은 값이 여러 번 사용되더라도 하나의 메모리 주소를 참조합니다
연산 메서드
| 연산자 | 매직 메서드 | 설명 |
|---|---|---|
x + y | __add__ | 두 객체의 덧셈 동작을 정의 |
x - y | __sub__ | 두 객체의 뺄셈 동작을 정의 |
x * y | __mul__ | 두 객체의 곱셈 동작을 정의 |
| `x y`** | __pow__ | 두 객체의 거듭제곱 동작을 정의 |
x / y | __truediv__ | 두 객체의 나눗셈 동작(소수점 포함)을 정의 |
x // y | __floordiv__ | 두 객체의 몫을 반환하는 동작을 정의 |
x % y | __mod__ | 두 객체의 나머지를 반환하는 동작을 정의 |
+x | __pos__ | 객체의 양수 연산 동작을 정의 |
-x | __neg__ | 객체의 음수 연산 동작을 정의 |
비교 메서드
| 연산자 | 매직 메서드 | 설명 |
|---|---|---|
x == y | __eq__ | 두 객체의 동등 비교를 정의 |
x != y | __ne__ | 두 객체의 다름 비교를 정의 |
x < y | __lt__ | 두 객체의 작음 비교를 정의 |
x > y | __gt__ | 두 객체의 큼 비교를 정의 |
x <= y | __le__ | 두 객체의 작거나 같음 비교를 정의 |
x >= y | __ge__ | 두 객체의 크거나 같음 비교를 정의 |
내장 메서드
| 내장 함수/동작 | 매직 메서드 | 설명 |
|---|---|---|
str(obj) | __str__ | 객체를 문자열로 표현할 때 호출됨 |
repr(obj) | __repr__ | 객체를 개발자 친화적인 문자열로 표현함 |
len(obj) | __len__ | 객체의 길이를 반환하는 동작을 정의 |
obj[key] | __getitem__ | 객체에서 인덱스 접근 동작을 정의 |
del obj[key] | __delitem__ | 객체에서 인덱스를 삭제하는 동작을 정의 |
key in obj | __contains__ | 객체에 특정 키가 포함되어 있는지 확인함 |
연산 메서드: 덧셈(+)과 뺄셈(``)
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
# 덧셈 연산자 오버로딩
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
# 뺄셈 연산자 오버로딩
def __sub__(self, other):
return Vector(self.x - other.x, self.y - other.y)
def __str__(self):
return f"Vector({self.x}, {self.y})"
v1 = Vector(2, 3)
v2 = Vector(4, 1)
# + 연산
result_add = v1 + v2
print(result_add) # 출력: Vector(6, 4)
# - 연산
result_sub = v1 - v2
print(result_sub) # 출력: Vector(-2, 2)
비교 메서드: 동등(==) 및 작음(<) 비교
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
# 동등 비교
def __eq__(self, other):
return self.x == other.x and self.y == other.y
# 작음 비교
def __lt__(self, other):
return (self.x, self.y) < (other.x, other.y)
p1 = Point(1, 2)
p2 = Point(1, 2)
p3 = Point(3, 4)
# == 연산
print(p1 == p2) # 출력: True
print(p1 == p3) # 출력: False
# < 연산
print(p1 < p3) # 출력: True
print(p3 < p1) # 출력: False
내장 메서드: 문자열 표현 및 길이 반환
class CustomList:
def __init__(self, items):
self.items = items
# 문자열 표현
def __str__(self):
return f"CustomList({self.items})"
# 길이 반환
def __len__(self):
return len(self.items)
my_list = CustomList([1, 2, 3, 4])
# 문자열 표현
print(str(my_list)) # 출력: CustomList([1, 2, 3, 4])
# 길이 반환
print(len(my_list)) # 출력: 4
class Parent:
def __init__(self, name):
self.name = name
def greet(self):
return f"Hello, I am {self.name}."
class Child(Parent): # Parent 클래스 상속
def __init__(self, name, age):
super().__init__(name) # 부모 클래스의 __init__ 호출
self.age = age
def introduce(self):
return f"{super().greet()} I am {self.age} years old."
# 객체 생성 및 사용
child = Child("Alice", 12)
print(child.greet()) # 출력: Hello, I am Alice.
print(child.introduce()) # 출력: Hello, I am Alice. I am 12 years old.
| 특징 | 클래스 변수 | 인스턴스 변수 |
|---|---|---|
| 선언 위치 | 클래스 내부, 메서드 외부 | __init__ 메서드 내부에서 선언 |
| 소속 | 클래스 자체에 소속 | 특정 인스턴스에 소속 |
| 공유 여부 | 모든 인스턴스가 동일한 값을 공유 | 각 인스턴스가 독립적인 값을 가짐 |
| 접근 방법 | 클래스 이름 또는 인스턴스를 통해 접근 가능 | 인스턴스를 통해서만 접근 가능 |
| 수정 범위 | 한 인스턴스에서 수정하면 다른 모든 인스턴스에 영향 | 수정해도 다른 인스턴스에는 영향 없음 |
클래스 변수 선언
class MyClass:
class_variable = "This is a class variable" # 클래스 변수
클래스 변수의 접근
print(MyClass.class_variable) # 클래스 이름을 통해 접근
obj = MyClass()
print(obj.class_variable) # 인스턴스를 통해 접근