TanzDev

TIL 24 (클래스 ) 본문

기록보드/TIL

TIL 24 (클래스 )

Tanz-dev 2024. 2. 24. 23:22

클래스의 필요성

 

계산기로 예를들때, 일반적인 함수나 명령문을 사용하게되면 매 명령문마다 같은작업을 반복해줘야한다.

클래스를 사용하게될때 금형과 찍어내는 제품들이라고 이해했다.

 

금형은 일반적인 똑같은 제품들을 대량으로 양산해야할때 만드는건데, 주로 사출쪽에서 많이 쓴다.

비슷한예로 붕어빵틀이 금형이다.

 

붕어빵을 예로들면 붕어빵틀이 곧 클래스이고, 붕어빵은 객체로 이해하면 된다.

 

객체마다 지정된 id가 다르나 붕어빵틀에서 나온건 같다.

 

예제에서는 계산기로 예를 들었다.

 

class FourCal:
    def setdata(self, first, second):
        self.first = first
        self.second = second
    def add(self):
        result = self.first + self.second
        return result
    def mul(self):
        result = self.first * self.second
        return result
    def sub(self):
        result = self.first - self.second
        return result
    def div(self):
        result = self.first / self.second
        return result

a = FourCal()
a.setdata(4, 2)
print(a.add()) #add이기때문에 6 출력
print(a.mul()) #mul이기때문에 8 출력
print(a.sub()) #sub이기때문에 2 출력
print(a.div()) #div이기때문에 2 출력

 

self는 자기자신한테 대입한다는 말이고

first는 a.setdata의 4부분을 담당하고 second는 2 부분을 담당한다.

 

이렇게 계산기를 하나 만들어두면 나중에 계산이 필요할때 똑같은 함수를 수정하거나 할 필요없이 불러와서 사용해주면된다.

 

생성자

 

생성자를 쓰는 이유 - 처음에 어떤 클래스로 인스턴스를 만들어낼때 필수적인것들은 미리 처음 시작하자마자 입력하는 무언가 있으면 좋겠다에서 나온게 생성자의 개념이다.

 

__init__ : 클래스를 실행할때 무조건 제일먼저 실행되는 클래스 함수이다.

 

class FourCal:
    def __init__(self, first, second): #생성자이며, 가장먼저 실행된다.
        self.first = first             #즉 FourCal에 미리 세팅을 해둔다고 보면 될거같다.
        self.second = second
    def setdata(self, first, second):
        self.first = first
        self.second = second
    def add(self):
        result = self.first + self.second
        return result
    def mul(self):
        result = self.first * self.second
        return result
    def sub(self):
        result = self.first - self.second
        return result
    def div(self):
        result = self.first / self.second
        return result

a = FourCal(4, 2) # 초기값을 미리 설정해줄 수 있다.

print(a.first) # 4가 출력된다.
print(a.second) # 2가 출력된다.

 

미리 중복되는 작업이 있다면 생성자로 초기값을 미리 세팅해두어 좀 더 편하게 작업할 수 있을것같다.

 

클래스의 상속

클래스는 부모-자식관계로 HTML에서 배운것처럼 상속개념이 있다.

부모가 가진 모든 속성을 자식속성의 클래스에게 넘겨줄 수 있고, 만약에 부모속성에서 값이 잘못되어 변수를 수정해줘야한다면 자식 클래스에서 수정하면 똑같은 값일때 부모속성의 값보다 자식의 값이 우선된다.

 

만약 같은기능이라면 구지 부모를 오래 두지않고 자식으로 업데이트하는게 낫지않나 생각이 든다. 

 

 

라고 생각을 했는데, 기존 클래스가 라이브러리 형태면 어쩔수없구나 하고 이해하게되어버렸다..

 

class FourCal:
    def __init__(self, first, second):
        self.first = first            
        self.second = second
    def setdata(self, first, second):
        self.first = first
        self.second = second
    def add(self):
        result = self.first + self.second
        return result
    def mul(self):
        result = self.first * self.second
        return result
    def sub(self):
        result = self.first - self.second
        return result
    def div(self):
        result = self.first / self.second
        return result
class MoreFourCal(FourCal):
    def pow(self):
        result = self.first ** self.second
        return result

a = MoreFourCal(4, 2) # 부모가 가진 속성을 포함하면서, 추가한 ** 기능을 수행해준다.

print(a.add()) # 6이 출력된다.
print(a.pow()) # 4의 제곱이므로 16이 출력된다.

 

매서드 오버라이딩

이건 쉽게 이야기해서 부모 클래스에서 문제가 있는 영역이 발견될 경우 동일한 기준에서 자식클래스가이 그 부분을 수정해주면, 부모클래스 기능은 기능하지않고 자식이 만든 기능에서 기능하게 해준다.

 

위에서 살펴본대로 라이브러리로 나오는 클래스에서 사용해볼만하다고 생각든다.

 

class FourCal:
    def __init__(self, first, second):
        self.first = first            
        self.second = second
    def setdata(self, first, second):
        self.first = first
        self.second = second
    def add(self):
        result = self.first + self.second
        return result
    def mul(self):
        result = self.first * self.second
        return result
    def sub(self):
        result = self.first - self.second
        return result
    def div(self):
        result = self.first / self.second
        return result
class MoreFourCal(FourCal):
    def pow(self):
        result = self.first ** self.second
        return result
class SafeFourCal(FourCal):
    def div(self): #부모에 있는 div를 똑같이 썼다.
        if self.second == 0:
            return 0
        else:
            return self.first / self.second
a = FourCal(4, 0)
b = SafeFourCal(4, 0) #자식클래스에선 if문으로 조건을 줘서 0이 출력되게 했다.

print(a.div()) # division by zero 0은 출력될 수 없다고 에러 메세지가 뜬다.
print(b.div()) # 0 이 출력된다.

 

클래스 변수

 

완전히 다른 인스턴스이더라도, 동일한 값으로 얻고싶다면 클래스 공통으로 사용하고싶다면 클래스 변수를 사용해주면된다.

 

class Family:
    lastname = '김'

a = Family()
b = Family()
c = Family()

a.lastname = '박' # A는 개명했다.

print(a.lastname) # 개명해서 박
print(b.lastname) # 개명안해서 김
print(c.lastname) # 개명안해서 김이 출력된다.

 

이런식으로 이해하면 될거같다.

 

금일 공부중 느낀점

 

- 클래스는 이전에 봤던 책에서 객체지향이라는 말들이랑 엮여있어서 조금 이해가 되긴되었는데,

앞으로 실무를 보게되며 어떤식으로 쓰일지 잘 고민해봐야될거같다.

 

'기록보드 > TIL' 카테고리의 다른 글

TIL 26 (클래스 이용하기 과제달성)  (1) 2024.02.27
TIL 25 파이썬 개별과제 진행중  (1) 2024.02.26
TIL 23 (파이썬 함수)  (0) 2024.02.23
TIL 22 (파이썬 제어문)  (1) 2024.02.22
TIL 21 (자료형 종료)  (1) 2024.02.21