class 클래스이름:
# 클래스 속성(멤버 변수) 정의
속성1 = 초기값1
속성2 = 초기값2
# 생성자 메서드 (생략 가능)
def __init__(self, 매개변수1, 매개변수2, ...):
# 인스턴스 속성 초기화
self.속성1 = 매개변수1
self.속성2 = 매개변수2
# 메서드(멤버 함수) 정의
def 메서드1(self, 매개변수1, 매개변수2, ...):
# 메서드 동작 정의
pass
def 메서드2(self, 매개변수1, 매개변수2, ...):
# 메서드 동작 정의
pass
객체(Object): 현실 세계에서의 실제 개체나 추상적인 개념을 모델링한 것.
ex) 자동차, 사람, 은행 계좌 등.
객체는 데이터(속성, 상태)와 메서드(동작, 함수)로 구성된다.
클래스에서 만들어진 실제 존재하는 데이터(프로그램 내에서 사용된 것)
클래스(Class): 객체를 만들기 위한 템플릿 또는 설계도.
클래스는 객체의 공통 속성과 동작을 정의하며, 객체를 생성하는데 사용된다.
ex) "자동차" 클래스는 모든 자동차 객체가 가져야 하는 속성(색상, 속도)과 메서드(주행, 멈춤)를 정의할 수 있다.
인스턴스(Instance): 클래스를 기반으로 실제로 생성된 객체.
클래스는 여러 인스턴스를 생성할 수 있으며, 각 인스턴스는 독립적인 데이터와 메서드를 가진다.
객체가 어떤 클래스에서 나왔는지에 초점을 맞출 때 사용하는 용어
속성(Attributes) 또는 멤버 변수(Fields): 객체는 데이터를 저장하기 위한 속성을 가진다.
속성은 객체의 상태나 특성을 나타내며 변수로 표현된다.
ex) 자동차 객체의 속성은 색상, 속도, 모델 등이 될 수 있다.
메서드(Methods) 또는 멤버 함수(Functions): 객체는 데이터를 조작하거나 특정 작업을 수행하기 위한 메서드를 포함한다.
메서드는 함수와 비슷하게 동작하지만, 객체의 상태에 접근하고 조작할 수 있다.
ex) 자동차 객체의 메서드: 주행, 정지, 경적 울리기 등.
클래스를 정의한 후에는 이를 기반으로 객체(인스턴스)를 생성할 수 있다.
class Dog:
pass # 내용이 없는 블록을 만들 때 사용
Dog()
<__main__.Dog at 0x7e56cf26bb50>
Rucy = Dog()
print(Rucy)
print(type(Rucy))
print(id(Rucy))
PPomi = Dog()
print(PPomi)
print(type(PPomi))
print(id(PPomi))
<__main__.Dog object at 0x7e56cf29fca0>
<class '__main__.Dog'>
138911307922592
<__main__.Dog object at 0x7e56cf2693c0>
<class '__main__.Dog'>
138911307699136
객체를 생성한 후에는 객체의 속성을 초기화할 수 있다.
이를 위해 . 연산자를 사용하여 객체의 속성에 접근하고 값을 할당한다.
또한 . 연산자를 사용하여 객체의 메서드를 호출할 수 있다.
class Dog:
name = ''
age = 0
family = ''
def eat(self):
print('사료를 먹습니다!')
Rucy = Dog()
Rucy.name = '루시'
Rucy.age = '15'
Rucy.family = '포메'
print(Rucy.name)
print(Rucy.age)
print(Rucy.family)
Rucy.eat()
PPomi = Dog()
PPomi.name = '뽀미'
PPomi.age = '7'
PPomi.family = '폼피츠'
print(PPomi.name)
print(PPomi.age)
print(PPomi.family)
PPomi.eat()
루시
15
포메
사료를 먹습니다!
뽀미
7
폼피츠
사료를 먹습니다!
__init__라고 이름이 정해져 있다. class 클래스이름:
def __init__(self, 매개변수1, 매개변수2):
self.속성1 = 매개변수1
self.속성2 = 매개변수2
class Dog:
def __init__(self):
print(self, 'init 호출!')
Rucy = Dog()
<__main__.Dog object at 0x7e56cf29e0e0> init 호출!
PPomi = Dog()
<__main__.Dog object at 0x7e56cf29dcc0> init 호출!
class Dog:
def __init__(self):
self.name = ''
self.age = 0
Rucy = Dog()
print(Rucy)
print(Rucy.name)
print(Rucy.age)
<__main__.Dog object at 0x7e56cf29d540>
(공백)
0
PPomi = Dog()
print(PPomi)
print(PPomi.name)
print(PPomi.age)
<__main__.Dog object at 0x7e56cf29d750>
(공백)
0
class Dog:
def __init__(self, name, age, family='족보없음'):
self.name = name
self.age = age
self.family = family
# Rucy = Dog() # TypeError: Dog.__init__() missing 2 required positional arguments: 'name' and 'age'
Rucy = Dog('루시', 15, '포메')
print(Rucy)
print(Rucy.name)
print(Rucy.age)
print(Rucy.family)
<__main__.Dog object at 0x7e56cf29ddb0>
루시
15
포메
PPomi = Dog('뽀미', 7, '폼피츠')
print(PPomi)
print(PPomi.name)
print(PPomi.age)
print(PPomi.family)
<__main__.Dog object at 0x7e56cf29efb0>
뽀미
7
폼피츠
class Counter:
def __init__(self):
self.num = 0
def increment(self):
self.num += 1
def current_value(self):
return self.num
def decrement(self):
self.num -= 1
def reset(self):
self.num = 0
KBBank = Counter()
print(KBBank.num)
print(KBBank.current_value())
KBBank.increment()
KBBank.increment()
KBBank.increment()
print(KBBank.current_value())
KBBank.decrement()
print(KBBank.current_value())
KBBank.reset()
print(KBBank.current_value())
0
0
3
2
0
HanaBank = Counter()
print(HanaBank.current_value())
HanaBank.increment()
HanaBank.increment()
HanaBank.increment()
HanaBank.increment()
HanaBank.increment()
print(HanaBank.current_value())
print(KBBank.current_value())
0
5
0
class Dog:
family = "포메" # 클래스 변수
def __init__(self, name, age):
# 인스턴스 변수
self.name = name
self.age = age
def print_info(self):
print(f'종: {Dog.family}') # 클래스 변수
print(f'이름: {self.name}') # 인스턴스 변수
print(f'나이: {self.age}') # 인스턴스 변수
Rucy = Dog('루시', 15)
PPomi = Dog('뽀미', 7)
Rucy.print_info()
PPomi.print_info()
종: 포메
이름: 루시
나이: 15
종: 포메
이름: 뽀미
나이: 7
Dog.family = '폼피츠'
Rucy.print_info()
PPomi.print_info()
종: 폼피츠
이름: 루시
나이: 15
종: 폼피츠
이름: 뽀미
나이: 7
Rucy.family = '포메'
Rucy.print_info()
print(Rucy.family)
print(PPomi.family)
종: 폼피츠
이름: 루시
나이: 15
포메
폼피츠
Dog.family = '폼피츠' 이므로 이미 클래스 변수는 '폼피츠'이다.
따라서 Rucy.print_info() 했을 때, 종은 '폼피츠'로 출력.
인스턴스 메서드(Instance Method): 객체의 상태를 조작하거나 객체에 특정 작업을 수행하는 메서드. 대부분의 클래스 내부에 있는 메서드는 인스턴스 메서드.
__init__(생성자: 객체가 생성될 때 초기값) 메서드도 인스턴스 메서드.
클래스 메서드(Class Method): 클래스 레벨에서 동작하며, 모든 인스턴스가 공유하는 메서드.
클래스 메서드는 @classmethod 데코레이터를 사용하여 정의하며, 첫 번째 매개변수로 cls를 사용한다.
정적 메서드(Static Method): 특정 클래스나 인스턴스와 관련이 없는 메서드.
클래스 내부에 정의되어 있지만 클래스나 인스턴스와 독립적으로 호출될 수 있다.
정적 메서드는 @staticmethod 데코레이터를 사용하여 정의한다.
class Calculator:
def add(self, x, y):
return x + y
@classmethod
def subtract(cls, x, y):
# cls.num = 20 : class에서 만든 변수를 사용할 수 있다.
return x - y
@staticmethod
def multiply(x, y):
return x * y
# 인스턴스 생성
calc = Calculator()
# 인스턴스 메서드 호출
result1 = calc.add(5, 3)
print(result1) # 출력: 8
# 클래스 메서드 호출
result2 = Calculator.subtract(10, 4)
print(result2) # 출력: 6
# 정적 메서드 호출
result3 = Calculator.multiply(6, 2)
print(result3) # 출력: 12
8
6
12
| 메서드 유형 | 호출 방법 | 특징 | 예시 |
|---|---|---|---|
| 인스턴스 메서드 | obj.method() | self 사용, 객체 필요 | c.add(3, 4) |
| 클래스 메서드 | Class.method() | cls 사용, 클래스 변수 접근 | Calculator.subtract() |
| 정적 메서드 | Class.method() | 클래스/객체 모두 호출 가능, 독립적 | Calculator.multiply() |