Programming Language/Python

[Python] 16. 클래스(Class), 상속(inheritance)

lumana 2023. 11. 6. 02:08

클래스, 상속


클래스와 객체

  • 과자를 만드는 틀 -> 클래스

  • 틀을 이용해 만든 과자 -> 객체

객체와 인스턴스의 차이

  • a = Cookie() 에서 a는 객체, a 객체는 Cookie의 인스턴스이다.

  • 인스턴스 : 특정 객체가 어떤 클래스의 객체인지 관계 위주로 설명할 때 사용하는 말

사칙연산 클래스 만들기


class FourCal:
    def setdata(self, first, second):
        self.first = first # a.first = first, a 객체에 객체변수 first가 생성되고 값이 저장된다.
        self.second = second # a.second = second, a 객체에 객체변수 second가 생성되고 값이 저장된다.
    def add(self):
        return self.first + self.second
    def mul(self):
        return self.first * self.second
    def sub(self):
        return self.first - self.second
    def div(self):
        return self.first / self.second
  • 객체 생성

    • a = FourCal()
  • 메서드 호출

    • 객체에 데이터 설정

      • a.setdata(4, 2) # first에 4를, second에 2를 set

      • self.first라는 객체변수 first에 argument로 받은 first의 value 를 대입

      • self.second도 동일

    • 연산 메서드 호출

      • 메서드가 객체 변수에 접근하고 있으므로 반드시 객체의 set 메서드를 통해 객체 변수를 생성한 후 메서드를 호출해야 함

      • a.add() # 6

      • a.mul() # 8

      • a.sub() # 2

      • a.div() # 2.0

  • 메서드의 또 다른 호출 방법

    • 클래스를 통해 메서드를 호출할 수 있다

      a = FourCal()
      FourCal.setdata(a, 4, 2)
      • 클래스이름.메서드 형태로 호출할 때는 객체를 첫 번째 매개변수에 꼭 전달 해줘야 한다!

      • 객체.메서드 형태로 호출할 때는 self를 반드시 생략해서 호출해야 한다.

self란 무엇인가?

  • 클래스의 메서드를 호출하면 메서드의 첫번째 매개변수 self에는 메서드를 호출한 객체가 자동으로 전달된다.

  • 파이썬 메서드의 첫 번째 매개변수 이름은 관례적으로 self를 사용한다.(다른 이름을 사용해도 상관 없음)

생성자(Constructor)

  • 객체가 생성될 때 자동으로 호출되는 메서드를 의미

  • 메서드 이름으로 init를 사용하면 이 메서드는 생성자가 된다.

  • 생성자를 사용함으로써 setdata 메서드를 호출하지 않아 오류가 발생할 수 있는 가능성 제거

    class FourCal:
        def __init__(self, first, second):
            self.first = first
            self.second = second
    • 이 상태에서 객체를 생성하기 위해 a = FourCal()을 수행하면 매개변수가 없어 오류가 발생한다.

    • Default Parameter를 사용해서 초기값을 설정할 수도 있다

      def __init__(self, first = 1, second = 1)
    • 주의 ! C++과 다르게 오버로딩을 통해 생성자를 여러개 만들 수 없다.

      • 오버로딩 : 동일한 이름의 함수, 메서드를 매개변수에 따라 다른 기능으로 동작하도록 만드는 것

      • 파이썬에서는 변수 타입이 정해져있지 않기 때문에 생성자 뿐만 아니라 함수, 메서드 모두 오버로딩이 불가능하다

클래스의 상속(inheritance)


  • 어떤 클래스를 만들 때 다른 클래스의 기능을 물려받는 것

    class 클래스 이름(상속할 클래스 이름):
  • 상속을 하는 이유?

    • 기존 클래스가 라이브러리 형태로 제공되거나 수정이 허용되지 않으면 상속해서 사용할 수 있음
  • example(위의 Fourcal 클래스에 이어서)

    class MoreFourCal(Fourcal):
        def pow(self):
            return self.first ** self.second
  • 인스턴스 attribute는 상속되지 않음(i.e 객체 변수)

    • 클래스 attribute는 상속됨(i.e 메서드)

    • self.first = first와 같이 인스턴스 atrribute까지 상속하려면 어떻게 해야할까?

클래스의 super()

  • super() 함수는 부모 클래스인 super class의 임시 객체를 반환하여 부모 클래스의 메서드(생성자 포함)를 사용할 수 있게 해준다

  • 자식 클래스의 생성자는 부모 클래스의 생성자를 실행하지 않으므로, super().init()를 통해 실행해 줄 수 있다.

    class MoreFourCal(Fourcal):
        def __init__(self, first, second, third): # third라는 매개변수를 추가로 받는다고 가정
            super().__init__(first, second)
            self.third = third
  • 생성자 뿐만 아니라 부모클래스의 메서드 또한 super()를 통해 자식클래스에서 실행할 수 있다.

메서드 오버라이딩

  • 부모 클래스에 있는 메서드를 동일한 이름으로 다시 작성(오버라이딩, 덮어쓰기) 하는 것

  • 위의 Fourcal 예시에서 a = FourCal(4, 0) 실행후 a.div()를 실행하면 0으로 정수를 나누기 때문에 오류가 발생한다.

  • 이를 해결하고자 FourCal 클래스를 상속하는 SafeFourCal 클래스를 만들자

    class SafeFourCal(FourCal):
        def div(self):
            if self.second == 0
                return 0
            else:
                return self.first / self.second

클래스 변수


  • 객체변수들은 다른 객체들에 영향을 받지 않고 독립적으로 그 값을 유지함

  • 클래스 변수는 함수를 선언하는 것처럼 클래스 안에서 변수를 선언하여 생성한다.

  • 어느 객체에서나 동일한 클래스 변수를 가진다.

  • 클래스.클래스변수로 값을 변경하면 다른 객체에서의 값도 다 변경된다.(모든 객체에 공유된다.)

  • 모든 객체에서 공유하고 있기 때문에 어느 인스턴스에서 접근하든 주소 또한 동일하다.

  • example

    class Family:
        lastname = "김" # 클래스 변수
    
    a = Family()
    b = Family()
    
    Family.lastname = "park"
    --> 클래스 변수값이 변경되어 a, b 객체에서도 lastname이 "park"로 변경된다
  • a.lastname 이나 b.lastname와 같이 객체.클래스변수이름 으로 접근하면 이는 클래스 변수가 아닌 객체 변수에 접근하는 것임을 주의하자.!!

    a.lastname = "Lee" # 새로운 lastname이라는 객체변수를 a 객체에 생성 후 저장
    print(b.lastname) # park

참조) Do it! 점프 투 파이썬 (박응용 지음), https://wikidocs.net (파이썬 계단밟기)

'Programming Language > Python' 카테고리의 다른 글

[Python] 18. 패키지(package)  (0) 2023.11.07
[Python] 17. 모듈(module)  (0) 2023.11.07
[Python] 15. 파일 입출력(FILE Input/Output)  (0) 2023.11.06
[Python] 14. 사용자 입력  (0) 2023.11.05
[Python] 13. 함수(function)  (0) 2023.11.05