클래스는 함수에서 더 나아간 개념으로, 특정 기능을 하는 함수들과 변수들을 모아서 하나의 뭉텅이(class)로 모아서 관리를 하는 방식입니다.
비슷한 내용의 함수를 여러번 반복하여 사용할 때, 편리한 기능을 합니다.
또한 클래스는 어떠한 기능들을 모아놓은 '틀'을 의미합니다.
김밥의 경우 야채김밥, 소고기김밥, 참치김방 등 하나의 김밥종류(class)라는 개념안에 여러가지의 재료(변수, 함수)에 따라 달라지는 것 처럼 클래스도 동일하게 어떤 재료로 구성하느냐에 따라서 클래스가 달라집니다.
클래스 함수는 class로 정의하는 객체 생성 함수로 이를 호출하면 내부의 정의된 대로 객체를 리턴합니다.
(하지만 호출시 내부의 코드를 실행하는 것은 함수와 동일합니다.)
class Class_sample():
def __init__(self):
self.z=2
print("z init as :", self.z)
def class_func():
print("z by class_func: ",
때문에, 클래스 함수를 호출하여 생성될 객체에서 사용할 메서드에는 'self'라는 표현을 하나라도 표시하여 정의해야만 합니다.
그렇지 않을 경우 인스턴스 메서드를 호출할 때, 자동적으로 주어지는 인스턴스를 받을 변수가 없기 때문에 오류를 발생하게 됩니다.
__init__은 클래스에서 생성자(초기자)라고 불립니다.
이 생성자는 클래스가 객체를 생성할 때, 반드시 처음으로 들르는 곳입니다.
즉, 클래스를 정의하고 호출할 경우 맨 처음 자동적으로 __init__함수가 호출이 됩니다.
객체를 생성할때, 인스턴스를 생성할때 맨 처음으로 초기화를 해주거나 하는 작업을 이 __init__에서 진행 하면 됩니다.
class sample:
name = '홍길동' <- 해당 값은 클래스 내에서 정의된 변수로 클래스 변수라고 합니다.
def __init__(self, number, address):
self.number = number
self.address = address
print(name, number, address)
위와 같은 클래스가 있고 해당 클래스를 호출하면 아래와 같은 결과 값이 나오게 됩니다.
A = sample('010-0000-0000','조선시대')
A.print()
>>> 홍길동 010-0000-0000 조선시대
내부에서 정의된 클래스 변수의 값은 그대로 나오고, 클래스 함수를 정의해 변수값을 설정하면 __init__을 생성자를 거쳐 출력됩니다.
가장 흔히 쓰이는 것으로 인스턴스 변수에 엑세스 할 수 있도록 자기 자신을 의미하는 self 파라미터를 갖는다.
해당 메서드를 호출한 객체에만 영향을 미친다.
클래스 안에서는 self.메서드 로 호출
밖에서는 객체.메서드로 호출
class Test:
def __init__(self, name, age):
self.name = name
self.age = age
def print_info(self):
print(self.name, ',', self.age) #1
def test_func(self):
self.print_info()
test1 = Test('hong', 22)
test1.print_info() #2 결과값 : hong , 22
test1.test_func() #3 결과값 : hong , 22
위 코드에서 print_info(), test_func() 가 인스턴스 메서드에 해당합니다.
객체와 독립적이지만, 로직상 클래스 내에 포함되는 메서드
self 파라미터를 가지고 있지 않아, 인스턴스 변수에 엑세스가 불가능
하지만, 정적 메서드 내부에서 클래스 변수(속성) 에는 클래스명.클래스속성명으로 엑세스가 가능
@staticmethod라는 데코레이터를 붙여서 해당 메서드가 정적 메서드임을 표시
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
클래스에서 바로 함수를 호출하는 형태를 보여주고 있습니다.
(모듈을 사용하는 것과 비슷합니다.)
그렇다면, 정적 메서드는 언제 사용할까요??
정적 메서드는 메서드의 실행이 외부 상태에 영향을 끼치지 않는 순수 함수(pure function)을 만들 때 사용합니다.
즉, 인스턴스 상태를 변화시키지않는 메서드를 만들때 사용합니다.
보통 클래스의 함수를 호출할 때
class().함수명 이런식으로 클래스의 인스턴스를 호출하지만
정적 메서드를 사용하면 class.함수명 으로 호출을 할 수 있게 됩니다.
인스턴스의 호출 없이 가능
self 대신 cls라는 클래스를 의미하는 파라미터를 가짐
해당 클래스로 생성된 객체로 부터 호출되는 것이 아닌, 크랠스 자체에서 직접 호출 된다.
@classmethod라는 데코레이터를 붙여 해당 메서드가 클래스 메서드임을 표시
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
보통 클래스 메서드를 엑세스할 필요가 있는 경우 많이 사용합니다.