• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

super()에 대해 문의드립니다.

20.01.11 18:43 작성 조회수 338

2

파이썬 입문인데 강의가 참 재미있습니다. 

보면서 잘이해 안가는부분은  class 개념입니다 .

특히 클래스 속에 함수에 __init__하는부분과

 super().__init__() 이 잘이해 안됩니다. 

이부분 설명좀 부탁드립니다. ㅠㅠ 

답변 1

답변을 작성해보세요.

7

재미 있으시다니 저도 입문하던 시절 밤새 이것저것 만들어보던 기억이 새록새록 합니다. ^^;; 

일단 __init__() 함수는 클래스가 생성되면 가장 먼저 실행되는 영역입니다. 보통 초기화 하는 영역이라고 얘기하는데 예를 들어서..

class Test:
    def __init__(self):
        print("클래스가 생성되었습니다")

a = Test()

위의 예제에서 처럼 a = Test() 이렇게 Test 클래스가 생성되면 가장 먼저 호출 되는 영역이 __init__(self) 영역이 됩니다. 실제 a 라는 변수에 Test() 클래스를 생성해서 변수에 담았을뿐 a 를 갖고 아무것도 하지 않았음에도 불구하고 __init__(self) 함수가 호출이 되는걸 보실 수 있습니다. 편의상 이걸 생성자 함수라고 하기도 하는데 정확하게는 생성자 함수는 아닙니다. 어쨌든 이때 __init__() 함수가 호출될때 클래스에서 사용되는 변수 같은걸 초기화 하게 됩니다.

super().__init__() 는 부모를 상속받아서 만들어진 자식클래스에서 부모 클래스의 생성자를 호출할때 사용하는 메소드가 super() 입니다. 역시 예를 들어

class Parent:
    def __init__(self):
        print("부모 클래스가 생성되었습니다")

class Child(Parent):
    def __init__(self):
        print("자식 클래스가 생성되었습니다.")

a = Child()

위의 예제에서 처럼 a = Child() 클래스를 생성하면 "자식 클래스가 생성되었습니다." 만 출력 됩니다. 자세히 보시면 Child(Parent) 클래스는 Parent 클래스를 상속받아서 만들어지는 클래스입니다. 상속의 개념은 좀 쉽게 단편화 해서 설명드리자면 부모의 기능에 어떤 기능을 추가하여 확장된 새로운 클래스를 만든다고 보시면 됩니다. 이런 경우 부모의 특성과 기능을 포함한 자식 클래스가 생성되야 하는데 이때 부모의 클래스에서 사용하던 어떤 변수들이 초기화 되지 않으면 부모 클래스가 정상적으로 동작하지 않기 때문에 대부분 상속받은 자식 클래스의 입장에서는 부모 클래스의 초기화 함수를 수행해야 하게 됩니다. 그래서 위에서 Child 클래스는

class Parent:
    def __init__(self):
        print("부모 클래스가 생성되었습니다")

class Child(Parent):
    def __init__(self):
        # 부모 클래스의 __init__() 를 호출하기 위해 super() 메소드를 사용합니다.
        super().__init__()
        print("자식 클래스가 생성되었습니다.")

a = Child()

이런식으로 super() 메소드를 활용해서 부모 클래스의 초기화 함수 부분을 먼저 수행하고 자식 클래스에서 자신의 초기화 영역을 수행하는게 일반적입니다. 이렇게 얘기하면 사실 이 내용은 참 별거 없는 내용입니다만 중요한 사실은 왜 클래스를 쓰느냐를 내가 느낄 수 있어야 한다는 점입니다.

class 라는 개념이 입문하시는 분들께 어렵게 느껴지실 수 있습니다. 저 또한 프로그래밍을 입문하던 시절에 설명을 읽을때머리로는 알겠는데 이해하기에는 어려운... 뭐 그런 개념이 바로 객체지향적인 개념이였습니다.

객체 지향적이다라는건 사실 어떤 무언가를 만들때 그걸 하나하나 모듈(부품)화 시켜서 나중에 조립해서 완성한다.. 라는 개념으로도 볼 수 있는데 이게 실제 내가 프로그래밍을 하다가 코드의 재사용을 너무 반복하고 있거나 아니면 내가 지금 만든 코드를 다른 프로그램을 만드는데 또 쓸 수 있을것 같은데.. 이런데서부터 시작하게 되는 경우가 많습니다. 그러면 그걸 어떻게 객체화 시킬지를 고민하게 될테고 그럴때 이해가지 않던게 이해가기도 합니다.(제 경험입니다... )

모든걸 다 이해하고 넘어가면 좋겠지만 때로는 대충 흐름만 알고 넘어가도 괜찮은 부분들도 많습니다. 가장 중요한건 재미와 관심을 잃지 않아야 하는거지 어떤 문제를 이해했네 못했네는 차후 문제일 수도 있습니다. 재미를 갖고 프로그램을 쉬운거부터 자꾸 만들어보고 코딩해보고 하다보면 자연스레 이해되는 부분도 상당히 많습니다.

도움이 되셨으면 좋겠습니다. 질문은 언제나 환영합니다. ^^