본문 바로가기
Study/Python

[기초문법] Class, Object(Instance), Method 이해

by 까망우동 2023. 2. 27.
반응형

Index

     

    Python 은 객체 지향 프로그래밍 (OOP) 이다. 객체(Object)가 무엇인지, 어떻게 만들어지는지 이해하기 위해서
    ① Class, Object, Instance 간의 정의와 관계에 대해 ② Class 를 구성하는 method 와 생성자, self 의 의미에 대해

    ③ Class 간에 상속방법에 대해 알아보자. 


    1. Class - Object(Instance) 관계 이해

     

    클래스(Class): " 변수와 함수로 이루어진 붕어빵 틀"

    객체를 생성하기 위한 설계도(blueprint)로, 객체가 가져야 하는 속성(attribute)과 메서드(method)를 정의한다.

     

    객체(Object):  " 클래스로 찍어낸 데이터" 

    클래스의 인스턴스(instance)로, 클래스에서 정의한 속성과 메서드를 갖는 데이터 요소이며, 객체는 메모리에 할당된 실체로서, 데이터(변수)와 해당 데이터를 처리하는 메서드를 포함한다.

     

    인스턴스(Instance): "클래스와 객체의 관계"

    클래스를 기반으로 실제로 생성된 객체를 가리키는 용어. 클래스는 객체를 생성하기 위한 설계도이고, 객체는 클래스를 기반으로 메모리에 할당된 데이터이며, 인스턴스는 클래스를 이용하여 생성된 객체를 가리킴

     

    이해를 쉽기 위해 예시코드 로 이해해보자. 

    class Dog:
        def __init__(self, name, age):
            self.name = name
            self.age = age
        def bark(self):
            print("Woof! My name is", self.name, "and I am", self.age, "years old.")

     

    위 코드에서, Dog 는 name, age 라는 속성(attribute)과 bark 라는 method 로 이루어진 틀 역할을 하는 Class 이다. 

    이제 Dog 라는 Class 를 이용해 객체(Object) 를 만들 수 있다. 

     

    my_dog = Dog("Fido", 3)
    my_dog.bark()
    print(my_dog.name) # 출력 Fido

     

    위 코드에서 my_dog 라는 하나의 객체(Object)가 만들어 졌고, Dog라는 Class 의 인스턴스라고 표현할 수 있다. 

    (즉 객체와 인스턴스는 어떻게보면 표현/관점의 차이이다 ) my_dog 객체는 Dog 클래스의 속성과 메서드를 모두 포함하므로 bark 메서드를 호출 할 수도 있고 name 속성을 반환할 수 있다.


    2. Class 를 구성하는 Method(메서드) 와 Constructor(생성자) 이해

    위 예시를 다시한번 가져와보면

     

    class Dog:
        def __init__(self, name, age):
            self.name = name
            self.age = age
        def bark(self):
            print("Woof! My name is", self.name, "and I am", self.age, "years old.")
        def barrk():
            print("Wall!!")

     

    메서드(Method)

    - 예시에서 bark 와 같이, 메서드는 클래스 안에서 생성되는 함수를 의미한다.

    ★ 여기서 중요한건, Python 에서 함수(function) vs 메서드(Method) 의 차이점이 명확하다는 것이다. 

    함수라는건 내장/외장/사용자정의/lambda 형식으로 구분되는 어디서나 반복적으로 쓸 수 있는 코드이고, 

    메서드는 특정 클래스내에 정의된 함수로 메서드가 함수에 표현된다고도 할 수 있겠다.

    - 매서드는 크게 ①인스턴스 매서드와 ②클래스 매서드 (static 매서드) 두가지로 구분한다. 

    • ①인스턴스 메서드를 호출할때는 인스턴스 변수를 통해 호출한다. (my_dog.bark() 와 같이..) 
    • ①인스턴스 메서드의 첫 번째 매개변수는 항상 클래스 인스턴트 자신(self) 이다. ★
    • self 가 없는 메서드는 클래스 메서드 (barrk), self 가 있는 메서드(bark)는 인스턴스 메서드 (인스턴스가 꼭 필요함) 
    • ②클래스 매서드(barrk) 는 Class로만 호출가능 (Dog.barrk() 와 같이..)

     

    생성자(Constructor)

    Class 를 통해 객체를 생성할 때 자동으로 (첫 번째로) 호출되는 특별한 매서드

    • __init__ 로 표현된다 (모든 class 에 필수는 아님)
    • 객체 생성시 객체를 초기화 
    • 객체 생성시 객체의 속성(예시에서 name,age)을 생성함

    3. Class 간 상속

    Class 의 상속이란, 부모 클래스(parent,super,base class) → 자식 클래스(child,sub,derived class) 로 기능을 그대로 물려받으면서 다른 기능을 더 추가할 수 있도록 하는 것이다. 

     

     

    아래 예시코드를 보며 이해해보자.

    • Class 의 상속은 ChildClass(ParentClass) 형태로 만들고, Child 는 Parent 의 모든 속성과 메소드를 상속받는다. 
    • super() 함수를 사용하면, 부모 클래스의 속성과 메소드를 호출할 수 있다. 
    • super().__init__() 의 역할은 부모 클래스의 init 을 자식 클래스에서 실행한다는 의미 

     

    class ParentClass:
        height = "키" 
        def __init__(self, name, weight):
            self.name = name
            self.weight = weight
    
        def speak(self):
            print("Hello, my name is", self.name)
    
    class ChildClass(ParentClass):
        def __init__(self, name, age):
            super().__init__(name, 80)  # line10 의 의미는 ParentClass 의 __init__ 메서드 호출
            self.age = age
    
        def walk(self):
            print(self.name, "is walking")
    
    person = ChildClass("John", 30)
    person.speak()  # 출력: Hello, my name is John
    person.walk()  # 출력: John is walking
    print(person.height) # 출력: 키
    print(person.weight) # 출력: 80

     

     

    반응형

    댓글