클래스와 객체

PythonBeginner
지금 연습하기

소개

이 랩에서는 Python 의 클래스와 객체에 대해 배우게 됩니다. 클래스는 객체를 생성하기 위한 템플릿입니다. 객체는 클래스의 인스턴스입니다.

성과

  • 이름과 객체 (Names and Objects)
  • 스코프와 네임스페이스 (Scopes and Namespaces)
  • 인스턴스 객체 (Instance Objects)
  • 메서드 객체 (Method Objects)
  • 상속 (Inheritance)
  • 비공개 변수 (Private Variables)
이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 고급 레벨의 실험이며 완료율은 35%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

클래스 정의 및 생성

Python 에서 클래스를 정의하려면 class 키워드 다음에 클래스 이름을 사용합니다.

클래스 정의에는 __init__ 메서드가 포함되어야 합니다. 이는 Python 에서 클래스로부터 객체가 생성될 때 호출되는 특수한 메서드입니다.

새로운 Python 인터프리터를 엽니다.

python3

다음은 원을 나타내는 클래스의 예시입니다.

class Circle:
    def __init__(self, radius):
        self.radius = radius

__init__ 메서드는 radius 매개변수를 받아 객체의 radius 속성에 할당합니다.

인스턴스 객체 인스턴스화

클래스로부터 인스턴스 객체를 생성하려면 클래스 이름 다음에 괄호를 붙여 호출해야 합니다. 이는 클래스의 특정 발생이기 때문에 "인스턴스"라고 불립니다.

circle1 = Circle(5)

이 코드는 반지름이 5Circle 타입의 인스턴스 객체 circle1을 생성합니다. 인스턴스 객체는 객체에 특정한 데이터를 저장하는 데 사용될 수 있습니다. 예를 들어, 각 Circle 객체는 서로 다른 반지름을 가질 수 있습니다.

이전 단계의 __init__ 메서드는 객체가 생성될 때 자동으로 호출되며, 객체의 radius 속성은 값 5 로 초기화됩니다.

__init__ 메서드는 객체의 속성을 초기화하거나 외부 리소스에 대한 연결을 설정하는 등, 객체의 초기 상태를 설정하는 데 자주 사용됩니다. 객체가 생성될 때 자동으로 호출되므로 직접 호출할 필요가 없습니다.

__init__ 메서드는 일반적인 메서드이며 어떤 이름이든 가질 수 있다는 점에 유의해야 합니다. 그러나 권장되는 명명 규칙은 클래스의 초기화 메서드임을 명확하게 하기 위해 __init__을 사용하는 것입니다.

속성 접근 및 수정

객체의 속성에 접근하려면 점 표기법 (dot notation) 을 사용합니다. 예를 들어, circle1 객체의 반지름에 접근하려면 다음 코드를 사용할 수 있습니다.

print(circle1.radius) ## Output: 5

새로운 값을 할당하여 객체의 속성을 수정할 수 있습니다. 예를 들어, circle1 객체의 반지름을 변경하려면 다음 코드를 사용할 수 있습니다.

circle1.radius = 10
print(circle1.radius) ## Output: 10

메소드 객체 추가

메서드는 클래스 내에서 정의된 함수이며, 객체의 속성에 저장된 데이터에 대한 연산을 수행하는 데 사용됩니다. Python 에서 메서드는 def 키워드, 메서드 이름, 매개변수 목록을 사용하여 정의됩니다.

다음은 Circle 클래스에 정의된 area 메서드의 예입니다.

class Circle:
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14 * self.radius * self.radius

area 메서드는 반지름을 기반으로 원의 면적을 계산합니다. 이는 메서드가 호출된 객체의 반지름을 참조하는 self.radius 속성을 사용함으로써 수행됩니다.

객체에서 메서드를 호출하려면 점 표기법 (dot notation) 을 사용하고, 그 뒤에 메서드 이름과 괄호를 붙입니다. 예를 들어, circle1 객체에서 area 메서드를 호출하려면 다음 코드를 사용할 수 있습니다.

circle1 = Circle(15)
print(circle1.area()) ## Output: 706.5

이 코드는 Circle 클래스의 특정 인스턴스인 circle1 객체의 면적을 출력합니다.

메서드는 클래스 내에서 기능을 캡슐화하고 객체의 속성에 저장된 데이터를 조작하는 방법을 제공하는 데 유용합니다.

초보자는 괄호 사용에 특히 주의해야 합니다. 괄호는 객체에서 메서드를 호출하는 데 사용되며, 괄호는 또한 메서드에 매개변수를 전달하는 데 사용됩니다. 처음에는 혼란스러울 수 있지만, 클래스와 객체에 대해 계속 배우면서 더 명확해질 것입니다.

인스턴스 객체와 메서드 객체는 Python 에서 두 가지 주요 유형의 객체입니다. 결론적으로, 인스턴스 객체는 클래스에서 생성되고, 메서드 객체는 클래스 내에서 정의됩니다.

상속 (Inheritance)

상속은 기존 클래스의 수정된 버전을 생성하는 방법입니다. 새로운 클래스는 서브클래스 (subclass) 라고 하고, 기존 클래스는 슈퍼클래스 (superclass) 라고 합니다.

상속을 사용하면 슈퍼클래스의 모든 속성 (attribute) 과 메서드 (method) 를 가진 서브클래스를 생성할 수 있으며, 서브클래스에 추가적인 속성 및 메서드를 추가하거나 슈퍼클래스의 속성 및 메서드를 재정의할 수도 있습니다.

다음은 Circle 클래스에서 상속받는 서브클래스 Cylinder의 예입니다.

class Cylinder(Circle):
    def __init__(self, radius, height):
        super().__init__(radius)
        self.height = height

Cylinder 클래스는 두 개의 매개변수 radiusheight를 받는 __init__ 메서드를 가지고 있습니다. super() 함수를 사용하여 Circle 클래스의 __init__ 메서드를 호출하여 객체의 radius 속성을 초기화한 다음, 객체의 height 속성을 설정합니다.

super() 함수는 Python 에서 클래스의 슈퍼클래스를 참조하는 특수한 함수입니다. 서브클래스 내에서 슈퍼클래스의 메서드를 호출하는 데 사용됩니다.

super() 함수는 클래스 정의에서 정의되며, 생성되는 객체를 참조하는 self 매개변수를 받습니다. 또한 호출되는 메서드에 따라 추가 매개변수를 받을 수도 있습니다. 이 예제에서는 radius 매개변수를 Circle 클래스의 __init__ 메서드에 전달하고 객체의 radius 속성을 초기화합니다.

이제 Cylinder 클래스는 Circle 클래스의 모든 속성 및 메서드와 추가적인 height 속성을 갖습니다. Circle 클래스와 마찬가지로 점 표기법 (dot notation) 을 사용하여 Cylinder 클래스의 속성 및 메서드에 접근할 수 있습니다.

예를 들어, Cylinder 객체를 생성하고 해당 속성에 다음과 같이 접근할 수 있습니다.

cylinder1 = Cylinder(5, 10)
print(cylinder1.radius)  ## prints 5
print(cylinder1.height)  ## prints 10

상속은 객체 지향 프로그래밍에서 코드를 재사용하고 클래스 계층 구조를 생성할 수 있도록 하는 유용한 기능입니다.

super() 함수

super() 함수는 서브클래스에서 슈퍼클래스의 코드를 재사용하고 추가 기능을 확장하려는 경우에 유용합니다.

super() 함수는 슈퍼클래스에 대한 정적 참조가 아니라는 점에 유의하는 것이 중요합니다. 이는 호출되는 클래스에 따라 변경되는 동적 참조입니다. 이를 통해 여러 수준의 상속에서 상속을 사용하고 각 수준에서 올바른 슈퍼클래스에 접근할 수 있습니다.

예를 들어, 다음 클래스를 고려해 보겠습니다.

class A:
    def method(self):
        print("A method")

class B(A):
    def method(self):
        super().method()
        print("B method")

class C(B):
    def method(self):
        super().method()
        print("C method")

여기서 C 는 B 의 서브클래스이고, B 는 A 의 서브클래스입니다. C 객체에서 method 메서드를 호출하면 먼저 super() 함수를 사용하여 A 클래스의 method 메서드를 호출한 다음, super() 함수를 사용하여 B 클래스의 method 메서드를 호출하고, 마지막으로 C 클래스의 method 메서드를 호출합니다.

obj = C()
obj.method()  ## prints "A method", "B method", "C method"

super() 함수는 객체 지향 프로그래밍에서 코드를 재사용하고 클래스 계층 구조를 생성할 수 있도록 하는 유용한 기능입니다.

Private 변수

Python 에서 private 변수는 정의된 클래스 내에서만 사용하도록 의도된 변수이며, 외부 코드에서는 사용되지 않습니다. Private 변수는 클래스 외부에서 직접 접근할 수 없습니다.

Circle 클래스에서 private 변수를 정의하려면 변수 이름 앞에 이중 밑줄 접두사 (__) 를 사용하면 됩니다. 예를 들어:

class Circle:
    def __init__(self, radius):
        self.__radius = radius

이렇게 하면 Circle 클래스에 private 변수 __radius가 정의됩니다.

Private 변수는 정의된 클래스 내에서만 사용하도록 의도되었습니다. 클래스 외부에서는 직접 접근할 수 없습니다. 예를 들어, Circle 클래스 외부에서 __radius 변수에 접근하려고 하면 오류가 발생합니다.

circle1 = Circle(5)
print(circle1.__radius)  ## This will raise an AttributeError

Private 변수는 클래스 내에서 데이터를 캡슐화하고 외부 코드에서 데이터를 수정하는 기능을 제한하는 데 유용합니다. 그러나 Python 에서 private 변수는 실제로 private 하지 않으며 "name mangling"을 사용하여 클래스 외부에서 접근할 수 있다는 점에 유의해야 합니다.

Name mangling 은 변수 이름에 특수 접두사를 추가하여 클래스 외부에서 접근하기 어렵게 만드는 기술입니다.

예를 들어, __radius 변수는 다음 구문을 사용하여 Circle 클래스 외부에서 여전히 접근할 수 있습니다.

print(circle1._Circle__radius)  ## This will print 5

그러나 이것은 좋은 프로그래밍 방식으로 간주되지 않으며 피해야 합니다.

대신, private 변수는 정의된 클래스 내에서만 사용하고 필요한 경우 데이터를 접근하거나 수정하기 위해 public 메서드를 제공해야 합니다.

다음은 private __radius 변수와 반경에 접근하고 수정하기 위한 public 메서드를 갖는 Circle 클래스의 예입니다.

class Circle:
    def __init__(self, radius):
        self.__radius = radius

    def get_radius(self):
        return self.__radius

    def set_radius(self, radius):
        self.__radius = radius

Circle 객체의 반경에 접근하려면 get_radius 메서드를 사용할 수 있습니다.

circle1 = Circle(5)
print(circle1.get_radius())  ## prints 5

Circle 객체의 반경을 수정하려면 set_radius 메서드를 사용할 수 있습니다.

circle1.set_radius(10)
print(circle1.get_radius())  ## prints 10

요약

이 랩에서는 Python 의 클래스와 객체에 대해 배웠습니다. 클래스를 정의하고, 클래스에서 객체를 생성하고, 객체의 속성과 메서드에 접근하고, 객체의 속성을 수정하고, 슈퍼클래스에서 상속받는 서브클래스를 만드는 방법을 배웠습니다.

다음은 이 랩에서 다룬 주요 개념에 대한 요약입니다.

  • 클래스는 객체를 생성하기 위한 템플릿입니다. 객체는 클래스의 인스턴스입니다.
  • __init__ 메서드는 클래스에서 객체가 생성될 때 호출됩니다. 이를 통해 객체의 속성을 설정할 수 있습니다.
  • 점 표기법을 사용하여 객체의 속성에 접근하고, 메서드 이름과 괄호가 뒤따르는 점 표기법을 사용하여 객체의 메서드를 호출할 수 있습니다.
  • 객체의 속성에 새 값을 할당하여 객체의 속성을 수정할 수 있습니다.
  • 상속을 통해 슈퍼클래스의 수정된 버전인 서브클래스를 만들 수 있습니다. 서브클래스는 슈퍼클래스의 메서드를 재정의하거나 확장할 수 있습니다.

이 랩이 Python 클래스와 객체에 대해 배우는 데 도움이 되었기를 바랍니다. 질문이 있으시면 알려주세요!