한 걸음씩 기록하며
#.11 Class 본문
1. Class
- OOP의 기본적인 사용자 정의 데이터형 (User define data type)
- 클래스는 데이터를 표현하는 속성(attribute)과 행위(behavior)를 표현하는 메서드(method)를 포함하는 논리적인 컨테이너(container)이다.
- 간단하게 말하면, 클래스란 객체의 설계도이고, 인스턴스(instance)를 찍어내는 틀이라고 할 수 있다.
2. 클래스 정의
class Calculator :
pass
- 선언과 동시에 클래스 객체가 생성된다.
- 선언된 공간은 지역 스코프로 사용된다.
- 정의된 속성 중 변수는 멤버 변수(data attribute)로 불린다.
- 정의된 함수는 메서드(method)로 불린다.
- class 이름은 각 단어의 앞글자를 대문자로 사용한다.
- 한 단어 이상으로 이루어져 있다면 밑줄 없이 단어 앞부분을 대문자로 이어서 사용한다.
3. Instance
class Calculator :
pass
a = Calculator() #인스턴스 생성
- 인스턴스는 클래스로 만든 객체를 뜻한다. 인스턴스는 어떤 클래스의 객체인지 관계에 초점을 맞춘 용어이다.
- 인스턴스는 자신의 고유의 속성을 가지며, 클래스에서 정의한 행위를 수행할 수 있다.
- 객체명이 변수가 되고, 클래스 이름으로 어떤 클래스의 객체를 생성할 것인지 정한다.
- 인스턴스 객체와 클래스 객체는 서로 다른 이름공간을 가지고 있다.
3. Initializer (초기화자)
class Calculator:
def __init__(self, first, second):
self.first = first
self.second = second
- 클래스로부터 새 객체를 생성할 때마다(인스턴스를 만들 때마다) 실행되는 특별한 메서드로 __init__이라는 메서드가 있다. 이를 흔히 Initializer라고 한다.
- initializer는 클래스로부터 객체를 만들 때, 인스턴스 변수를 초기화하거나 객체의 초기 상태를 만들기 위한 문장들을 실행하는 곳이다.
4. Attribute
- 클래스/인스턴스가 가지고 있는 속성(값)이다.
- 위의 코드에서는 (self, first, second)에 해당한다.
5. Method
- 메서드는 클래스의 행위를 표현하는 것으로 클래스 내의 함수이다.
- 파이썬에서 메서드는 크게 인스턴스 메서드, 클래스 메서드, 정적 메서드(static method)가 있다.
1) 인스턴스 메서드
- 인스턴스 변수에 엑세스 할 수 있도록 첫번째 파라미터에 항상 객체 자신을 의미하는 self를 갖는다.
- 해당 메서드를 호출한 객체에만 영향을 미친다. 객체 속성에 접근이 가능하다.
- 호출 방법
- 해당 클래스 안에서는 self.메서드명
- 클래스 밖에서는 객체.메서드명
class Test:
def __init__(self, name, age):
self.name = name
self.age = age
def print_info(self) #인스턴스 메서드
print(self.name, ',', self.age) #클래스 안에서 인스턴스 메서드 호출
def test_func(self): #인스턴스 메서드
self.print_info() #클래스 안에서 인스턴스 메서드 호출
test1 = Test('hong', 22)
test1.print_info() #2 결과값 : hong , 22 #클래스 밖에서 인스턴스 메서드 호출
test1.test_func() #3 결과값 : hong , 22 #클래스 밖에서 인스턴스 메서드 호출
2) static method (정적 메서드)
- 객체와 독립적이지만, 로직상 클래스 내에 포함되는 메서드
- self 파라미터를 가지고 있지 않다. 따라서 인스턴스 변수에 엑세스가 불가능하다.
- 그러나 정적 메서드 내부에서 클래스 변수(속성)에는 클래스명.클래스속성명 으로 엑세스가 가능하다.
- 정적 메서드는 메서드의 실행이 외부 상태에 영향을 끼치지 않도록 순수 함수(pure function)을 만들 때 사용한다.
- 순수 함수란, 부수 효과(side effect)가 없고, 입력 값이 같으면 언제나 같은 출력갑을 반환한다.
- 즉 인스턴스 상태를 변화시키지 않는 메서드를 만들 때 사용한다.
- @staticmethod 라는 데코레이터를 붙여서 해당 메서드가 정적 메서드임을 표시한다.
- 호출방법 : 클래스명.정적메서드명 or 객체명.정적메서드명 (전자 선호)
class Calc:
count = 10 # 클래스 변수(클래스 속성)
@staticmethod
def add(a):
print(a + Calc.count) # 클래스 속성에는 엑세스가 가능하다.
@staticmethod
def mul(a):
print(a * Calc.count)
Calc.add(15) # 결과값 :25
Calc.mul(15) # 결과값 : 150
3) 클래스 메서드
- 인스턴스 없이 호출이 가능하다는 점에서 정적 메서드와 비슷하지만 약간의 차이점이 있다.
- self 파라미터 대신 cls라는 클래스를 의미하는 파라미터를 갖는다.
- 해당 클래스로 생성된 객체로부터 호출되는 것이 아니라, 클래스 자체에서 직접 호출된다.
- 객체의 속성/메서드에는 엑세스가 불가능하다.
- 그러나 cls.클래스속성명으로 클래스 속성에는 접근 가능하다.
- cls를 사용하면 클래스 메서드 내부에서 현재 클래스의 인스턴스를 만들 수 있다.
- @classmethod 라는 데코레이터를 붙여 해당 메서드가 클래스 메서드임을 표시한다.
- 호출방법 : 클래스명.클래스메서드명 or 객체명.클래스메서드명
class Person:
count = 0 # 클래스 속성
def __init__(self):
Person.count += 1
@classmethod
def print_count(cls):
print('{0}명 생성되었습니다.'.format(cls.count)) # 클래스 속성에는 엑세스가 가능하다.
@classmethod
def create(cls):
p = cls() # 메서드 내부에서 cls()로 현재 클래스의 인스턴스를 만들 수도 있다. 즉, cls() = Person()을 의미한다.
return p
ryan = Person()
apeach = Person()
Person.print_count() # 결과값 : 2명 생성되었습니다.
print(Person.create()) # 결과값 : <__main__.Person object at 0x000001BA0AE143D0> Person클래스로 부터 생성된 인스턴스임을 확인할 수 있다.
6. 상속
- OOP 특징 다형성에서 언급했던 상속이다.
- 공통된 속성이나 메서드를 부모 클래스에 정의하고, 이를 상속받아 다양한 형태의 인스턴스들을 만들 수 있다.
- 상속 방법은 다음과 같다.
class 자식클래스(부모클래스)
pass
- 자식클래스에서 다른 것들을 추가하기위해서는, super()로 상속받아 메소드 오버라이딩(method overriding) 할 수 있다.
class father(): # 부모 클래스 def __init__(self, who): self.who = who def handsome(self): print("{}를 닮아 잘생겼다".format(self.who)) class sister(father): # 자식클래스(부모클래스) 아빠매소드를 상속받겠다 def __init__(self, who, where): super().__init__(who) self.where = where def choice(self): print("{} 말이야".format(self.where)) def handsome(self): super().handsome() self.choice() girl = sister("아빠", "얼굴") girl.handsome()
'Python' 카테고리의 다른 글
#.13 Error & Exceptions (예외처리) (0) | 2021.12.22 |
---|---|
#.12 Module, Package (0) | 2021.12.22 |
#.10 Object(객체)에 대하여 (0) | 2021.12.22 |
#.9 객체지향 프로그래밍 (OOP) (0) | 2021.12.22 |
#.8 Data Structure Method (0) | 2021.12.21 |
Comments