혼자보기위한python🌘클래스1️⃣

이풀싹·2023년 5월 31일
0

파이썬_BASIC

목록 보기
9/13
post-thumbnail

◉_◉?

1️⃣ 클래스(Class)

class MyClass:
    var="hi"
    def sayHello(self):
        print(self.var)

obj=MyClass()
print(obj.var)
obj.sayHello()

MyClass 클래스의 생성자를 사용하여 obj라는 객체를 생성합니다. obj.var을 사용하여 obj의 var 속성에 접근하고 출력합니다. 마지막으로 obj.sayHello()를 호출하여 obj의 sayHello() 메서드를 실행하면 "hi"가 콘솔에 출력됩니다.

위 코드를 실행하면 다음과 같은 결과가 출력됩니다:

output :

hi
hi

2️⃣ 클래스 멤버 vs 인스턴스 멤버

클래스 멤버인스턴스 멤버는 클래스 내에서 사용되는 변수 또는 속성을 나타냅니다.

💛클래스 멤버(Class Member):

클래스 멤버는 클래스 자체에 속하는 변수이며, 모든 인스턴스에서 공유됩니다. 클래스 정의 내부에서 선언되며, 모든 인스턴스에 의해 공유되어 동일한 값을 가지게 됩니다. 클래스 멤버는 클래스명.멤버명으로 접근할 수 있습니다.

예시:

class MyClass:
    class_variable = "I am a class variable"

obj1 = MyClass()
obj2 = MyClass()

print(obj1.class_variable)  # 출력: I am a class variable
print(obj2.class_variable)  # 출력: I am a class variable

💛인스턴스 멤버(Instance Member):

인스턴스 멤버는 클래스의 각 인스턴스마다 개별적으로 소유하는 변수입니다. 즉, 인스턴스마다 고유한 값을 가질 수 있습니다. 인스턴스 멤버는 인스턴스 생성 후 self.멤버명으로 접근할 수 있습니다.

예시:

class MyClass:
    def __init__(self):
        self.instance_variable = "I am an instance variable"

obj1 = MyClass()
obj2 = MyClass()

print(obj1.instance_variable)  # 출력: I am an instance variable
print(obj2.instance_variable)  # 출력: I am an instance variable

클래스는 특정 속성(attribute) 메서드(method)를 가지며, 이러한 속성과 메서드는 해당 클래스의 인스턴스에 의해 공유됩니다. 클래스의 인스턴스를 생성하면 해당 인스턴스는 클래스의 속성과 메서드를 갖게 되고, 이를 통해 데이터를 저장하고 기능을 실행할 수 있습니다.

예를 들어, MyClass라는 클래스를 정의하면 MyClass는 특정 속성과 메서드를 가지게 됩니다. 이후 obj = MyClass()와 같이 클래스의 인스턴스를 생성하면 obj는 MyClass의 속성과 메서드를 가진 개별 객체가 됩니다. 이 인스턴스는 클래스의 정의에 따라 데이터를 저장하고 메서드를 실행할 수 있습니다.

따라서, 클래스는 객체를 생성하기 위한 템플릿이며, 인스턴스는 실제로 생성된 개별 객체를 의미합니다. 인스턴스는 클래스의 속성과 메서드를 공유하면서 독립적인 데이터와 상태를 가질 수 있습니다.

class MyClass:
    var="hi"
    def sayHello(self):
        print(self.var)

obj=MyClass()
print(obj.var)
obj.sayHello()
  • self 가 뭐야 ?

self는 파이썬에서 인스턴스 메서드를 정의할 때 사용되는 특별한 매개변수입니다. self는 현재 객체(인스턴스) 자신을 참조하는데 사용되며, 해당 객체의 속성이나 메서드에 접근할 수 있게 해줍니다.

예를 들어, MyClass 클래스의 sayHello 메서드에서 self.var을 사용하면 해당 메서드를 호출한 인스턴스의 var 속성에 접근할 수 있습니다. self는 호출된 인스턴스를 가리키므로, 각 인스턴스마다 고유한 var 값을 사용할 수 있습니다.

따라서, obj=MyClass()으로 인스턴스를 생성하고 obj.sayHello()를 호출하면 sayHello 메서드 내에서 self.var은 obj의 var 속성을 의미하게 됩니다.

output:

hi
hi

class MyClass:
    def sayHello():
        print("안녕하세요!")

    def sayBye(name):
        print("%s! 다음에 또 보자!!"%name)

obj=MyClass()
obj.sayHello()
obj.sayBye(묭시리)
  • 에러가 난 이유

위의 코드에서 오류가 발생하는 이유는 메서드 정의 시 첫 번째 매개변수로 self를 명시하지 않았기 때문입니다. 파이썬에서 클래스의 메서드는 첫 번째 매개변수로 항상 self를 가지는데, 이를 통해 메서드가 호출된 인스턴스를 참조할 수 있습니다.

올바른 코드는 다음과 같이 self를 사용하여 메서드를 정의해야 합니다:

class MyClass:
    def sayHello(self):
        print("안녕하세요!")

    def sayBye(self, name):
        print("%s! 다음에 또 보자!!" % name)

obj = MyClass()
obj.sayHello()
obj.sayBye("묭시리")

output:

안녕하세요!
묭시리! 다음에 또 보자!!

class MyClass:
    def __init__(self):
        self.var="안뇽"
        print('MyClass 인스턴스 객체가 생성됨 ~_~')

obj=MyClass()
print(obj.var) 

__init__ 메서드는 파이썬에서 클래스의 생성자로 사용되며, 인스턴스가 생성될 때 자동으로 호출됩니다. 위 코드에서 MyClass 클래스의 init 메서드는 인스턴스가 생성될 때 실행되어 self.var 속성을 "안뇽"으로 초기화하고, "MyClass 인스턴스 객체가 생성됨 _"을 출력합니다.

다음으로 obj=MyClass()을 통해 MyClass의 인스턴스인 obj를 생성하고, obj.var을 출력합니다. 이때 obj.var은 MyClass 인스턴스의 var 속성에 접근하는 것이며, init 메서드에서 초기화된 "안뇽"이 출력됩니다.

output:

MyClass 인스턴스 객체가 생성됨 ~_~
안뇽

3️⃣ 클래스 생성자(__init__())

클래스의 생성자는 클래스의 인스턴스가 생성될 때 호출되는 특별한 메서드입니다. 생성자 메서드는 init()으로 정의되며, 클래스 내부에서 정의됩니다.

생성자는 인스턴스가 생성될 때 초기화 작업을 수행하는 역할을 합니다. 주로 인스턴스의 속성(attribute)을 초기화하거나, 필요한 설정을 수행하는 등의 작업을 담당합니다. 생성자는 인스턴스 객체가 생성될 때 자동으로 호출되며, 인스턴스를 초기화하는데 사용됩니다.

일반적으로 생성자는 다음과 같이 정의됩니다:

def __init__(self, 매개변수1, 매개변수2, ...):
    # 초기화 작업 수행
    # self를 통해 인스턴스의 속성을 설정

self는 생성되는 인스턴스 자체를 나타내는 매개변수입니다. 이를 통해 생성자 내부에서 인스턴스의 속성을 설정하거나, 다른 메서드를 호출할 수 있습니다. 생성자에서 정의된 속성은 인스턴스의 다른 메서드에서도 접근할 수 있습니다.

예를 들어, 다음과 같이 MyClass 클래스에 생성자를 정의할 수 있습니다:

class MyClass:
    def __init__(self, name):
        self.name = name
        print("인스턴스가 생성되었습니다.")

# MyClass의 인스턴스 생성
obj = MyClass("John")

위 코드에서 init 메서드는 self와 name이라는 매개변수를 가지고 있습니다. 이 생성자는 인스턴스 객체가 생성될 때 호출되어 self.name 속성을 name 매개변수로 초기화합니다. 마지막으로 "인스턴스가 생성되었습니다."라는 메시지가 출력됩니다.

이렇게 생성자를 사용하면 인스턴스를 생성할 때 필요한 초기화 작업을 수행할 수 있습니다. 생성자를 통해 인스턴스의 속성을 초기화하고, 인스턴스가 생성될 때 자동으로 실행되는 과정을 제어할 수 있습니다.


클래스의 인스턴스 생성이란, 클래스를 기반으로하여 실제로 객체를 만드는 과정을 말합니다. 클래스는 객체를 생성하기 위한 템플릿이라고 생각할 수 있고, 인스턴스는 이 템플릿을 기반으로 구체적인 개별 객체를 만드는 것입니다.

예를 들어, 다음과 같이 Person이라는 클래스를 정의합니다:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

위의 코드에서 Person 클래스는 name과 age라는 속성을 가지고 있습니다. 이제 이 클래스를 기반으로하여 인스턴스를 생성해보겠습니다:

person1 = Person("John", 25)
person2 = Person("Jane", 30)

위 코드에서 person1과 person2는 Person 클래스의 인스턴스입니다. Person 클래스의 생성자(init 메서드)를 호출하여 인스턴스를 생성하고, 해당 인스턴스는 name과 age라는 속성을 가지게 됩니다.

이제 각 인스턴스는 독립적인 데이터를 가지며, 해당 인스턴스의 속성에 접근할 수 있습니다. 예를 들어, person1.name은 "John"을 반환하고, person2.age는 30을 반환합니다.

클래스의 인스턴스 생성을 통해 동일한 클래스를 기반으로 여러 개의 개별 객체를 만들 수 있습니다. 각 인스턴스는 클래스의 속성과 메서드를 공유하면서 독립적인 데이터와 상태를 가질 수 있습니다.


4️⃣ 클래스 소멸자(__del__())

클래스 소멸자는 객체가 메모리에서 제거되기 전에 호출되는 특별한 메서드입니다. 소멸자 메서드는 __del__()로 정의되며, 클래스 내부에서 정의됩니다.

소멸자는 객체가 더 이상 필요하지 않을 때 수행해야 할 정리 작업을 처리하는 데 사용됩니다. 예를 들어, 파일이나 네트워크 연결과 같은 외부 자원을 사용하는 경우, 소멸자를 활용하여 해당 자원을 안전하게 종료하거나 해제할 수 있습니다.

일반적으로 소멸자는 다음과 같이 정의됩니다:

def __del__(self):
    # 정리 작업 수행
    # 메모리 해제, 파일 닫기 등

소멸자는 객체가 메모리에서 제거될 때 자동으로 호출되며, 개발자가 직접 호출하지 않습니다. 객체의 수명이 끝나면 파이썬 인터프리터가 자동으로 소멸자를 호출합니다.

다음은 소멸자의 예시입니다:

class MyClass:
    def __init__(self, name):
        self.name = name
    
    def __del__(self):
        print(f"인스턴스 {self.name}이(가) 소멸되었습니다.")

# MyClass의 인스턴스 생성
obj1 = MyClass("인스턴스 1")
obj2 = MyClass("인스턴스 2")

# obj1과 obj2의 참조를 제거하여 메모리에서 제거
del obj1
del obj2

위 코드에서 __del__ 메서드는 인스턴스가 소멸될 때 호출되어 인스턴스의 이름을 출력합니다. del 키워드를 사용하여 obj1과 obj2의 참조를 제거하면, 이후 파이썬 인터프리터가 해당 인스턴스들의 소멸자를 자동으로 호출합니다.

소멸자를 사용하면 객체가 소멸될 때 필요한 추가 작업을 수행할 수 있으며, 메모리 누수 등의 문제를 방지할 수 있습니다. 그러나 일반적으로는 소멸자를 직접 사용할 필요가 없으며, 파이썬의 가비지 컬렉터가 자동으로 메모리 관리를 처리해주기 때문에 명시적으로 메모리를 해제해야 할 때에만 사용하는 것이 좋습니다.


class Add:
    def add(self,n1,n2):
        return n1+n2

class Calculator(Add):
    def sub(self,n1,n2):
        return n1-n2
    
obj=Calculator()
print(obj.add(1,2))
print(obj.sub(1,2))
  • self 가 없으면 ?

self는 현재 객체를 가리키는 참조입니다. 클래스의 인스턴스 메서드를 호출할 때 self 매개변수를 통해 객체 자체를 전달합니다. self를 사용하여 클래스 내부의 속성이나 다른 메서드에 접근할 수 있습니다.

만약 self가 없는 경우, 해당 메서드는 인스턴스 메서드가 아닌 클래스 메서드(static method)로 간주됩니다. 클래스 메서드는 특정 객체에 바인딩되지 않고 클래스 자체에 속해 있으며, self를 통한 객체 참조가 없습니다. 클래스 메서드는 @staticmethod 데코레이터를 사용하여 정의되며, 클래스의 모든 인스턴스가 공유하는 동작을 수행합니다.

따라서, 위의 예제에서 self가 없는 add 메서드는 클래스 메서드로 간주됩니다. 이 경우, obj.add(1, 2)와 같이 인스턴스를 통해 호출하면 오류가 발생할 수 있습니다. obj 객체를 통해 클래스 메서드를 호출하려면 클래스 이름을 사용해야 합니다.

아래는 add 메서드를 클래스 메서드로 수정한 예시입니다:

class Add:
    @staticmethod
    def add(n1, n2):
        return n1 + n2

class Calculator(Add):
    def sub(self, n1, n2):
        return n1 - n2

obj = Calculator()
print(Calculator.add(1, 2))  # 클래스 메서드 호출
print(obj.sub(1, 2))

add 메서드를 @staticmethod로 데코레이팅하고, obj.add(1, 2) 대신 Calculator.add(1, 2)와 같이 클래스를 통해 호출하면 올바르게 동작합니다. sub 메서드는 여전히 인스턴스 메서드이므로 obj.sub(1, 2)와 같이 인스턴스를 통해 호출할 수 있습니다.


5️⃣ 상속

상속은 객체 지향 프로그래밍에서 클래스 간의 관계를 나타내는 개념입니다. 한 클래스가 다른 클래스의 특성과 동작을 상속받아 사용할 수 있도록 해줍니다. 상속은 코드 재사용성을 높이고 클래스 간의 계층 구조를 형성하여 코드를 구조화하는 데 도움을 줍니다.

예를 들어, "동물"이라는 클래스가 있다고 가정해봅시다. 이 클래스는 모든 동물의 공통 특성과 동작을 포함할 수 있습니다. 그리고 "개"라는 클래스와 "고양이"라는 클래스가 있을 때, 이 두 클래스는 "동물" 클래스를 상속받을 수 있습니다. 이렇게 상속을 받은 클래스들은 "동물" 클래스의 특성과 동작을 자동으로 상속받아 사용할 수 있습니다.

다중 상속은 한 클래스가 두 개 이상의 클래스로부터 상속받는 것을 의미합니다. 예를 들어, "개" 클래스가 "포유류" 클래스와 "애완동물" 클래스로부터 다중 상속을 받을 수 있습니다. 이 경우 "개" 클래스는 "포유류" 클래스의 특성과 동작, 그리고 "애완동물" 클래스의 특성과 동작을 모두 상속받아 사용할 수 있습니다.

다중 상속은 유용한 기능이지만 클래스 간의 복잡한 관계를 만들 수 있고 충돌이 발생할 수도 있으므로 주의해야 합니다. 충돌이 발생하는 경우 메서드나 속성의 우선순위를 결정해야 할 필요가 있습니다. 이러한 경우에는 메서드 해상도 순서(Method Resolution Order, MRO)라는 규칙을 따라 우선순위를 결정합니다.

다중 상속의 예시는 다음과 같습니다:

class Mammal:
    def walk(self):
        print("Walking")

class Pet:
    def play(self):
        print("Playing")

class Dog(Mammal, Pet):
    pass

dog = Dog()
dog.walk()  # "Walking" 출력
dog.play()  # "Playing" 출력

위의 예시에서 "Dog" 클래스는 "Mammal" 클래스와 "Pet" 클래스로부터 다중 상속을 받습니다. 그래서 "Dog" 객체는 "walk()" 메서드와 "play()" 메서드를 모두 사용할 수 있습니다.


class Add:
    def add(self,n1,n2):
        return n1+n2

class Multiply:
    def multiply(self,n1,n2):
        return n1*n2
    
class Calculator(Add,Multiply):
    def sub(self,n1,n2):
        return n1-n2
    
obj=Calculator()
print(obj.add(1,2))
print(obj.multiply(2,3))

💛 다중상속

위의 예시 코드는 다중 상속을 보여줍니다. "Add" 클래스와 "Multiply" 클래스는 각각 덧셈과 곱셈 기능을 제공합니다. 그리고 "Calculator" 클래스는 "Add" 클래스와 "Multiply" 클래스를 다중 상속받습니다. 이렇게 "Calculator" 클래스는 덧셈과 곱셈, 그리고 뺄셈 기능을 모두 가지고 있습니다.

output:

3
6

첫 번째 줄은 "add()" 메서드를 호출하여 1과 2를 더한 결과인 3을 출력합니다. 두 번째 줄은 "multiply()" 메서드를 호출하여 2와 3을 곱한 결과인 6을 출력합니다.

이처럼 다중 상속을 사용하면 여러 개의 클래스로부터 특성과 동작을 상속받아 하나의 클래스에서 모든 기능을 사용할 수 있습니다.

0개의 댓글