핵심 정리

클래스

클래스는 객체를 표현하기 위한 문법입니다. 클래스는 class에 클래스 이름을 지정하고 :(콜론)을 붙인 뒤 다음 줄부터 def로 메서드를 작성합니다. 메서드는 클래스 안에 들어있는 함수를 뜻합니다.

class 클래스이름:        # 클래스 만들기
    def 메서드(self):    # 메서드 만들기
        코드

클래스는 ()(괄호)를 붙인 뒤 변수에 할당하여 인스턴스(객체)를 만듭니다. 그리고 인스턴스 뒤에 .(점)을 붙여서 메서드를 호출합니다.

인스턴스 = 클래스()    # 인스턴스(객체) 만들기
인스턴스.메서드()      # 인스턴스로 메서드 호출

클래스의 속성

클래스에 인스턴스 속성을 만들 때는 __init__ 메서드 안에서 self.속성에 값을 할당해줍니다. 그리고 인스턴스 속성에 접근할 때는 메서드 안에서 self 뒤에 .(점)을 붙여서 접근하거나, 인스턴스 뒤에 .을 붙여서 접근합니다.

class 클래스이름:
    def __init__(self):
        self.속성 =       # 인스턴스 속성 만들기
 
    def 메서드(self):
        self.속성           # self 뒤에 .을 붙여서 인스턴스 속성에 접근
 
인스턴스 = 클래스()         # 인스턴스(객체) 만들기
인스턴스.속성               # 인스턴스 속성에 접근

클래스에 바로 속성을 만들면 클래스 속성이 되며 해당 클래스로 만든 모든 인스턴스가 값을 공유합니다. 클래스 속성은 self 또는 클래스 뒤에 .(점)을 붙여서 접근합니다.

class 클래스이름:
    속성 =     # 클래스 속성 만들기
 
    def 메서드(self):
        self.속성           # self 뒤에 .을 붙여서 클래스 속성에 접근
        클래스.속성         # 클래스 뒤에 .을 붙여서 클래스 속성에 접근
 
클래스.속성    # 클래스 속성에 접근

속성을 만들 때 __속성과 같이 __(밑줄 두 개)로 시작하면 비공개 속성이 됩니다. 비공개 속성은 클래스 안에서만 접근할 수 있고, 클래스 바깥에서는 접근할 수 없습니다(비공개 메서드도 같은 방식).

class 클래스이름:
    __속성 =     # 비공개 클래스 속성
 
    def __init__(self):
        self.__속성 =       # 비공개 인스턴스 속성

정적 메서드와 클래스 메서드

정적 메서드와 클래스 메서드는 인스턴스를 통하지 않고 클래스에서 바로 호출할 수 있는 메서드입니다. 정적 메서드는 메서드 위에 @staticmethod를 붙이며 매개변수에 self를 지정하지 않습니다.

class 클래스이름:
    @staticmethod    # 정적 메서드 만들기
    def 메서드(매개변수1, 매개변수2):
        코드

정적 메서드는 self를 받지 않으므로 인스턴스 속성에 접근할 수 없습니다. 따라서 정적 메서드는 인스턴스 속성, 인스턴스 메서드가 필요 없을 때 사용합니다.

클래스 메서드는 메서드 위에 @classmethod를 붙이며 매개변수에 cls를 지정합니다.

class 클래스이름:
    @classmethod    # 클래스 메서드 만들기
    def 메서드(cls, 매개변수1, 매개변수2):
        코드

클래스 메서드는 메서드 안에서 클래스 속성, 클래스 메서드에 접근해야 할 때 사용합니다.

클래스 상속

클래스 상속은 물려받은 기능을 유지한채로 다른 기능을 추가할 때 사용합니다. 기능을 물려주는 클래스를 기반 클래스, 상속을 받아 새롭게 만드는 클래스를 파생 클래스라고 합니다.

상속은 클래스를 만들 때 ( )(괄호)를 붙이고 괄호 안에 기반 클래스 이름을 넣어줍니다.

class 기반클래스이름:
    코드
 
class 파생클래스이름(기반클래스이름):    # 기반 클래스를 상속받음
    코드

기반 클래스의 속성에 접근하거나 메서드를 호출할 때는 super() 뒤에 .을 붙여서 사용합니다. 또는, super(파생클래스, self) 형식으로 사용할 수도 있습니다.

class 기반클래스이름:
    def __init__(self):
        self.속성 = 
 
class 파생클래스이름(기반클래스이름):
    def __init__(self):
        super().__init__()              # super()로 기반 클래스의 메서드 호출
        super().속성                    # super()로 기반 클래스의 속성에 접근
        super(파생클래스, self).속성    # super에 파생 클래스와 self를 넣는 형식

상속 관계와 포함 관계

상속은 학생과 사람처럼 명확하게 같은 종류이며 동등한 관계일 때 사용하며 is-a 관계라고 부릅니다. 포함은 사람과 사람 목록처럼 동등한 관계가 아니라 포함 관계일 때 사용하며 has-a 관계라고 부릅니다.

메서드 오버라이딩

파생 클래스에서 기반 클래스의 메서드를 새로 정의하는 것을 메서드 오버라이딩이라고 합니다. 메서드 오버라이딩은 파생 클래스에서 메서드를 정의할 때 기반 클래스의 메서드 이름과 똑같이 만들어줍니다.

class Person:
    def greeting(self):
        pass
 
class Student(Person):
    def greeting(self):       # 메서드 오버라이딩
        super().greeting()    # super()로 기반 클래스의 메서드 호출
 
james = Student()
james.greeting()     # Student의 greeting 메서드가 호출 됨

메서드 오버라이딩은 원래 기능을 유지하면서 새로운 기능을 덧붙일 때, 프로그램에서 어떤 기능이 같은 메서드 이름으로 계속 사용되어야 할 때 활용합니다.

다중 상속

다중 상속은 여러 기반 클래스로부터 상속을 받아서 파생 클래스를 만드는 방법입니다. 클래스를 만들 때 ( )(괄호) 안에 클래스 이름을 ,(콤마)로 구분해서 넣어줍니다.

class 기반클래스이름1:
    코드
 
class 기반클래스이름2:
    코드
 
class 파생클래스이름(기반클래스이름1, 기반클래스이름2):    # 다중 상속 사용하기
    코드

추상 클래스

추상 클래스는 메서드 목록만 가진 클래스이며 상속받는 클래스에서 메서드 구현을 강제하기 위해 사용합니다. 추상 클래스를 사용하려면 importabc 모듈을 가져온 뒤 클래스의 ( )(괄호) 안에 metaclass=ABCMeta를 지정하고, 메서드 위에 @abstractmethod를 붙여줍니다.

from abc import *
 
class 추상클래스이름(metaclass=ABCMeta):    # 추상 클래스 만들기
    @abstractmethod
    def 메서드이름(self):
        코드