Python에서 클래스(Class)는 객체 지향 프로그래밍(OOP, Object-Oriented Programming)을 구현하는 핵심 개념이다.
>> 클래스를 사용하면 관련 데이터와 기능(메서드)을 하나로 묶어 효율적으로 관리할 수 있다.
- 클래스와 객체의 개념
- 클래스(Class) : 객체를 만드는 설계도
- 객체(Object) : 클래스로부터 생성된 실체(인스턴스)
- 인스턴스(Instance) : 특정 클래스에서 만들어진 객체
- 인스턴스와 객체의 차이
- 객체만 지칭할 경우는 객체(Object)
- 클래스와 연관지어 말할 때는 인스턴스(Instence)
a = list(range(10))
b = list(range(20))
리스트 변수 a, b는 객체, a와 b는 list 클래스의 인스턴스
클래스와 메서드 만들기
# 1. 메서드는 클래스 안에 들어있는 함수를 뜻한다.
# 2. 파이썬에서 클래스의 이름은 대문자로 시작하고, 메서드 작성 방식은 def 함수와 같다.
# 3. 메서드의 첫 번째 매개변수는 반드시 self를 지정해야 한다.
class Car: # 'Car'라는 클래스 정의
def __init__(self, brand, color): #생성자(초기화)
self.brand = brand # 속성1
self.color = color # 속성2
def drive(self): # 메서드
print(f"{self.brand}({self.color})가 주행 중입니다.")
# 객체 생성
# 객체 = 클래스(속성1, 속성2)
car1 = Car("Avavte", "White")
car2 = Car("Sonata", "Black")
car3 = Car("Santafe", "Gray")
# 메서드 호출
car1.drive()
car2.drive()
car3.drive()

- __init__
- __init__ 메서드는 클래스에 ()를 붙여서 인스턴스를 만들 때 호출되는 특별한 메서드
- __init__(initialize)는 인스턴스(객체)를 초기화.
- 앞 뒤로 __가 붙은 메서드는 파이썬이 자동으로 호출해주는 메서드로 스페셜 메서드(매직 메서드)라고 부름
- 속성은 __init__ 메서드에서 만든다는 점과 self에 .을 붙인 뒤 값을 할당하는 점이 중요!!
- self
- 인스턴스 자기 자신을 의미
- 호출 시 현재 인스턴스가 자동으로 매개변수 self에 들어
# 흔히 볼 수 있는 클래스
# int, list, dict등도 클래스!!
a = int(19)
b = list(range(1,11,2))
c = dict(x = 10, y = 20)
- a = int(19)
- int는 정수를 나타내는 클래스
- int(19)는 19라는 값을 가진 int 클래스의 객체를 생성
- list(range(1,11,2))
- range(1,11,2)는 [1, 3, 5, 7 ,9] 형태의 반복 가능한 객체
- c = dict(x = 10, y = 20)
- {'x': 10, 'y': 20} 형태의 딕셔너리
- dict() 생성자는 키-값 쌍을 여러 가지 방식으로 받을 수 있음
- >> 숫자, 리스트, 딕셔너리 같은 것들도 클래스의 인스턴스(객체)
- >> int(), list(), dict() 같은 생성자는 데이터 타입 변환에서도 활용.
속성 사용하기
# 속성(attribute)을 만들 때는 __init__ 메서드 안에서 self.속성에 값을 할당.
class Person:
def __init__(self):
# self.속성 = 값
self.hello = '안녕'
def greeting(self):
print(self.hello)
messi = Person()
messi.greeting()
- __init__의 매개변수 self에 들어가는 값은 person()
- self가 완성된 다음 messi에 할당
- 호출 시 현재 인스턴스가 자동으로 매개변수 self에 들어옴
- greeting 메서드에서 print(self.hello)처럼 속성을 출력
# 인스턴스를 만들 때 값 받기
class Person:
def __init__(self, name, age, address):
self.hello = '안녕,'
self.name = name
self.age = age
self.address = address
def greeting(self):
print('{0} 나는 {1}야!'.format(self.hello, self.name))
maria = Person('마리아', 20, '서울시')
maria.greeting()
print('이름 :', maria.name)
print('나이 :', maria.age)
print('주소 :', maria.address)


비공개 속성 사용하기
# 비공개 속성 사용하기
# 비공개 속성은 __속성과 같이 __로 시작해야 한다.
# 단, __속성__처럼 밑줄 두 개가 양 옆에 왔을 때는 비공개 속성이 아님.
class Person:
def __init__(self, name, age, address, wallet):
self.name = name
self.age = age
self.address = address
self.__wallet = wallet # 변수 wallet 앞에 __를 붙여 비공개 속성으로 만듬
def pay(self, amount):
self.__wallet -= amount # 비공개 속성을 클래스 안의 메서드에서만 접근이 가능
print('잔돈 : {0}원'.format(self.__wallet))
Hong_GD = Person('홍길동', 99, '한국', 10000)
Hong_GD.pay(3333)

클래스 속성과 인스턴스 속성
# 클래스 속성
# def 클래스이름:
# 속성 = 값
class Person:
bag = []
def put_bag(self, stuff):
self.bag.append(stuff)
james = Person()
james.put_bag('책')
maria = Person()
maria.put_bag('열쇠')
print(james.bag)
print(maria.bag)
- Person 클래스에 bag 속성을 넣고, put_bag 메서드 생성
- james와 maria에 각각 put_bag 메서드 사용


- 클래스 속성 bag은 클래스에 속해 있고, 모든 인스턴스에서 공유함
- self는 현재 인스턴스를 뜻하기 때문에 클래스 속성을 지칭하는 것 보다는
클래스 이름으로 접근하는 것이 코드가 명확해짐 - self.bag.append(stuff) >>> Person.bag.append(stuff)
class Person:
bag = []
def put_bag(self, stuff):
Person.bag.append(stuff) # self가 아닌 클래스 이름으로 클래스 속성에 접근
james = Person()
james.put_bag('책')
maria = Person()
maria.put_bag('열쇠')
print(Person.bag)
print(Person.bag)


# 인스턴스 속성
class Person:
def __init__(self):
self.bag = [] # bag을 인스턴스 속성으로 생성
def put_bag(self, stuff):
self.bag.append(stuff) # 클래스 이름이 아닌 self 사용
james = Person()
james.put_bag('책')
maria = Person()
maria.put_bag('열쇠')
print(james.bag)
print(maria.bag)

- 인스턴스 속성은 인스턴스별로 독립되어 있고, 서로 영향을 주지 않음
- 클래스 속성 : 모든 인스턴스 공유. 인스턴스 전체가 사용해야 하는 값을 저장할 때
- 인스턴스 속성 : 인스턴스 별 독립. 각 인스턴스가 값을 따로 저장할 때
정적 메서드 사용하기
# 정적 메서드 사용하기
# 클래스 속성에 접근하지 않고, 일반 함수처럼 동작하지만
# 클래스 내부에 포함되는 것이 논리적으로 맞을 때 사용
# 메서드 위에 @staticmethod를 붙여 사용
class Calc:
@staticmethod
def add(a, b): # 정적 메서드는 매개변수에 self를 지정하지 않음
print(a + b)
@staticmethod
def mul(a, b): # 정적 메서드는 매개변수에 self를 지정하지 않음
print(a * b)
Calc.add(10, 20)
Calc.mul(10, 20)

- 정적 메서드는 self를 받지 않으므로 인스턴스 속성에 접근이 불가능.
- 인스턴스 속성, 인스턴스 메서드가 필요 없을 때 사용
- 정적 메서드는 메서드의 실행이 외부 상태에 영향을 끼치지 않는 순수함수를 만들 때 사용
- 순수 함수는 부수 효과가 없고 입력 값이 같으면 언제나 같은 출력값을 반환
- 정적 메서드는 인스턴스의 상태를 변화시키지 않는 메서드를 만들 때 사용
클래스 메서드 사용하기
# 클래스 메서드 사용하기
# 클래스 메서드는 첫 번째 매개변수에 cls를 지정해야 함.
# 메서드 위에 @classmethod를 붙여 사용
class Person:
count = 0 # 클래스 속성
def __init__(self):
Person.count += 1 # 인스턴스 생성 시 클래스 속성 count에 1을 더함
@classmethod
def print_count(cls):
print('{0}명 생성'.format(cls.count)) # cls로 클래스 속성에 접근
a = Person() # +1
b = Person() # +1
c = Person() # +1
d = Person() # +1
Person.print_count()

- 클래스 메서드(@classmethod)
- 클래스 자체를 첫 번째 인자로 받음(cls)
- 클래스 속성(cls.attribute)에 접근이 가능
- 클래스의 상태를 변경하거나, 클래스 관련 작업 수행시 사용
- 정적 메서드(@staticmethod)
- 클래스나 인스턴스와 관련없는 독립적인 함수
- self나 cls를 사용하지 않음
- 클래스 내부에서 동작하지만 클래스 속성을 변경하거나 접근하지 않음
- 관련이 있는 함수를 클래스 내에 그룹화할 때 사용
마무리
- 클래스(Class)
- 객체를 생성하는 틀
- 데이터(속성)와 기능(메서드)을 하나의 단위로 묶어 사용할 수 있음.
- 클래스(Class)와 메서드(Method)
- 클래스 내부에서 정의된 함수(메서드)는 객체가 동작하는 방식(행동)을 정의
- __init__() : 생성자 메서드로 객체가 생성될 때 자동으로 실행
- self : 객체 자신을 의미(인스턴스 변수 사용 시 받느시 self를 붙여서 사용)
- 클래스 속성 | 클래스 메서드
- 클래스 속성 : 모든 인스턴스가 공유하는 변수(self가 아닌 cls 사용)
- 클래스 메서드 : @classmethod를 사용, 클래스 변수 조작시 사용
- 정적 메서드
- @staticmethod를 사용, 클래스나 인스턴스와 무관한 독립적인 기능을 수행
- self 또는 cls를 사용하지 않고, 단순한 함수를 만들 때 유용
개념 | 설명 | 키워드 |
클래스(Class) | 객체를 만드는 설계도 | class |
인스턴스(Instance) | 클래스를 통해 생성된 객체 | object |
인스턴스 속성 | 특정 인스턴스에만 속하는 속성 | self.속성(attribute) |
클래스 속성 | 모든 인스턴스가 공유하는 속성 | cls.속성(attribute) |
인스턴스 메서드 | 특정 객체에서 동작하는 메서드 | self.method() |
클래스 메서드 | 클래스 속성을 다루는 메서드 | @classmethod |
정적 메서드 | 클래스 속성을 다루지 않는 독립적인 메서드 | @staticmethod |
클래스는 코드의 재사용성과 유지보수성을 높이는 중요 개념!
'Python' 카테고리의 다른 글
[Python] 머신러닝 (2) (0) | 2025.03.08 |
---|---|
[Python] 머신러닝 (1) (0) | 2025.03.05 |
[Python] 람다 표현식 (0) | 2025.03.02 |
[Python] 추천 시스템(2) (0) | 2025.03.01 |
[Python] 추천 시스템(1) (0) | 2025.03.01 |