코딩초보 Python Class 개념 잡기

0. Python Class 용어 정리

Python Class에 대해 알아 보려면 많은 낯선 용어들은 코딩 초보에게 더 이상 다른 설명을 보기 싫어 지게 만듭니다. 저도 그렇기 때문에 아래 용어 정리로 한눈에 확인하여 도움을 얻으려 합니다.

  • 생성자(constructor) : 객체가 생성될 때 자동으로 호출되는 메서드를 의미한다. 파이썬 메서드명으로 __init__를 사용하면 이 메서드는 생성자가 된다.
  • __ : 언더바 두 개(__)를 사용하는 것은 특별한 의미나 용도와 관련이 있습니다.
  • 메서드(method) : = 함수 클래스 안에 구현된 함수 다른 말
  • 객체변수(instance variable)’ 또는 ‘속성(object variable)’: 객체에 생성되는 객체만의 변수를 ‘객체변수’ 또는 ‘속성’이라고 부른다
  • 인스턴스(instance) : 클래스로 만든 객체(ex) a = Cookie()로 만든 a는 객체이다. 그리고 a 객체는 Cookie의 인스턴스이다)
  • 클래스(Class) : 프로그래밍에서 묶음을 만드는 도구
  • 상속(inheritance) : 새로운 클래스(자식 클래스)를 만들 때 기존 클래스(부모 클래스)의 속성(변수)과 동작(함수)을 물려주는 행위
  • 부모 클래스 (Parent Class) : 부모 클래스는 다른 클래스에게 속성과 메서드를 상속하는 클래스입니다.
  • 자식 클래스 (Child Class) : 자식 클래스는 부모 클래스로부터 상속받은 속성과 메서드를 가지며, 이를 확장하거나 수정할 수 있음
  • 초기화(initialization) : 객체의 시작 상태를 정의하고 나중에 사용될 준비를 하는 과정

#인스턴스 부가설명

쿠키의 모양틀을 가정해보겠습니다. 이 모양틀을 가지고 실제로 쿠키를 찍어내는 과정에서 나온 쿠키들은 그 모두가 “인스턴스”입니다. 클래스는 개념적인 틀이며, 이 틀을 기반으로 생성된 실제 객체가 인스턴스입니다.

예를 들어, Cookie라는 클래스가 있다고 가정해봅시다. 이 클래스로부터 chocolate_chipoatmeal이라는 두 개의 인스턴스를 생성한다면, 이 두 인스턴스는 Cookie 클래스의 틀에 따라 만들어진 개별 객체입니다.

class Cookie:
    def __init__(self, flavor):
        self.flavor = flavor

chocolate_chip = Cookie("Chocolate Chip")
oatmeal = Cookie("Oatmeal")

여기서 chocolate_chipoatmealCookie 클래스의 인스턴스입니다. 즉, 클래스 Cookie를 이용하여 생성한 객체들이며, 각 인스턴스는 클래스의 속성과 메서드를 공유하면서도 독립적인 개체로서 존재합니다.

쿠키의 모양틀로 찍어낸 개별 쿠키들을 “쿠키1”, “쿠키2”, “쿠키3” 등으로 나타낼 수 있습니다. 이런 개념은 객체 지향 프로그래밍에서의 클래스와 인스턴스와 유사한 개념입니다.

1. Class 클래스 란?

Python Class 클래스는 프로그래밍에서 묶음을 만드는 도구입니다. 이 묶음 안에는 정보(변수)와 할 수 있는 일(함수)이 들어갑니다. 예를 들어, ‘사람’ 클래스를 만든다면 그 안에는 사람의 이름, 나이 같은 정보와 먹기, 걷기 같은 동작을 넣을 수 있습니다. 이렇게 클래스를 사용하면 유사한 작업을 반복하지 않고 쉽게 객체를 만들 수 있습니다.

예시와 자세한 설명링크

공식 홈페이지 설명

참고 동영상

Python Class 클래스 상속은 객체 지향 프로그래밍에서 중요한 개념 중 하나입니다.

하위 클래스(또는 파생 클래스)가 부모 클래스(또는 기본 클래스)를 상속받을 때, 하위 클래스는 부모 클래스의 특성과 동작을 상속 받아 사용할 수 있습니다. 이를 통해 코드 재사용성과 유지 보수성이 향상됩니다.

예를 들어, 아래와 같이 부모 클래스인 Animal과 이를 상속받은 하위 클래스인 Dog를 가정해 보겠습니다:

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

    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        return "Woof!"

위의 예시에서 Dog 클래스는 Animal 클래스를 상속받았습니다. 이제 Dog 클래스는 Animal 클래스의 모든 속성과 메서드를 이용할 수 있습니다. speak 메서드를 오버라이딩하여 개에 특화된 동작을 추가할 수 있습니다.

하위 클래스를 생성할 때에는 class SubclassName(ParentClassName) 형태로 정의합니다. 이렇게 하면 하위 클래스는 부모 클래스의 속성과 메서드를 모두 사용할 수 있습니다.

Python Class를 이해하기 위해 알아야 할 것들이 많네요

1.0 self

self는 객체 지향 프로그래밍에서 사용되는 특별한 용어로, 인스턴스 자체를 가리키는 레퍼런스입니다. 이것은 주로 클래스 내부에서 정의된 메서드에서 사용됩니다.

객체 지향 프로그래밍에서 클래스는 특정한 틀을 기반으로 인스턴스를 생성하는데, 이 인스턴스는 해당 클래스의 속성(attribute)과 메서드(method)를 가질 수 있습니다. self는 이러한 인스턴스를 가리키는 것으로, 메서드 내부에서 해당 인스턴스의 속성에 접근하거나 인스턴스에 대한 작업을 수행하기 위해 사용됩니다.

예를 들어, 다음과 같이 Car 클래스가 있다고 가정해봅시다:

class Car:
    def __init__(self, make, model):
        self.make = make
        self.model = model

    def get_info(self):
        return f"This is a {self.make} {self.model}."

여기서 __init__ 메서드와 get_info 메서드는 self를 첫 번째 인자로 가지고 있습니다. 이는 해당 메서드가 속한 인스턴스를 가리키는 것입니다. 예를 들어:

my_car = Car("Toyota", "Corolla")
print(my_car.get_info())

위의 코드에서 my_car.get_info()를 호출하면, get_info 메서드 내부에서 self.makeself.model을 사용하여 해당 인스턴스의 속성에 접근할 수 있습니다. 이를 통해 객체의 상태에 대한 정보를 반환하는 것이 가능해집니다.

즉, self는 메서드 내에서 해당 인스턴스를 참조하기 위한 것으로, 객체 지향 프로그래밍에서 중요한 개념 중 하나입니다.

다시한번 정리하면

“Toyota”와 “Corolla”와 같은 값들이 __init__ 메서드를 통해 self로 전달됩니다.

클래스 내에서 __init__ 메서드는 객체(인스턴스)를 초기화하는 역할을 합니다. 이 메서드는 클래스로부터 새로운 인스턴스를 생성할 때 호출되며, self를 첫 번째 인자로 받습니다. 여기서 self는 해당 메서드가 속한 인스턴스를 가리킵니다.

1.1 클래스 생성자 def __init__(self):

Python Class 생성자는 객체를 초기화하고 필요한 속성을 설정하는 역할을 합니다. 클래스 생성자는 init 메서드를 사용하여 정의되며, 객체가 생성될 때 자동으로 호출됩니다. 클래스 생성자가 필요한 이유는 다음과 같습니다:

  1. 객체 초기화: 생성자를 사용하여 객체를 초기화할 수 있습니다. 객체가 생성될 때 필요한 속성 값을 설정하거나 초기 상태를 지정하는 작업을 수행할 수 있습니다.
  2. 속성 초기화: 클래스의 속성을 초기화하려면 생성자를 사용해야 합니다. 이렇게 함으로써 객체의 속성을 객체가 생성되는 순간부터 사용 가능한 상태로 만들 수 있습니다.
  3. 유연성 제공: 생성자를 사용하면 객체 생성 시 필요한 정보를 전달할 수 있습니다. 이를 통해 객체의 동작을 조정하거나 다양한 형태의 객체를 생성할 수 있습니다.
  4. 상속과 다형성 지원: 생성자를 사용하여 부모 클래스의 생성자를 호출하면 하위 클래스에서도 초기화 작업을 확장할 수 있습니다. 이를 통해 상속과 다형성을 지원하며, 객체 지향 프로그래밍의 핵심 원리를 구현할 수 있습니다.
  5. 오류 방지: 생성자는 객체를 생성하는 과정에서 오류를 방지하는 역할을 합니다. 객체 생성 시 필요한 값들을 강제하거나, 잘못된 값이 들어오지 않도록 검증하는 로직을 추가할 수 있습니다.
  6. 코드 가독성 및 유지 보수성 향상: 생성자를 사용하면 객체 생성과 초기화 과정이 명확하게 드러나며, 코드 가독성이 향상됩니다. 또한 객체의 속성이나 초기화 과정을 한 곳에서 관리하여 유지 보수가 용이해집니다.

요약하면, 클래스 생성자는 객체의 초기화와 속성 설정, 유연성 제공, 상속 및 다형성 지원, 오류 방지, 코드 가독성 및 유지 보수성 향상 등의 이유로 필요합니다.

1.2 초기화가 왜 필요하지? def __init__(self):

Python Class에서 객체 초기화는 객체 지향 프로그래밍에서 중요한 개념으로, 객체가 생성될 때 필요한 속성 값을 설정하고 객체를 사용 가능한 상태로 만드는 작업을 의미합니다. 초기화가 필요한 이유는 다음과 같습니다:

  1. 객체의 상태 설정: 객체가 생성될 때, 해당 객체의 상태를 초기화하여 사용 가능한 상태로 만듭니다. 객체의 속성을 특정 값으로 설정함으로써 객체가 예상대로 작동하도록 보장합니다.
  2. 속성 값의 유효성 검사: 객체 생성 시 속성 값에 대한 유효성을 검사할 수 있습니다. 부적절한 값이 주어지면 초기화 과정에서 예외 처리하여 안전성을 확보할 수 있습니다.
  3. 코드 가독성: 객체 초기화를 통해 코드의 가독성이 향상됩니다. 객체의 속성을 생성자에서 명시적으로 설정하면 코드의 의도를 분명하게 전달할 수 있습니다.
  4. 코드 재사용성: 객체 초기화를 사용하여 객체 생성 시 필요한 정보를 쉽게 전달할 수 있습니다. 이를 통해 다양한 상태의 객체를 생성하고 재사용할 수 있습니다.
  5. 상속과 다형성: 초기화는 클래스 상속 관계에서 중요한 역할을 합니다. 부모 클래스의 생성자를 하위 클래스에서 호출하여 상속된 속성을 초기화하고 확장할 수 있습니다.

부모 클래스의 생성자 호출: 상속 관계에서 하위 클래스가 부모 클래스의 생성자를 호출하여 부모 클래스의 초기화 과정을 포함시킬 수 있습니다.

객체 지향 프로그래밍 원칙: 객체 지향 프로그래밍의 핵심 원칙 중 하나는 캡슐화입니다. 초기화를 통해 객체의 상태를 외부로부터 보호하고 필요한 속성에 대한 접근을 조절할 수 있습니다.

객체 식별: 초기화를 통해 각 객체를 식별하는 데 도움이 됩니다. 객체의 고유한 속성 값을 설정하여 다른 객체와 구별할 수 있습니다.

요약하면, 객체 초기화는 객체의 상태를 설정하고 유효성을 검사하여 안전성을 확보하며, 코드의 가독성과 재사용성을 높이는 역할을 합니다. 또한 상속, 다형성, 객체 지향 프로그래밍 원칙에 부합하도록 객체를 준비하는 중요한 단계입니다.

1.3 super().__init__()

super().__init__()은 Python Class 상속 구조에서 부모 클래스의 생성자를 호출하는 방법입니다. 부모 클래스의 생성자를 호출하여 하위 클래스의 객체를 초기화할 때 사용됩니다.

일반적으로 하위 클래스에서 생성자를 정의할 때, 부모 클래스의 생성자를 직접 호출하여 부모 클래스의 속성을 초기화하고 확장하는 것이 일반적입니다. 이렇게 하면 코드 중복을 줄이고 상속 관계가 잘 유지됩니다.

1.4 언더바 두 개(__)

Python Class에서 자주 보이는 파이썬에서 언더바 두 개(__)를 사용하는 것은 특별한 의미나 용도와 관련이 있습니다. 여기에는 주로 다음과 같은 경우가 있습니다:

  1. Magic Methods (Dunder Methods): 클래스 내에서 init, str, add 등과 같은 형태의 메서드는 특별한 “매직 메서드”로 간주됩니다. 이러한 메서드들은 파이썬의 내장 연산을 사용할 때 호출되며, 객체의 동작을 사용자 정의할 수 있게 해줍니다. 예를 들어, add 메서드를 정의하면 + 연산자의 동작을 사용자 정의할 수 있습니다.
  2. Name Mangling (이름 변경): 언더바 두 개로 시작하고 언더바 하나로 끝나지 않는 이름 (예: __attribute)은 클래스 내부에서만 사용되도록 의도된 것으로 간주됩니다. 이러한 속성은 외부에서 직접 액세스하는 것을 어렵게 하기 위해 이름 변경(name mangling)이 적용됩니다. 예를 들어, __attribute라는 속성은 _classname__attribute와 같은 형태로 변경됩니다. 이는 속성을 실수로 외부에서 수정하는 것을 방지하고 캡슐화를 강화하는데 도움이 됩니다.
  3. Special Variables: name, file 등과 같은 특별 변수도 언더바 두 개를 사용합니다. 이러한 변수는 파이썬 인터프리터에서 특별한 의미를 가지며, 코드의 다른 부분에서 참조할 수 있는 정보를 제공합니다.

Python Class정리 ~

다른포스팅

댓글 남기기