본문 바로가기
파이썬

객체지향과 클래스

by 코낄2 2023. 9. 12.

1. 객체지향 프로그래밍

객체지향 프로그래밍(Object-Oriented Programming, OOP)은 소프트웨어를 설계하고 구현하는 데 사용되는 중요한 프로그래밍 패러다임 중 하나입니다. 이 패러다임은 프로그램을 "객체"라고 불리는 독립적인 개체로 나누고, 이러한 객체들 간의 상호작용을 통해 프로그램을 구성하는 개발 방법론입니다. (외에는 절차지향프로그래밍과 함수형 프로그래밍 등이 있습니다.) 객체지향 프로그래밍은 소프트웨어의 모듈화, 유지보수성, 재사용성을 향상시키고 복잡한 시스템을 더 쉽게 이해하고 관리할 수 있도록 도와줍니다. 객체는 현실 세계에서의 실제 개체나 추상적인 개념을 모델링한 것입니다. 예를 들어, 자동차, 사람, 은행 계좌 등이 객체가 될 수 있습니다. 객체는 추상적인 개념을 구체화 시켜놓은 것 입니다. 데이터(속성, 상태)와 메서드(동작, 함수)로 구성됩니다.

  • 클래스(Class): 클래스는 객체를 만들기 위한 템플릿 또는 설계도입니다. 클래스는 객체의 공통 속성과 동작을 정의하며, 객체를 생성하는데 사용됩니다. 예를 들어, "자동차" 클래스는 모든 자동차 객체가 가져야 하는 속성(색상, 속도)과 메서드(주행, 멈춤)를 정의할 수 있습니다.
  • 인스턴스(Instance): 클래스를 기반으로 실제로 생성된 객체를 인스턴스라고 합니다. 클래스는 여러 인스턴스를 생성할 수 있으며, 각 인스턴스는 독립적인 데이터와 메서드를 가집니다.

2. 클래스 만들기

파이썬에서 클래스를 정의하려면 class 키워드를 사용합니다. 클래스 이름은 관례적으로 대문자로 시작하는 것이 좋습니다. 클래스 내부에는 속성(멤버 변수)과 메서드(멤버 함수)를 정의할 수 있습니다.

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

3. 생성자

파이썬에서 생성자(Constructor) 클래스의 인스턴스가 생성될  자동으로 호출되는 특별한 메서드입니다생성자는 객체의 초기화를 담당하며객체가 생성될  필요한 속성을 초기화하고 설정하는 역할을 합니다파이썬에서 생성자 메서드는 __init__라고 이름이 정해져 있습니다. 즉, 생성자는 객체의 초기 상태를 설정하는 역할을 하며, 클래스를 인스턴스화할 때 자동으로 호출됩니다.

class Person:
    # 생성자 정의
    def __init__(self, name, age):
        self.name = name  # 객체의 name 속성을 초기화
        self.age = age    # 객체의 age 속성을 초기화

# Person 클래스의 인스턴스(객체) 생성
person1 = Person("Alice", 30)
person2 = Person("Bob", 25)

# 객체의 속성에 접근
print(person1.name)  # "Alice" 출력
print(person2.age)   # 25 출력

class 내부에 메소드를 만들 때는 무조건 self를 꼭 넣어줍니다. 메소드는 공유해서 쓰는 것이기 때문에 어떤 객체가 메소드를 불렀는지 알기 위해서 self 매개변수를 넣어주는 것입니다. 

class Dog:
    def __init__(self,name,age,nickname='닉네임 없음'):
        self.name = name
        self.age = age
        self.nickname = nickname
# Rucy = Dog() # TypeError: Dog.__init__() missing 2 required positional arguments: 'name' and 'age'
Rucy = Dog('루시', 14)

print(Rucy.name)              >> 루시
print(Rucy.age)                 >> 14
print(Rucy.nickname)        >> 닉네임 없음

4. 메서드

메서드(Method)는 객체지향 프로그래밍(OOP)에서 사용되는 함수와 비슷한 개념이지만, 클래스 내부에 정의되어 특정 객체에 연결된 함수입니다. 메서드는 해당 클래스의 모든 객체에서 공유되며, 객체의 동작을 정의하거나 특정 작업을 수행하는 데 사용됩니다.

class Counter:
    def __init__(self):
        self.num = 0

    def increment(self):
        self.num += 1

    def decrement(self):
        self.num -= 1

    def current_value(self):
        return self.num

    def reset(self):
        self.num = 0
 
KBbank = Counter()
print(KBbank.num)                     >> 0
print(KBbank.current_value())    >> 0
KBbank.increment()
print(KBbank.current_value())    >> 1
KBbank.increment()
print(KBbank.current_value())    >> 2
 
HanaBank = Counter()
HanaBank.current_value()         >> 0
HanaBank.increment()
HanaBank.increment()
HanaBank.increment()
HanaBank.current_value()           >> 3
 
print(KBbank.current_value())      >> 2
KBbank.reset()
print(KBbank.current_value())      >> 0
print(HanaBank.current_value())  >> 3

***메서드 타입

  • 인스턴스 메서드(Instance Method): 객체의 상태를 조작하거나 객체에 특정 작업을 수행하는 메서드입니다. 대부분의 클래스 메서드는 인스턴스 메서드입니다. 위의 예제에서 보여진 __init__ 메서드도 인스턴스 메서드입니다.
  • 클래스 메서드(Class Method): 클래스 레벨에서 동작하며, 모든 인스턴스가 공유하는 메서드입니다. 클래스 메서드는 @classmethod 데코레이터를 사용하여 정의하며, 첫 번째 매개변수로 cls를 사용합니다.
  • 정적 메서드(Static Method): 특정 클래스나 인스턴스와 관련이 없는 메서드로, 클래스 내부에 정의되어 있지만 클래스나 인스턴스와 독립적으로 호출될 수 있습니다. 정적 메서드는 @staticmethod 데코레이터를 사용하여 정의합니다.

***클래스 메서드와 정적 메서드는 객체를 호출하지 않아도 데코레이터를 이용하여 독립적으로 동작시킬 수 있습니다. 따라서 메모리를 효과적으로 사용할 수 있습니다. 클래스 메서드는 클래스 변수에 접근하고 수정 할 수 있지만, 정적 메서드는 클래스나 인스턴스에 대한 참조가 없으므로 클래스 변수를 수정하지 못합니다. 

 

예를 들어, 스피킹이라는 클래스 안에 레벨이라는 클래스 변수와, 알파벳 종류라는 클래스 변수가 있습니다. 그리고 광범위한 회화 인스턴스 메서드들이 있습니다. 클래스 메서드는 레벨이라는 클래스 변수를 변경하거나, 알파벳 종류를 변경하는 메서드를 예로 들 수 있습니다. 정적 메서드는 다른 인스턴스나 변수와는 독립적인 동작, 예를 들면 문법 유효성 검사같은 메서드를 예로 들 수 있습니다. 둘 다 객체를 호출하여 커다란 클래스를 모두 메모리에 올리지 않아도 해당 메소드만 사용하는 것이 가능합니다.

 

class Calculator:
    num = 1 # 클래스 변수

    def add(self,x, y):
        return x + y
    @classmethod
    def subtract(cls, x, y):
        return x - y / cls.num
    @staticmethod
    def multiply(x,y):
        return x * y
calc = Calculator()

# 인스턴스 메소드
result1 = calc.add(5,3)
print(result1)

# 클래스 메서드 호출
result2 = Calculator.subtract(10,4)
print(result2)

# 정적 메소드 호출

result3 = Calculator.multiply(6,2)
print(result3)

※ 클로저

외부 함수가 있고 내부 함수가 있을 떄, 외부 함수의 리턴값이 내부 함수인 것을 의미합니다. 

클로저는 함수의 내부에서 정의된 함수로내부 함수가 외부 함수의 변수에 접근할  있고외부 함수는 내부 함수를 반환할  있습니다이로 인해 함수와  함수가 참조하는 상태(변수) 함께 저장하고 유지할  있습니다.

def mul(m):
    def wrapper(n):
        return m * n
    return wrapper
 
A = mul(2)
print(A(10))      >> 20

※ 데코레이터

데코레이터(Decorator)는 파이썬에서 함수나 메서드의 동작을 수정하거나 확장하기 위한 강력한 도구입니다. 데코레이터는 함수나 메서드를 래핑하거나 감싸서 추가 기능을 제공하며, 코드 재사용성과 가독성을 향상시킵니다. 데코레이터는 @ 기호를 사용하여 함수나 메서드 위에 적용됩니다.

import time
 
def func1(a, b):
    result = a + b
    return result

def func2(a, b):
    result = a * b
    return result
 
def elapsed(func):
    def wrapper(a,b):
        start = time.time()
        print('함수가 시작되었습니다.')

        result = func(a,b)

        end = time.time()
        print(f'함수 수행시간:{end - start}')
        return result
    return wrapper
 
 # 클로저가 있어야만 데코레이터를 만들 수 있음.
 
@elapsed
def func1(a, b):
    result = a + b
    return result
 
@elapsed
def func2(a, b):
    result = a * b
    return result
 

'파이썬' 카테고리의 다른 글

super()메소드와 다중상속  (0) 2023.09.13
상속  (0) 2023.09.13
콜백 함수/람다함수/재귀호출  (0) 2023.09.12
사용자 정의 함수  (0) 2023.09.10
제어문-반복문  (0) 2023.09.08