Python

[Python] 클래스(Class)

orin602 2025. 3. 4. 16:04

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