반응형

목차

  1. 상속(Inheritance)
  2. isinstance() 함수
  3. str() 함수
  4. 클래스 변수
  5. 클래스 매서드

상속(Inheritance)

상속은 객체 지향 프로그래밍의 핵심 개념으로, 클래스가 부모(베이스) 클래스로부터 속성 및 메서드를 상속할 수 있게 해줍니다. 이를 통해 코드의 재사용성과 모듈성을 촉진하여 해당 기능을 명시적으로 재정의하지 않고도 기존 클래스의 일부 또는 모든 기능을 갖춘 새 클래스를 만들 수 있습니다.

Python에서 상속은 클래스 정의에서 새 클래스 이름 뒤에 괄호 안에 부모 클래스를 지정하는 방식으로 이루어집니다. 다음은 Python의 상속 개념에 대한 개요입니다:

1. 서브클래스(파생 클래스) 만들기
부모 클래스로부터 상속하는 서브클래스를 만들려면 서브클래스 이름 뒤에 괄호 안에 부모 클래스를 지정합니다.

class Animal:
    def speak(self):
        print("동물이 소리를 냅니다.")

class Dog(Animal):
    def bark(self):
        print("멍!")


이 예제에서 Dog 클래스는 Animal 클래스의 서브클래스이며, Animal에서 speak 메서드를 상속받습니다.

2. 메서드 오버라이딩
하위 클래스가 부모 클래스에서 상속한 메서드에 대한 새로운 구현을 제공해야 하는 경우 하위 클래스에서 메서드를 재정의하여 이를 수행할 수 있습니다. 이를 메서드 오버라이딩이라고 합니다.

class Animal:
    def speak(self):
        print("동물이 소리를 냅니다.")

class Dog(Animal):
    def speak(self):
        print("멍!")


이 예제에서 Dog 클래스는 Animal에서 상속된 speak 메서드를 재정의합니다. Dog 객체에서 speak 메서드를 호출하면 "동물이 소리를 냅니다." 대신 "멍!"가 출력됩니다.

3. super() 함수
super() 함수는 부모 클래스의 메서드를 호출하는 데 사용되며, 일반적으로 부모 클래스의 구현을 재정의하는 메서드에서 사용됩니다. 이 함수는 부모 클래스의 동작을 완전히 대체하는 대신 확장하려는 경우에 유용합니다.

class Animal:
    def __init__(self, name):
        self.name = name

class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name)
        self.breed = breed


이 예제에서 Dog 클래스의 생성자(__init__)는 super().__init__(name)을 사용하여 Animal 클래스의 생성자를 호출합니다. 이렇게 하면 Dog 클래스가 자체 breed 속성을 추가하기 전에 이름 속성이 부모 클래스에서 올바르게 초기화됩니다.

재사용 가능하고 확장 가능한 코드를 작성하고 잘 구성된 구조로 복잡한 애플리케이션을 구축하려면 Python에서 상속을 이해하는 것이 중요합니다.


isinstance() 함수

isinstance() 함수는 객체가 특정 클래스의 인스턴스인지 아니면 클래스의 튜플인지 확인하는 데 사용되는 내장 파이썬 함수입니다. 이 함수는 객체의 유형을 확인하거나 특정 클래스의 서브클래스인지 확인해야 할 때 유용하게 사용할 수 있습니다. 일반적으로 객체의 유형에 따라 다른 코드를 실행하려는 상황에서 사용됩니다.

isinstance() 함수의 구문은 다음과 같습니다.

isinstance(object, class_or_tuple)

 

  • 객체(object): 확인하려는 객체입니다.
  • 클래스_또는_튜플(class_or_tuple): 확인하려는 클래스 또는 클래스의 튜플입니다.

객체가 지정된 클래스(또는 튜플에 있는 클래스 중 하나)의 인스턴스이거나 해당 클래스의 하위 클래스의 인스턴스인 경우 이 함수는 True를 반환합니다. 그렇지 않으면 False를 반환합니다.

 

class Animal:
    pass

class Dog(Animal):
    pass

class Cat(Animal):
    pass

dog = Dog()

print(isinstance(dog, Dog))      # 출력: True
print(isinstance(dog, Animal))   # 출력: True
print(isinstance(dog, Cat))      # 출력: False
print(isinstance(dog, (Dog, Cat))) # 출력: True


이 예제에서 isinstance() 함수는 dog이 Dog, Animal 및 Cat 클래스의 인스턴스인지, 클래스의 튜플(Dog, Cat)인지 확인하는 데 사용됩니다. 개 개체가 Animal의 하위 클래스인 Dog 클래스의 인스턴스이므로 이 함수는 Dog 및 Animal에 대해 True를 반환합니다. 개 개체가 Cat 클래스의 인스턴스가 아니므로 이 함수는 Cat에 대해 False를 반환합니다. 마지막으로, 개 개체가 튜플에 있는 클래스 중 하나의 인스턴스이기 때문에 튜플(Dog, Cat)에 대해 True를 반환합니다.


str() 함수

str() 함수는 객체를 문자열 표현으로 변환하는 데 사용되는 기본 제공 Python 함수입니다. 객체를 인수로 사용하여 호출하면 해당 객체의 사람이 읽을 수 있는 버전인 문자열을 반환합니다. 이 함수는 객체의 값을 표시하거나 문자열을 연결하거나 기타 문자열 연산을 수행하려는 경우에 유용할 수 있습니다.

str() 함수의 구문은 다음과 같습니다:

str(object)


객체(object): 문자열로 변환하려는 객체입니다.


이 함수는 객체의 문자열 표현을 반환합니다.

number = 42
string_number = str(number)
print(string_number) # 출력: '42'

pi = 3.14159265
string_pi = str(pi)
print(string_pi) # 출력: '3.14159265'


str() 함수는 문자열이 아닌 객체를 표시하기 위해 print() 함수를 사용하거나 객체에 형식 문자열 구문을 사용할 때 암시적으로 호출되기도 합니다.

number = 42
print(f"답은 {number}입니다.") # 출력: 답은 42입니다.

pi = 3.14159265
print("파이의 값은 약", pi) # 출력: 파이의 값은 약 3.14159265입니다.


이 예제에서는 숫자(number) 및 파이(pi) 객체를 문자열 표현으로 변환하기 위해 str() 함수가 암시적으로 호출됩니다. 이를 통해 print() 함수를 사용하여 표시하거나 형식이 지정된 문자열에 통합할 수 있습니다.


클래스 변수

클래스 변수는 클래스의 모든 인스턴스가 공유하는 속성입니다. 클래스 변수는 메서드 외부의 클래스 본문 내에 정의되며, 일반적으로 선언 시 값이 할당됩니다. 클래스 변수는 클래스 어트리뷰트 또는 정적 변수라고도 합니다.

각 객체에 대해 별도의 값을 갖는 인스턴스 변수와 달리 클래스 변수는 클래스의 모든 인스턴스에 대해 동일한 값을 갖습니다. 클래스 변수가 수정되면 변경 사항은 클래스의 모든 인스턴스에 영향을 미칩니다.

다음은 클래스 변수의 개념을 설명하기 위한 예시입니다:

class Employee:
    # 클래스 변수
    회사 = "예시 Inc"

    def __init__(self, name, position):
        # 인스턴스 변수
        self.name = name
        self.position = position

employee1 = Employee("Alice", "소프트웨어 엔지니어")
employee2 = Employee("Bob", "제품 관리자")

print(employee1.company) # 출력: 예시 Inc.
print(employee2.company) # 출력: 예시 Inc.


이 예제에서 company는 클래스 변수이고 name과 position은 인스턴스 변수입니다. 회사 변수는 Employee 클래스의 모든 인스턴스가 공유하므로 employee1과 employee2 모두 회사 값이 동일합니다.

클래스 변수의 값을 수정하려면 클래스 이름 뒤에 변수 이름을 사용하면 됩니다:

Employee.company = "새 예시 Inc."

print(employee1.company) # 출력: 새 예시 Inc.
print(employee2.company) # 출력: 새 예시 Inc.


이 경우 클래스 변수 company를 업데이트하면 새 값이 모든 인스턴스 간에 공유되므로 Employee 클래스의 모든 인스턴스에 영향을 미칩니다.

클래스 변수를 이해하면 클래스의 모든 인스턴스에서 일관성이 있어야 하는 데이터를 저장할 수 있으므로 파이썬에서 클래스를 설계하는 데 필수적입니다.


클레스 메서드

클래스 메서드 또는 정적 메서드라고도 하는 클래스 함수는 클래스의 인스턴스가 아닌 클래스에 속하는 함수입니다. 이러한 메서드는 인스턴스의 상태에 의존하지 않으므로 인스턴스 변수나 메서드에 액세스할 수 없습니다. 대신 클래스 메서드는 클래스 변수와 함께 작동하거나 인스턴스의 상태와 독립적인 작업을 수행합니다.

파이썬에는 클래스 메서드와 정적 메서드라는 두 가지 유형의 클래스 함수가 있습니다. 둘 다 클래스 내에 정의되지만 동작과 사용 사례가 다릅니다:

1. 클래스 메서드
클래스 메서드는 클래스 자체를 첫 번째 인수로 받는 함수로, 보통 cls라는 이름을 가집니다. 클래스 메서드를 정의하려면 메서드 정의 위에 @classmethod 데코레이터를 사용합니다. 클래스 메서드는 클래스 변수에 액세스하고 수정할 수 있으며, 일반적으로 특정 인스턴스가 필요하지 않은 연산에 사용됩니다.

MyClass 클래스:
    class_var = 0

    @classmethod
    def increment_class_var(cls):
        cls.class_var += 1

MyClass.increment_class_var()
print(MyClass.class_var) # 출력: 1


이 예제에서 increment_class_var() 클래스 메서드는 클래스 cls를 첫 번째 인수로 받고 클래스 변수 class_var를 1씩 증가시킵니다.

2. 정적(Static) 메서드
정적 메서드는 클래스나 인스턴스를 첫 번째 인자로 받지 않는 함수입니다. 정적 메서드는 @staticmethod 데코레이터를 사용하여 클래스 내에서 정의됩니다. 정적 메서드는 클래스 또는 인스턴스 변수에 직접 액세스하거나 수정할 수 없습니다. 정적 메서드는 인스턴스나 클래스의 상태에 의존하지 않는 유틸리티 함수나 기타 연산에 사용됩니다.

MyClass 클래스:
    @staticmethod
    def utility_function(arg1, arg2):
        return arg1 * arg2

result = MyClass.utility_function(2, 3)
print(result) # 출력: 6


이 예제에서 유틸리티_함수() 정적 메서드는 두 개의 인자 arg1과 arg2를 받아 그 곱을 반환합니다. 이 메서드는 호출할 MyClass의 인스턴스가 필요하지 않으며 인스턴스나 클래스 변수에 액세스하지 않습니다.

클래스 함수를 이해하면 특정 인스턴스나 클래스 상태에 의존하지 않는 메서드를 만들 수 있으므로 파이썬에서 깔끔하고 효율적인 코드를 작성하는 데 중요합니다. 이를 통해 코드를 더 잘 정리하고 유지 관리성을 개선할 수 있습니다.


반응형