본문 바로가기

Python

Chapter 8 : Python - Class ( __init__, self, instance, inheritance)


클래스는 객체 지향 프로그래밍에서 중요한 개념입니다.
클래스는 객체를 만들기 위한 설계도 또는 템플릿으로 생각할 수 있습니다.
클래스는 속성(attribute)메서드(method)로 구성됩니다.
오늘은 파이썬의 클래스에 대해 공부한 내용을 포스팅할까 합니다.

클래스를 사용하는 이유는
코드의 재사용성과 유지보수성을 높이기 위해서입니다.
클래스를 정의하고 객체를 생성하면
해당 클래스의 속성과 메서드를 사용할 수 있습니다.
객체마다 속성의 값은 다를 수 있지만,
속성에 접근하는 방법과 메서드를 호출하는 방법은 동일합니다.


클래스 생성과 초기화


클래스를 생성하고 초기화하는 기능은 __init__ 메서드를 사용하며
파이썬에서 이를 생성자라고 합니다.
이 메서드는 객체가 생성될 때 자동으로 호출되며, 객체의 초기 상태를 설정합니다.
예를 들어, 아래의 코드는 Person 클래스를 생성하고
이름과 나이를 초기화하는 예제입니다.

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

person1 = Person("Alice", 25)
print(person1.name)  
print(person1.age)  


위의 코드는 Person이라는 클래스를 정의하고,
해당 클래스에는 nameage라는 두 개의 속성이 있습니다.
속성은 self.nameself.age로 정의되며,
인스턴스 생성 시 전달된 값으로 초기화됩니다.

person1이라는 객체를 Person 클래스의 인스턴스로 생성하고,
생성자에는 name으로 Alice가, age25가 전달됩니다.

이후 person1.nameperson1.age를 출력하는 코드가 있습니다.
이는 person1 객체의 name 속성과 age 속성의 값을 출력하는 것입니다.
따라서 위의 코드는 Alice25를 출력합니다.


예제코드 출력결과


Self 인자


클래스 내에서 self현재 인스턴스를 참조하는 데 사용되는 특별한 인자입니다.
self클래스 내의 메서드(함수) 정의 시 첫 번째 매개변수로 선언됩니다.
self를 통해 인스턴스의 속성에 접근하고 수정할 수 있으며,
클래스 내부의 다른 메서드를 호출할 수도 있습니다.
예를 들어, 아래와 같은 클래스가 있다고 가정해봅시다.

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

    def say_hello(self):
        print("안녕하세요, 저는", self.name, "입니다.")

person1 = Person("John")
person1.say_hello()


위의 예제에서 self.name은 인스턴스의 속성을 나타냅니다.
__init__ 메서드에서 self.name은 인스턴스 변수 name에 할당되고,
say_hello 메서드에서 self.name은 해당 인스턴스의 name 속성을 출력합니다.

클래스의 인스턴스를 생성하고 메서드를 호출할 때는
self 인자에 대해 걱정할 필요가 없습니다.
파이썬에서는 이를 자동으로 처리해주기 때문입니다.
그러므로 person1.say_hello()와 같이 메서드를 호출하면,
self 인자에는 person1 인스턴스가 전달됩니다.

예제코드 출력결과

Self 인자를 사용하지 않다면?


클래스의 메서드를 정의할 때 self를 생략하면
해당 메서드는 인스턴스 메서드가 아닌 일반 함수로 취급됩니다.
이 경우 메서드 내에서 인스턴스의 속성에 접근하거나 수정할 수 없습니다.
또한, 다른 인스턴스 메서드를 호출할 수도 없습니다.
예를 들어, 다음과 같은 예제를 살펴봅시다

class Person:
    def __init__(name):
        name = name

    def say_hello():
        print("안녕하세요, 저는", name, "입니다.")

person1 = Person("John")
person1.say_hello()


위의 예제에서 __init__ 메서드와 say_hello 메서드에서 self를 생략했습니다.
이 경우 name 변수는 메서드 내에서 정의된 지역 변수로 취급되므로
인스턴스의 속성으로 사용할 수 없습니다.
따라서 person1.say_hello()를 호출하면
name 변수를 찾을 수 없다는 오류가 발생합니다.

따라서 클래스의 메서드를 정의할 때는 self를 사용하여
인스턴스를 참조하고 속성에 접근하는 것이 중요합니다.
이를 통해 인스턴스 간의 데이터 공유와 메서드 호출이 가능해집니다.

예제코드 출력결과(오류 메세지)

메서드 추가


클래스에 메서드를 추가하여 특정 동작을 정의할 수 있습니다.
메서드는 클래스 내에서 정의된 함수이며, 클래스의 속성에 접근할 수 있습니다.
예를 들어, 아래의 코드는 Person 클래스에 introduce 메서드를 추가하고,
해당 메서드를 호출하여 자기 소개를 하는 예제입니다.

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

    def introduce(self):
        print("안녕하세요, 저는 {}이고 {}살입니다.".format(self.name, self.age))

person1 = Person("Alice", 25)
person1.introduce()  


위의 코드는 Person 클래스를 정의하고,
이를 활용하여 person1 이라는 인스턴스를 생성한 뒤,
person1.introduce()를 호출하여 자기 소개를 출력하는 예시입니다.
Person 클래스는 이름(name)나이(age)를 가진 사람을 나타내는 클래스로,
생성자(__init__)를 통해 인스턴스 변수를 초기화하고,
introduce 메서드를 통해 자기 소개를 할 수 있습니다.
이를 통해 person1 인스턴스는 Alice라는 이름과 25세라는 나이를 가지며,
자기 소개를 출력합니다.

예제코드 출력결과

상속


상속을 통해 기존 클래스를 확장하고 새로운 클래스를 만들 수 있습니다.
상속은 기존 클래스의 속성과 메서드를 자식 클래스가 물려받게 해줍니다.
예를 들어, 아래의 코드는 Student 클래스가
Person 클래스를 상속받는 예제입니다.

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

    def introduce(self):
        print("안녕하세요, 저는 {}이고 {}살입니다.".format(self.name, self.age))

class Student(Person):
    def __init__(self, name, age, school):
        super().__init__(name, age)  # 부모 클래스의 초기화 메서드 호출
        self.school = school

student1 = Student("Bob", 20, "ABC High School")
student1.introduce() 
print(student1.school) 


먼저, Person 클래스는 이름과 나이를 가지는 사람을 나타내는 클래스입니다.
__init__메서드를 통해 인스턴스를 생성할 때 이름과 나이를 초기화합니다.
그리고 introduce 메서드를 호출하면
해당 인스턴스의 이름과 나이를 출력합니다.

그 다음으로, Student 클래스는 Person 클래스를 상속받은 클래스입니다.
이것은 Student 클래스가 Person 클래스의
속성과 메서드를 상속받는다는 의미입니다.
Student 클래스의 __init__ 메서드는 상속받은 __init__ 메서드를 호출하여
이름과 나이를 초기화하고, 추가로 학교라는 속성을 초기화합니다.

실제로 코드에서는 student1 이라는 이름으로
Student 클래스의 인스턴스를 생성합니다.
생성자에는 Bob 이라는 이름, 20이라는 나이,
그리고 ABC High School이라는 학교를 전달합니다.

그리고 student1.introduce() 를 호출하여
student1 인스턴스의 introduce 메서드를 실행하면,
해당 학생의 이름과 나이가 출력됩니다.

또한, student1.school 을 통해 student1 인스턴스의
school 속성인 ABC High School 을 출력할 수 있습니다.

예제코드 출력결과

오늘은 파이썬의 클래스, 클래스 상속에 대한 내용을 포스팅했는데요,
개인적으로 지금까지 배운 내용중에 제일 어렵더라구요..
개념자체가 도저히 이해가 안간다 이런건 아닌데
클래스 사용법이 미숙하달까.. 그래서 다음 포스팅은
아마 클래스를 활용하는 자체 실습과제가 올라갈 것 같습니다!
더욱 숙달해서 좋은 포스팅 올려보겠습니다:)
오늘은 여기까지!

출처 : https://youtu.be/kWiCuklohdY
필자는 해당 링크 영상을 통해 학습하였으나,
포스팅 내용 및 설명은 영상과 다를 수 있음을 알립니다.