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_chip
과 oatmeal
이라는 두 개의 인스턴스를 생성한다면, 이 두 인스턴스는 Cookie
클래스의 틀에 따라 만들어진 개별 객체입니다.
class Cookie:
def __init__(self, flavor):
self.flavor = flavor
chocolate_chip = Cookie("Chocolate Chip")
oatmeal = Cookie("Oatmeal")
여기서 chocolate_chip
과 oatmeal
은 Cookie
클래스의 인스턴스입니다. 즉, 클래스 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.make
와 self.model
을 사용하여 해당 인스턴스의 속성에 접근할 수 있습니다. 이를 통해 객체의 상태에 대한 정보를 반환하는 것이 가능해집니다.
즉, self
는 메서드 내에서 해당 인스턴스를 참조하기 위한 것으로, 객체 지향 프로그래밍에서 중요한 개념 중 하나입니다.
다시한번 정리하면
“Toyota”와 “Corolla”와 같은 값들이 __init__
메서드를 통해 self
로 전달됩니다.
클래스 내에서 __init__
메서드는 객체(인스턴스)를 초기화하는 역할을 합니다. 이 메서드는 클래스로부터 새로운 인스턴스를 생성할 때 호출되며, self
를 첫 번째 인자로 받습니다. 여기서 self
는 해당 메서드가 속한 인스턴스를 가리킵니다.
1.1 클래스 생성자 def __init__(self):
Python Class 생성자는 객체를 초기화하고 필요한 속성을 설정하는 역할을 합니다. 클래스 생성자는 init 메서드를 사용하여 정의되며, 객체가 생성될 때 자동으로 호출됩니다. 클래스 생성자가 필요한 이유는 다음과 같습니다:
- 객체 초기화: 생성자를 사용하여 객체를 초기화할 수 있습니다. 객체가 생성될 때 필요한 속성 값을 설정하거나 초기 상태를 지정하는 작업을 수행할 수 있습니다.
- 속성 초기화: 클래스의 속성을 초기화하려면 생성자를 사용해야 합니다. 이렇게 함으로써 객체의 속성을 객체가 생성되는 순간부터 사용 가능한 상태로 만들 수 있습니다.
- 유연성 제공: 생성자를 사용하면 객체 생성 시 필요한 정보를 전달할 수 있습니다. 이를 통해 객체의 동작을 조정하거나 다양한 형태의 객체를 생성할 수 있습니다.
- 상속과 다형성 지원: 생성자를 사용하여 부모 클래스의 생성자를 호출하면 하위 클래스에서도 초기화 작업을 확장할 수 있습니다. 이를 통해 상속과 다형성을 지원하며, 객체 지향 프로그래밍의 핵심 원리를 구현할 수 있습니다.
- 오류 방지: 생성자는 객체를 생성하는 과정에서 오류를 방지하는 역할을 합니다. 객체 생성 시 필요한 값들을 강제하거나, 잘못된 값이 들어오지 않도록 검증하는 로직을 추가할 수 있습니다.
- 코드 가독성 및 유지 보수성 향상: 생성자를 사용하면 객체 생성과 초기화 과정이 명확하게 드러나며, 코드 가독성이 향상됩니다. 또한 객체의 속성이나 초기화 과정을 한 곳에서 관리하여 유지 보수가 용이해집니다.
요약하면, 클래스 생성자는 객체의 초기화와 속성 설정, 유연성 제공, 상속 및 다형성 지원, 오류 방지, 코드 가독성 및 유지 보수성 향상 등의 이유로 필요합니다.
1.2 초기화가 왜 필요하지? def __init__(self):
Python Class에서 객체 초기화는 객체 지향 프로그래밍에서 중요한 개념으로, 객체가 생성될 때 필요한 속성 값을 설정하고 객체를 사용 가능한 상태로 만드는 작업을 의미합니다. 초기화가 필요한 이유는 다음과 같습니다:
- 객체의 상태 설정: 객체가 생성될 때, 해당 객체의 상태를 초기화하여 사용 가능한 상태로 만듭니다. 객체의 속성을 특정 값으로 설정함으로써 객체가 예상대로 작동하도록 보장합니다.
- 속성 값의 유효성 검사: 객체 생성 시 속성 값에 대한 유효성을 검사할 수 있습니다. 부적절한 값이 주어지면 초기화 과정에서 예외 처리하여 안전성을 확보할 수 있습니다.
- 코드 가독성: 객체 초기화를 통해 코드의 가독성이 향상됩니다. 객체의 속성을 생성자에서 명시적으로 설정하면 코드의 의도를 분명하게 전달할 수 있습니다.
- 코드 재사용성: 객체 초기화를 사용하여 객체 생성 시 필요한 정보를 쉽게 전달할 수 있습니다. 이를 통해 다양한 상태의 객체를 생성하고 재사용할 수 있습니다.
- 상속과 다형성: 초기화는 클래스 상속 관계에서 중요한 역할을 합니다. 부모 클래스의 생성자를 하위 클래스에서 호출하여 상속된 속성을 초기화하고 확장할 수 있습니다.
부모 클래스의 생성자 호출: 상속 관계에서 하위 클래스가 부모 클래스의 생성자를 호출하여 부모 클래스의 초기화 과정을 포함시킬 수 있습니다.
객체 지향 프로그래밍 원칙: 객체 지향 프로그래밍의 핵심 원칙 중 하나는 캡슐화입니다. 초기화를 통해 객체의 상태를 외부로부터 보호하고 필요한 속성에 대한 접근을 조절할 수 있습니다.
객체 식별: 초기화를 통해 각 객체를 식별하는 데 도움이 됩니다. 객체의 고유한 속성 값을 설정하여 다른 객체와 구별할 수 있습니다.
요약하면, 객체 초기화는 객체의 상태를 설정하고 유효성을 검사하여 안전성을 확보하며, 코드의 가독성과 재사용성을 높이는 역할을 합니다. 또한 상속, 다형성, 객체 지향 프로그래밍 원칙에 부합하도록 객체를 준비하는 중요한 단계입니다.
1.3 super().__init__()
super().__init__()은 Python Class 상속 구조에서 부모 클래스의 생성자를 호출하는 방법입니다. 부모 클래스의 생성자를 호출하여 하위 클래스의 객체를 초기화할 때 사용됩니다.
일반적으로 하위 클래스에서 생성자를 정의할 때, 부모 클래스의 생성자를 직접 호출하여 부모 클래스의 속성을 초기화하고 확장하는 것이 일반적입니다. 이렇게 하면 코드 중복을 줄이고 상속 관계가 잘 유지됩니다.
1.4 언더바 두 개(__)
Python Class에서 자주 보이는 파이썬에서 언더바 두 개(__)를 사용하는 것은 특별한 의미나 용도와 관련이 있습니다. 여기에는 주로 다음과 같은 경우가 있습니다:
- Magic Methods (Dunder Methods): 클래스 내에서 init, str, add 등과 같은 형태의 메서드는 특별한 “매직 메서드”로 간주됩니다. 이러한 메서드들은 파이썬의 내장 연산을 사용할 때 호출되며, 객체의 동작을 사용자 정의할 수 있게 해줍니다. 예를 들어, add 메서드를 정의하면 + 연산자의 동작을 사용자 정의할 수 있습니다.
- Name Mangling (이름 변경): 언더바 두 개로 시작하고 언더바 하나로 끝나지 않는 이름 (예: __attribute)은 클래스 내부에서만 사용되도록 의도된 것으로 간주됩니다. 이러한 속성은 외부에서 직접 액세스하는 것을 어렵게 하기 위해 이름 변경(name mangling)이 적용됩니다. 예를 들어, __attribute라는 속성은 _classname__attribute와 같은 형태로 변경됩니다. 이는 속성을 실수로 외부에서 수정하는 것을 방지하고 캡슐화를 강화하는데 도움이 됩니다.
- Special Variables: name, file 등과 같은 특별 변수도 언더바 두 개를 사용합니다. 이러한 변수는 파이썬 인터프리터에서 특별한 의미를 가지며, 코드의 다른 부분에서 참조할 수 있는 정보를 제공합니다.
Python Class정리 ~