클래스는 객체를 표현하는 문법이다. class 클래스이름:
형식으로 클래스를 정의하고 내부에 def
를 이용해 클래스 안에 들어있는 함수인 메소드를 만든다.
class 클래스이름: # 클래스 만들기
def 메서드(self): # 메서드 만들기
기능
클래스는 인스턴스 = 클래스이름()
의 형식으로 인스턴스(객체)를 생성하고, 인스턴스.메서드()
으로 인스턴스로 메서드를 실행 할 수 있다.
여러 종류의 유닛으로 된 게임 중 하나인 스타크래프트를 예시로 클래스에 대한 예시코드를 만들어보았다.
클래스에 인스턴스 속성 을 만들 때 __init__
메소드 안에서 self.속성
에 값을 할당한다.
class 클래스이름:
def __init__(self):
self.속성 = 값 # 인스턴스 속성 만들기
def 메서드(self):
self.속성 # self 뒤에 .을 붙여서 인스턴스 속성에 접근
인스턴스 = 클래스() # 인스턴스(객체) 만들기
인스턴스.속성 # 인스턴스 속성에 접근
여기서 __init__()
함수는 인스턴스를 초기화하는 함수로, 인스턴스를 만들때 자동으로 실행되는 메서드라고 생각하면 편하다.
클래스 속성 은 클래스에 바로 속성을 만든 것이고 이 값은 해당 클래스로 만든 모든 인스턴스가 값을 공유한다.
class 클래스이름:
속성 = 값 # 클래스 속성 만들기
def 메서드(self):
self.속성 # self 뒤에 .을 붙여서 클래스 속성에 접근
클래스.속성 # 클래스 뒤에 .을 붙여서 클래스 속성에 접근
클래스.속성 # 클래스 속성에 접근
속성을 만들때 밑줄 두개(__) 로 시작하면 비공개 속성임을 뜻하고 비공개 속성은 클래스 안에서만 접근 할 수 있다. (비공개 메소드도 같은 방식임)
정적 메서드와 클래스 메서드는 인스턴스를 통하지 않고 클래스에서 바로 호출할 수 있는 메서드이다.
정적 메소드는 클래스 위에 @staticmethod
를 붙이며 매개변수에 self
를 지정하지 않는다. 정적 메소드는 인스턴스 속성, 인스턴스 메서드가 필요 없을 때 사용한다.
클래스 메소드는 메소드 위에 @classmethod
를 붙이며 매개변수에 cls를 지정한다. 클래스 메소드는 메소드 안에서 클래스 속성, 클래스 메소드에 접근 해야 할 때 사용한다.
클래스 상속은 한 클래스의 기능을 유지한채로 다른 기능을 추가할 때 사용한다. 클래스를 만들때 괄호() 안에 기반 클래스 이름을 넣어 파생 클래스를 만들 수 있다.
class 기반클래스이름:
코드
class 파생클래스이름(기반클래스이름): # 기반 클래스를 상속받음
코드
기반 클래스의 속성이나 메소드를 사용 할때는 앞에 super().
을 붙여 사용한다. 또한 self(파생클래스, self)
형식으로도 사용 가능하다.
class 기반클래스이름:
def __init__(self):
self.속성 = 값
class 파생클래스이름(기반클래스이름):
def __init__(self):
super().__init__() # 기반 클래스의 메서드 호출
super().속성 # 기반 클래스의 속성에 접근
super(파생클래스, self).속성 # super에 파생 클래스와 self를 넣는 형식
메서드 오버라이딩이란 파생 클래스에서 기반 클래스의 메서드를 새로 정의하는 것 이다.
class A:
def hello(self):
pass
class B(A):
def hello(self): # 메서드 오버라이딩
super().hello() # super()로 기반 클래스의 메서드 호출
obj = B()
obj.greeting() # B의 hello 메서드가 호출됨
다중 상속은 여러 기반 클래스로 부터 상속을 받아서 파생 클래스로 만드는 방법이다.