세조목

PYTHON 정리(점프투파이썬 - 클래스)(24.01.18) 본문

데이터 분석 공부/Python

PYTHON 정리(점프투파이썬 - 클래스)(24.01.18)

세조목 2024. 1. 18. 21:21
  • 본 내용들은 PYTHON을 공부하면서 차후 제가 복습하기위해 정리해놓은 것으로 제가 새롭게 알게된 내용들만을 정리하였습니다. 또한 배움이 부족하여 미처 다 파악하지 못한 부분들도 많으니 혹시나 이 포스팅을 보시는 분들께서는 다른 포스팅, 도서, 강의도 함께 참고하시기 바라겠습니다.

 

1. 객체 & 인스턴스

'인스턴스' 라는 말은 관계 위주로 설명할 때 사용한다.

특정 객체가 어떤 클래스의 객체인지를 설명할 때 사용하는 것이다.

예를 들어 'one은 인스턴스다'보다 'one은 객체'라는 표현이 어울리고,

'one은 number의 객체'보다 'one은 number의 인스턴스'라는 표현이 훨씬 잘 어울린다.

클래스(class) = 빵틀
객체(object) = 빵
객체는 클래스의 인스턴스

 

2. 클래스로 계산기 만들기

class calculator:
    def setdata(self, a, b):
        self.a = a
        self.b = b
    def sum(self, a, b):
        result = self.a + self.b
        return result
    def minus(self, a, b):
        result = self.a - self.b
        return result
        return result
    def multiple(self, a, b):
        result = self.a * self.b
        return result
    def div(self, a, b):
        result = self.a / self.b
        return result

k=calculator()
k.setdata(9, 1512352)
k.sum(9, 1512352)
>>> 1512361
k.minus(9,1512352)
>>> -1512343
k.multiple(9,1512352)
>>>3,611,168
k.div(9,1512352)
>>> 0

 

3. 생산자 사용

위 코드에서는 setdata 메소드를 항상 수행해야 다음 계산을 수행할 수 있다.

만약 초깃값을 설정할 필요가 있다면 메서드를 호출하는 것보다는 생성자를 구현하는 것이 더 바람직하다.

생성자 = 객체가 생성될 때 자동으로 호출되는 메서드

class calculator:
	def __init__(self, a, b):
    	self.a = a
        self.b = b
    def setdata(self, a, b):
        self.a = a
        self.b = b
    def sum(self):
        result = self.a + self.b
        return result
    def minus(self):
        result = self.a - self.b
        return result
    def multiple(self):
        result = self.a * self.b
        return result
    def div(self):
        result = self.a / self.b
        return result

__init__을 사용하면 이 메서드는 생성자가 된다.

다시말해 객체가 생성될때 자동으로 호출된다.

 

만약

k = calculator()

를 입력한다면 아래와 같은 메시지가 나올것이다.

TypeError: __init__() missing 2 required positional arguments: 'a' and 'b'

생성자의 매개변수 a와 b에 해당하는 값을 입력해주지 않았기때문에 발생한 오류이다.

이 오류를 해결하기 위해서는 Calculator( ) 괄호 안에 값을 입력해줘야한다.

k = calculator(5,8)

위와 같이 입력하면 __init__메서드의 매개변수에 다음과 같은 값이 전달된다.

매개변수
self 생성되는 객체
a 5
b 8

self에 값을 넣지 않는 이유가 궁금할 수 있는데

def setdata(self, first, second):

에서 'self' 자리에는 생성되는 객체가 자동으로 전달되기때문이다.

지금까지 작성했던 코드를 예시로 들어보면

def __init__(self, a, b):
k  = calculator(5,8)

def __init__(self, a, b):

에서 self에는 'k'가

a에는 5가

b에는 8이

들어가게된다.

 

4. 클래스의 상속

상속이란 내가 가지고 있는걸 다른 사람에게 물려준다는 의미로

클래스도 이러한 상속이 가능하다.

어떻게?

새로운 클래스명( )의 소괄호 안에 기존 클래스명을 적어주면 된다.

아래와 같이

class new_cal(calculator):
	pass

 

new_cal은 calculator를 상속받았기때문에

calculator의 모든 메소드를 사용할 수 있다.

예를 들어

n = new_cal(5,7)

일 때 calculator 클래스에 있던 add와 multiple메소드를 사용하면

아래와 같이 더하기, 곱하기한 값을 확인할 수 있게된다.

n.add()
>>> 12

n.multiple()
>>> 35

 

이같은 상속 기능은 기존 클래스를 변경하지 않고 기능을 추가하거나 기존 기능을 변경하려고 할 때 사용한다.

기존 클래스를 변경하지 않고 상속시킬수밖에 없는 이유는

기존 클래스가 라이브러리 형태로 제공되거나 수정이 허용되지 않는 경우가 있기 때문이다.

 

new_cal 클래스에 calculator 클래스를 상속시켰으니

이제 새로운 메서드를 추가해보자.

class new_cal(calculator):
	def pow(self):
    	result = self.a ** self.b
        return result

 

pow 메서드를 사용해보자

n = new_cal(2,3)
n.pow()
>>> 8

2에 3승인 8이 출력되는 것을 확인할 수 있다.

 

5. 메서드 오버라이딩

메서드 오버라이딩이란 기존에 있던 메서드에 새로운 메서드를 overriding하는 것이다.

 * 상속이 우선돼야한다.

overriding은 '다른 무엇보다 더 중요한', '최우선시 되는' 이라는 뜻을 가지고있는데

한마디로 기존 메서드를 업데이트시키는 것이라고 이해하면 된다.

 

예를 들어 아래와 같이 4를 0으로 나누려고하면

c = calculator(4,0)
c.div()

다음과 같은 오류 메시지가 뜰것이다.

ZeroDivisionError: division by zero

 

0으로 나눈값은 있을수가 없기때문이다.

 

그렇다면 0으로 나눴을때 오류값이 뜨지 않게 하기위해서는 어떻게 하면 될까?

이 때 메서드 오버라이딩을 활용해야한다.

먼저 calculator 클래스를 새로운 클래스인 sec_cal 클래스에 상속시켜준다.

class sec_cal(calculator)

그런 다음 div메서드를 작성해주는데 이 때 매개변수 b에 들어가는 값이 0이라면 0을 반환하라는 조건을 걸어준다.

class sec_cal(calculator):
	def div(self):
    	if self.b == 0:
        	return 0
        else:
        	return self.a / self.b

이렇게 메서드 오버라이딩을 한 후 매개변수 a를 0으로 나누면 0이 반환되는 것을 확인할 수 있다.

s = sec.cal(4,0)
s.div()
>>> 0

 

6. 클래스 변수

클래스에는 두 가지 변수가 있는데 하나는 앞에서 살펴봤던 '객체변수'이고, 나머지 하나는 '클래스변수'다.

 

아래와 같은 클래스가 있다고 가정해보자.

class animal:
	species = 'dog'

 

animal 클래스에 선언한 species가 클래스 변수이며

객체 변수를 만들때 클래스 안에 함수를 선언하는 것과 마찬가지로

클래스 변수 역시도 클래스 안에 변수를 선언해야한다.

 

클래스 변수를 선언했으니 'animal.species'를 입력하면 'dog'가 출력된다.

animal.species
>>> 'dog'

 

클래스로 만든 객체를 이용해서도 클래스변수를 사용할 수 있다.

house = animal()
factory = animal()

 

이렇게 객체를 만든다음 아래와 같이 입력하면 똑같이 'dog'가 출력되는 것을 확인할 수 있다.

house.species
>>> 'dog'

factory.species
>>> 'dog'

 

클래스변수의 값은 손쉽게 바꿀수가 있는데

animal.species = 'horse'

라고 입력한 후

house.species를 입력하면

'horse'가 출력된다.

animal.species = 'horse'

house.species
>>> 'horse'

 

factory.species라고 입력해도 똑같이 'horse'가 출력된다.

클래스변수의 경우 객체변수와는 다르게 클래스로 만든 모든 객체에 공유되기때문이다.

 

다만

house.species = 'wolf'

로 변경했을 경우에는 클래스로 만든 나머지 객체에 공유되지 않는다.

house.species = 'wolf'
house.species
>>> 'wolf'

factory.species
>>> 'horse'