지극히 개인적인 공부 노트/파이썬(Python)

[Python] 간단하게 정리한 클래스와 상속

AS J 2021. 8. 6. 00:01

프로그래밍과 언어를 배우고 그 안으로 들어가다 보면 '객체 지향', '클래스' 등의 단어를 접하게 된다. 객체 지향은 말 그대로 여러 요소와 데이터 등을 객체로써 취급하고 구분하고 사용하는 것을 지향한다는 의미이다.

내가 이해한 바로는 쉽게 말해 코드 속 여러 요소들을 명확한 레고 블록으로 만들고, 각각의 블록을 잘 쌓아서 견고하게 코드를 완성해나가는 것이다. 그리고 레고 블록을 선명하게 구분되고, 안정적인 각진 모습으로 구현하는 과정 속엔 클래스가 주요하다.

 

 

1. 클래스

클래스의 구성 요소와 관련 주요 개념을 정리해보면 다음과 같다.

1) 클래스: 어떤 데이터가 있는지, 어떤 조작을 할 수 있는지, 어떤 제약 조건들이 있는지 등을 명시한 추상적인 설계도

2) 인스턴스: 클래스로 만든 실제 예시. 클래스가 쿠키를 찍어내는 쿠키틀이라면, 인스턴스는 그 쿠키틀로 찍어낸 쿠키이다.

3) 생성자: 인스턴스가 처음 만들어질 때 어떻게 세팅할 것인지 설정하는 함수

4) 속성: 일종의 클래스 속 변수명

5) 메서드: 클래스를 통해 사용할 수 있도록 정의한 내부 함수

class Post:  # 클래스 선언
    def __init__(self, author, content):  # 생성자 정의
        self.author = author  # author, content 등은 클래스의 속성
        self.content = content
    
    def print_twice(self, content):  # 메서드 정의
        print(content * 2)
        
post = Post()  # 클래스의 인스턴스 생성
post.print_content('hello')  # 클래스 속 메서드를 사용
* 생성자나 속성에 'self'가 붙는 것은 클래스로 인스턴스를 생성한 후, 인스턴스명에 마침표(.)와 함께 사용할 수 있는 속성과 메서드임을 의미하는 것이다.
* 공부를 하다보면 '추상적'이라는 단어가 종종 보인다. 내가 느낀 바로는 프로그래밍에서 '추상적'이라는 것은 구체적이지 않아서 안 좋다는 것보다는, 다른 것들을 포괄할 수 있는 상위 영역임을 의미하는 것 같다.

 

 

2. 상속

1) 상속: 부모 클래스의 인스턴스를 생성해서 자식 클래스에 연결 짓는 것

2) super(): 부모 클래스에 접근할 때 사용하는 내장 함수

보통 자식 클래스를 생성할 때, 생성자를 따로 선언하지 않으면 부모 클래스의 생성자를 그대로 가져온다. 하지만 자식 클래스에서 생성자를 별도로 정의하고자 한다면, 그리고 정의하려는 속성이 부모 클래스에서 그대로 가져오면서 추가적인 속성을 정의하고자 한다면 super()를 통해 간단하게 부모에서 정의한 속성을 가져올 수 있다.

class ImagePost(Post):  # 부모 클래스를 괄호 안에 작성
    def __init__(self, content, image):
        super().__init__(content)  # super() 자체가 post를 의미한다고 보면 된다. 부모 클래스의 생성자 중 content 속성 정의를 가져옴
        slef.images = images  # 추가로 자식 클래스의 속성 정의

2) 오버라이딩(Overriding): 자식 클래스에서 부모 클래스의 메서드를 다시 정의하며 기능을 덮어 씌우는 것

class Post:  # 부모 클래스
    def comment(self, user, content):
        self.comments.append(Comment(user, content))

class ProtectedPost(Post):  # 자식 클래스
    def comment(self, user, content):
        print("Can't comment")  # Post 클래스의 comment는 무시됨.
        super().comment(user, content)  # super().~ 를 작성하면 위 출력문 후에 기존 부모의 comment 메서드 수행 가능