티스토리 뷰

목차



    Python Logo

     

    Python을 공부하면서 함수에 익숙해졌다면, 이제는 클래스에 대해 알아볼 차례입니다. 클래스는 Python에서 객체지향 프로그래밍(OOP)의 핵심을 이루는 개념으로, 현실 세계의 객체를 코드로 모델링할 수 있게 해줍니다. 15년 차 개발자로서, 저도 처음엔 클래스와 객체라는 개념이 다소 추상적이고 이해하기 어려웠습니다. 하지만, 클래스를 제대로 이해하고 나면 코드의 재사용성, 유지보수성, 확장성이 크게 향상됩니다. 이번 글에서는 Python의 클래스를 이해하고, 이를 실제로 어떻게 사용하는지 쉽게 설명해드리겠습니다. 조금 어렵게 느껴지더라도 천천히 따라와 보세요.


    1. 클래스란 무엇인가?

    클래스는 **객체(object)**를 만들기 위한 설계도입니다. 클래스는 데이터와 그 데이터를 다루는 방법(함수, 메서드)을 하나의 단위로 묶어주어, 코드를 더 구조적이고 체계적으로 작성할 수 있게 해줍니다. 객체는 이 클래스를 기반으로 만들어진 **인스턴스(instance)**입니다.

    클래스의 기본 구조

    Python에서 클래스를 정의하려면 class 키워드를 사용합니다. 클래스 내부에는 속성(데이터)과 메서드(함수)를 정의할 수 있습니다.

    class 클래스이름:
        """클래스에 대한 설명"""
        def __init__(self, 속성1, 속성2):
            self.속성1 = 속성1
            self.속성2 = 속성2
    
        def 메서드이름(self):
            # 메서드 내용
    • class: 클래스를 정의할 때 사용하는 키워드입니다.
    • __init__: 클래스의 생성자로, 객체가 생성될 때 자동으로 호출됩니다.
    • self: 객체 자신을 참조하며, 클래스 내부의 메서드에서 첫 번째 매개변수로 항상 사용됩니다.

    예시: 간단한 클래스 정의

    class Person:
        """사람을 나타내는 클래스"""
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def introduce(self):
            print(f"안녕하세요, 제 이름은 {self.name}이고, 나이는 {self.age}살입니다.")

    위의 Person 클래스는 nameage라는 속성을 가지고 있으며, introduce라는 메서드를 통해 자신을 소개합니다.

    2. 클래스의 속성과 메서드

    클래스는 **속성(attribute)**과 **메서드(method)**로 구성됩니다. 속성은 객체가 가지는 데이터를, 메서드는 객체가 수행하는 행동을 나타냅니다.

    속성 (Attributes)

    속성은 객체가 가지고 있는 데이터를 의미합니다. Python에서 속성은 __init__ 생성자 메서드에서 정의하며, self.속성명 형태로 설정합니다.

    class Car:
        def __init__(self, brand, model):
            self.brand = brand
            self.model = model
    • brandmodel: Car 객체가 가지는 속성입니다.

    메서드 (Methods)

    메서드는 객체의 행동을 정의하는 함수입니다. 클래스 내부에서 정의된 메서드는 첫 번째 매개변수로 항상 self를 받으며, 이를 통해 객체의 속성에 접근하거나 수정할 수 있습니다.

    class Car:
        def __init__(self, brand, model):
            self.brand = brand
            self.model = model
    
        def start(self):
            print(f"{self.brand} {self.model} 시동을 겁니다.")

    3. 객체 생성과 사용

    클래스를 정의한 후, 객체를 생성할 수 있습니다. 객체를 생성하려면 클래스 이름을 함수처럼 호출하면 됩니다.

    객체 생성

    my_car = Car("Hyundai", "Sonata")

    위 코드에서 my_carCar 클래스의 인스턴스(객체)입니다. HyundaiSonatabrandmodel 속성에 전달되는 인자입니다.

    객체 사용

    객체가 생성된 후, 그 객체의 속성에 접근하거나 메서드를 호출할 수 있습니다.

    print(my_car.brand)  # 출력: Hyundai
    print(my_car.model)  # 출력: Sonata
    my_car.start()        # 출력: Hyundai Sonata 시동을 겁니다.
    • 객체의 속성에 접근하려면 객체명.속성명을 사용합니다.
    • 객체의 메서드를 호출하려면 객체명.메서드명()을 사용합니다.

    4. 상속과 메서드 오버라이딩

    Python 클래스는 상속을 통해 다른 클래스로부터 속성과 메서드를 물려받을 수 있습니다. 상속은 코드를 재사용하고, 기존 클래스의 기능을 확장하는 데 매우 유용합니다.

    상속의 기본 구조

    class ParentClass:
        # 부모 클래스의 내용
    
    class ChildClass(ParentClass):
        # 자식 클래스의 내용
    • ParentClass: 부모 클래스(상위 클래스)
    • ChildClass: 부모 클래스를 상속받은 자식 클래스(하위 클래스)

    예시: 상속을 사용한 클래스

    class Animal:
        def __init__(self, name):
            self.name = name
    
        def sound(self):
            return "소리를 냅니다."
    
    class Dog(Animal):
        def sound(self):
            return "멍멍!"
    
    dog = Dog("바둑이")
    print(dog.name)      # 출력: 바둑이
    print(dog.sound())   # 출력: 멍멍!
    • Dog 클래스는 Animal 클래스를 상속받아 sound 메서드를 재정의(오버라이딩)합니다.

    메서드 오버라이딩

    자식 클래스에서 부모 클래스의 메서드를 재정의하여 다른 동작을 수행하도록 할 수 있습니다. 이렇게 하면 기존 클래스의 기능을 유지하면서 필요한 부분만 수정할 수 있어 코드의 유연성이 높아집니다.

    5. 클래스와 객체의 활용 예제

    함수만으로 프로그램을 작성할 때는 코드의 재사용성과 확장성이 떨어질 수 있습니다. 반면, 클래스를 사용하면 이러한 문제를 해결할 수 있습니다. 이번에는 간단한 프로그램을 통해 클래스의 장점을 실습해보겠습니다.

    예제: 도서 관리 프로그램

    class Book:
        def __init__(self, title, author):
            self.title = title
            self.author = author
    
        def info(self):
            print(f"책 제목: {self.title}, 저자: {self.author}")
    
    class Library:
        def __init__(self):
            self.books = []
    
        def add_book(self, book):
            self.books.append(book)
            print(f"'{book.title}'이(가) 도서관에 추가되었습니다.")
    
        def show_books(self):
            for book in self.books:
                book.info()
    
    # 객체 생성 및 사용
    library = Library()
    book1 = Book("파이썬의 정석", "홍길동")
    book2 = Book("객체지향의 이해", "김철수")
    
    library.add_book(book1)
    library.add_book(book2)
    library.show_books()

    출력:

    '파이썬의 정석'이(가) 도서관에 추가되었습니다.
    '객체지향의 이해'이(가) 도서관에 추가되었습니다.
    책 제목: 파이썬의 정석, 저자: 홍길동
    책 제목: 객체지향의 이해, 저자: 김철수
    • Book 클래스는 책의 제목과 저자를 속성으로 가지며, 도서 정보를 출력하는 메서드를 가집니다.
    • Library 클래스는 도서 목록을 관리하며, 책을 추가하고 목록을 출력하는 기능을 제공합니다.

    6. 클래스와 객체의 장점

    Python에서 클래스와 객체를 사용하면 다음과 같은 장점이 있습니다:

    1. 재사용성: 한 번 정의한 클래스를 여러 객체에 사용할 수 있습니다.
    2. 확장성: 상속을 통해 기존 클래스를 확장하여 새로운 기능을 추가할 수 있습니다.
    3. 유지보수성: 코드가 체계적으로 구성되어 있어 유지보수가 쉽습니다.

    객체지향 프로그래밍은 단순히 코드를 나누는 것 이상의 개념입니다. 객체지향적으로 코드를 작성하면, 프로그램의 규모가 커지더라도 쉽게 관리할 수 있으며, 협업 시에도 각 모듈의 역할이 명확해져 원활한 협업이 가능합니다.


    요약

    Python 클래스는 객체지향 프로그래밍의 기본 요소로, 데이터와 행동을 하나의 단위로 묶어 코드를 구조화하고 재사용성을 높입니다. 이번 글에서 클래스와 객체의 기본 개념, 속성과 메서드, 상속과 오버라이딩에 대해 다루었으며, 실습 예제를 통해 이를 직접 확인해 보았습니다. 초보 개발자라도 차근차근 따라하며 연습하면 객체지향 프로그래밍의 기본을 탄탄히 다질 수 있습니다.


    디스크립션
    Python의 클래스에 대해 초보자를 위한 기초 개념과 실습 예제를 다룬 글입니다. 클래스 정의, 객체 생성, 상속, 메서드 오버라이딩 등 Python 클래스의 기본 사용법을 설명합니다.