파이썬에서 클래스는 다른 언어들과 동일하게 틀(template), 설계도(blueprint)로써 객체를 만들기 위한 틀 같은 존재이다.
클래스의 정의
클래스는 class라는 지시자를 통해서 정의할 수 있다.
그리고 이 내부에 해당 클래스가 만들어 낼 현실의 무언가에 대한 정보들 , 기능들을 넣어주는 것이다.
간단하게 게임으로 예를 들어보면 RPG를 보면 캐릭터를 처음 만들때 직업을 선택하고 직업의 특수한 기능들을 사용할 수 있게 되는걸 알고 있을 것이다.
만약 도적이라는 직업을 선택하면 이제부터 이 캐릭터는 무기로 단검만 들수 있게 되고 기본적인 기능은 투명해지는 스킬을 가진다거나 은신을 한다거나 하는 능력을 가진다.
클래스도 동일하다 먼저 도적이라는 클래스를 만들어보자
class Thief:
내부 작성 필요
이제 도적이라는 클래스가 만들어 졌다.
클래스 - 멤버 변수
근데 이 도적이라는 클래스 내부에 정보가 아무것도 없다.
도적은 무기를 단검을 가질 수 있고 고유한 기능은 치명타라고 한다면 아래와 같이 변수에 넣어준다.
class Thief :
weapon = "dagger"
originalProperty = "critical attack"
이러면 도적은 무기를 단검을 가지로 고유 기능은 치명타라는 정보를 가지게 만들어 줬다.
이렇게 클래스 내부에 추가되는 변수들을 멤버변수라고 부른다
파이썬에서 조금 특이한 점은 외부에서 변수를 추가해서 사용이 가능하다는 점이다.
class Thief :
weapon = "dagger"
originalProperty = "critical attack"
thief1 = Thief()
thief2 = Thief()
thief2.invisible = True
if thief2.invisible is True:
print("thief2가 투명화 상태입니다")
이렇게 멤버변수를 추가해주면 해당 변수가 기능을 하는 것을 볼 수 있다.
그러면 기존의 Thief1의 경우는 어떨까?
if thief1.invisible is True:
print("thief1가 투명화 상태입니다")
# Traceback (most recent call last):
# File "D:\dev\python\basic\clAss\clPrac.py", line 10, in <module>
# if thief1.invisible is True:
# ^^^^^^^^^^^^^^^^
#AttributeError: 'Thief' object has no attribute 'invisible'
보면 그런 속성(멤버변수)가 없다고 하는 것을 볼 수 있다.
각각의 인스턴스가 독립적이며 인스턴스 별 변수를 생성한다고 볼 수 있다
클래스 - 멤버함수
이제 도적의 스킬인 투명화를 추가해보자.
스킬은 함수로 만들어준다.
클래스 내부에서 함수의 첫번째 인자는 self를 받는다.(클래스 내부에서 함수는 무조건임)
class thief :
weapon = "dagger"
originalProperty = "critical attack"
def originalSkill(self):
print("Invisible Thief")
이제 이 클래스를 통해서 도적을 한번 만들어보자.
class Thief :
weapon = "dagger"
originalProperty = "critical attack"
def originalSkill(self):
print("Invisible Thief")
thief = Thief()
print(thief.weapon) # dagger
print(thief.originalProperty) # critical attack
thief.originalSkill() # Invisible Thief
이렇게 클래스 내부에서 생성된 함수를 멤버함수라고 한다.
근데 물론 이렇게 사용하는 경우는 거의 없고 보통은 여기서 이것 저것이 추가되어 많은 기능을 가진 클래스로 생성이 된다.
특히 저렇게 변수에 바로 값을 추가하는 방식의 사용은 보통 특별한 이유 없이는 사용되지 않는다
여기서 우리가 추가적으로 알아야 할 부분은 [생성자] 라는 것이다.
클래스의 생성자 - __init__
보통 자바의 경우, C#과 같은 경우는 클래스의 생성자는 클래스의 명칭과 동일해야만 하는데 파이썬의 경우는 조금 특이하게 아예 특별한 명칭을 가지고 있고 그 특별한 명칭은 __init__ 이다
여기서 생성자란 것은 인스턴스가 생성될때 호출되는 특별한 함수로 주로 객체의 초기값을 세팅하기 위해서 사용된다.
우리가 만들었던 도적 클래스에 적용을 해보자면 클래스의 가장 위쪽, 클래스라는 키워드 바로 아래에 __init__이라는 함수를 하나 생성해주자.
class Thief :
def __init__(self):
그리고 이 내부에 우리가 사용했던 weapon과 originalProperty를 넣어줄 건데 매개변수로 해당 값들을 받아올 수 있도록 넣어주자.
class Thief :
def __init__(self, weapon, originalProperty):
self.weapon = weapon
self.originalProperty = originalProperty
이러면 클래스를 만들때 값을 전달하면 __init__이라는 함수를 따로 호출할 필요 없이 클래스가 인스턴스화 되는 순간 전달해주며 그 값을 가진 채로 초기화 된다.
class Thief :
def __init__(self, weapon, originalProperty):
self.weapon = weapon
self.originalProperty = originalProperty
thief = Thief("dagger", "critical attack")
print(thief.weapon) # dagger
print(thief.originalProperty) # critical attack
이렇게 __init__ 생성자를 사용할 경우 내부에 전달해야하는 전달인자에 정확하게 맞게 생성을 해줘야만 한다.
만약 맞춰서 생성하지 않으면 오류를 벹는다.