본문 바로가기

코딩/파이썬

5분 파이썬(11) - 클래스 심화 내용 알아보기

반응형

2023.05.04 - [코딩/파이썬] - 5분 파이썬(10) - 클래스(feat. 클래스 쉽게 이해하기)

 

5분 파이썬(10) - 클래스(feat. 클래스 쉽게 이해하기)

클래스 개념은 코린이들에게 끝판왕 같은 느낌입니다. 변수, 자료형 같은거 배울땐 코딩이 쉽게 느껴지다가 반복문, 조건문 배울땐 코딩이 적성에 맞는 것 같고 막 재밌고 그렇습니다. 함수까지

bebutae.tistory.com

지난 게시글에 이어서 클래스 심화 내용을 알아보겠습니다.

class 붕어빵틀:
    def 붕어빵만들기(self,재료, 시간):
        self.재료 = 재료
        self.시간 = 시간
    def 재료시간출력(self):
        붕어빵재료 = self.재료
        굽는시간 = self.시간
        print("재료:", 붕어빵재료)
        print("시간:", 굽는시간)
팥붕 = 붕어빵틀()
팥붕.붕어빵만들기('팥', '10분')
팥붕.재료시간출력()

슈붕 = 붕어빵틀()
슈붕.붕어빵만들기('슈크림', '12분')
슈붕.재료시간출력()

이전 게시글에서 클래스를 정의하고, 객체를 생성해보았습니다.

 

이번에는 생성자를 알아보겠습니다.

생성자는 클래스로 생성하는 객체에 초기값을 설정할 때 사용하는 메소드입니다.

class 붕어빵틀:
    def 붕어빵만들기(self,재료, 시간):
        self.재료 = 재료
        self.시간 = 시간
    def 재료시간출력(self):
붕어빵재료 = self.재료
굽는시간 = self.시간
print("재료:", 붕어빵재료)
print("시간:", 굽는시간)

여기 객체변수에 데이터를 할당할 수 있는 '붕어빵만들기' 와 '재료시간출력' 메소드가 있습니다.

객체변수를 사용하는 '재료시간출력' 메소드를 실행하기 위해서는 '붕어빵만들기' 메소드를 실행해야 합니다.

'붕어빵만들기' 메소드를 실행해야 객체변수에 데이터가 할당되기 때문입니다.

그게 귀찮아서 생성자가 탄생했습니다.

class 붕어빵틀:
    def __init__(self,재료, 시간):
        self.재료 = 재료
        self.시간 = 시간
    def 재료시간출력(self):
        붕어빵재료 = self.재료
        굽는시간 = self.시간
        print("재료:", 붕어빵재료)
        print("시간:", 굽는시간)

팥붕 = 붕어빵틀('팥', '10분')
팥붕.재료시간출력()

여기 __init__ 메소드가 바로 생성자입니다.

'붕어빵만들기' 메소드와 내용물이 완전히 같은걸 알 수 있습니다.

생성자는 객체가 생성될 때 자동으로 실행되는 메소드입니다.

생성자의 매개변수는 객체를 생성할때 클래스명 옆에 있는 괄호에 담아주면 됩니다.

이때 self 매개변수는 객체명이 자동으로 할당됩니다.

 

이제 클래스는 어느정도 이해가 되었겠네요.

이번엔 상속을 알아보겠습니다.

 

상속은 기존 클래스의 내용물을 그대로 가져오는 것입니다.

그리고 기존 클래스의 내용물을 가져와서 기능을 추가하거나 변경하는 것을 오버라이딩이라고 합니다.

class 붕어빵틀:
    def __init__(self,재료, 시간):
        self.재료 = 재료
        self.시간 = 시간
    def 재료시간출력(self):
        붕어빵재료 = self.재료
        굽는시간 = self.시간
        print("재료:", 붕어빵재료)
        print("시간:", 굽는시간)

class 강화된붕어빵틀(붕어빵틀):
    pass    

슈붕 = 강화된붕어빵틀('슈크림', '12분')
슈붕.재료시간출력()

위 예제에서는 '강화된붕어빵틀'이라는 클래스를 만들고 '붕어빵틀' 클래스를 상속해주었습니다.

상속하는 방법은 상속받을 클래스명 옆에 상속할 클래스명을 괄호에 담아 넣어주면 됩니다.

참고로 pass 키워드는 기존의 '붕어빵틀' 클래스를 상속하는 '강화된붕어빵틀' 클래스를 만드는 예시를 위해서 사용했습니다.

 

위 코드에서 '붕어빵틀' 클래스가 아니라 '강화된붕어빵틀'이라는 클래스를 이용해서 슈붕이라는 객체를 생성했습니다.

슈붕 객체에서는 기존 '붕어빵틀' 클래스의 '재료시간출력' 메소드를 그대로 사용할 수 있다는 것을 확인할 수 있습니다.

 

자 그럼 이제 상속받은 클래스에 특수한 기능을 추가해 보겠습니다.

class 붕어빵틀:
    def __init__(self,재료, 시간):
        self.재료 = 재료
        self.시간 = 시간
    def 재료시간출력(self):
        붕어빵재료 = self.재료
        굽는시간 = self.시간
        print("재료:", 붕어빵재료)
        print("시간:", 굽는시간)

class 강화된붕어빵틀(붕어빵틀):
    def 붕어빵화력증가(self):
        빨라진굽는시간 = "기존 " + self.시간 + "보다 5분 빨라짐"
        print(빨라진굽는시간)  

슈붕 = 강화된붕어빵틀('슈크림', '12분')
슈붕.붕어빵화력증가()

위 예제에서는 '강화된붕어빵틀' 클래스에 '붕어빵화력증가' 메소드를 추가하였습니다.

'붕어빵화력증가' 메소드를 실행하면 객체 생성 시 객체변수 '시간'에 할당된 값보다 5분 빨라졌따는 메시지를 출력할 수 있습니다.

 

이번엔 상속받은 메소드를 수정하는 오버라이딩을 해보겠습니다.

상속 개념에서 내용물을 상속해주는 클래스를 부모클래스, 상속받는 클래스를 자식클래스라고 부릅니다.

메소드 오버라이딩은 자식클래스에서 부모클래스의 메소드를 변경해서 사용하고 싶을 때 쓰는 개념입니다.

class 붕어빵틀:
    def __init__(self,재료, 시간):
        self.재료 = 재료
        self.시간 = 시간
    def 재료시간출력(self):
        붕어빵재료 = self.재료
        굽는시간 = self.시간
        print("재료:", 붕어빵재료)
        print("시간:", 굽는시간)

class 강화된붕어빵틀(붕어빵틀):
    def 재료시간출력(self):
        붕어빵재료 = self.재료
        굽는시간 = self.시간
        print("재료:", 붕어빵재료)
        print("시간:", 굽는시간, "보다 5분 빨라짐") 

슈붕 = 강화된붕어빵틀('슈크림', '12분')
슈붕.재료시간출력()

위 코드에서 부모 클래스인 ‘붕어빵틀’ 클래스에 포함된 ‘재료시간출력’ 메소드를 자식 클래스인 ‘강화된붕어빵틀’ 클래스에서 오버라이딩해주었습니다.

메소드 오버라이딩을 통해 ‘재료시간출력’ 메소드의 출력 내용을 변경할 수 있었습니다.

 

이번엔 클래스 변수를 알아보겠습니다.

클래스변수는 객체변수와는 조금 다른 개념입니다.

객체변수는 각 객체의 고유한 데이터를 저장하는 변수이고

클래스변수는 해당 클래스가 생성한 모든 객체에서 공유하는 데이터를 저장하는 변수입니다.

class 붕어빵틀:
    사장님 = '고고포스트잇'
    def __init__(self,재료, 시간):
        self.재료 = 재료
        self.시간 = 시간
    def 재료시간출력(self):
        붕어빵재료 = self.재료
        굽는시간 = self.시간
        print("재료:", 붕어빵재료)
        print("시간:", 굽는시간)

슈붕 = 붕어빵틀('슈크림', '12분')
print(슈붕.사장님)

위 코드에서 ‘붕어빵틀’ 클래스에 ‘사장님’ 이라는 클래스변수를 선언하고 ‘고고포스트잇’이라는 데이터를 할당하였습니다.

그리고 ‘슈붕’ 객체를 생성하고 ‘슈붕’ 객체에서 ‘사장님’ 변수를 호출하여 print함수로 출력하였습니다.

 

이번에는 클래스 변수에 저장된 데이터를 수정해볼게요.

class 붕어빵틀:
    사장님 = '고고포스트잇'
    def __init__(self,재료, 시간):
        self.재료 = 재료
        self.시간 = 시간
    def 재료시간출력(self):
        붕어빵재료 = self.재료
        굽는시간 = self.시간
        print("재료:", 붕어빵재료)
        print("시간:", 굽는시간)

슈붕 = 붕어빵틀('슈크림', '12분')
print(슈붕.사장님)

붕어빵틀.사장님 = '스탑포스트잇'
print(슈붕.사장님)

위 코드에서는 붕어빵틀.사장님 = ‘스탑포스트잇’ 코드를 이용해 ‘붕어빵틀’ 클래스를 직접 호출하여 ‘사장님’ 변수에 데이터를 재할당했습니다.

이후에 ‘슈붕’ 클래스를 호출하여 ‘사장님’ 변수의 데이터를 출력하니 재할당된 데이터가 출력됨을 확인할 수 있었습니다.

이처럼 클래스변수 값은 클래스를 직접 호출해 수정할수도 있습니다.

 

클래스 개념이 정말 이해하기 어려운 개념 중 하나인데 그래도 상세히 하나씩 뜯어보았습니다.

여기까지의 강의 내용은 아래 링크에서 확인하실 수 있습니다.

https://youtu.be/eb7spxN2KQg

 

반응형