본문 바로가기
파이썬(Python)/파이썬(Python) 기초

파이썬(Python) 5장 추가적인 기본 사항 - 1. 클래스

by 인생즐겜러 2022. 7. 6.
728x90
반응형

1. 클래스와 객체

2. 사칙연산 클래스를 제작

3. 생성자

4. 클래스의 상속

5. 메서드 오버라이딩

6. 클래스 변수

 

 

 

 

 


 

 

 

 

 

1. 클래스와 객체

 

 

 

클래스

 

이전에 함수를 설명할 때, 일정한 행동을 하는 기계라고 설명했다.

클래스는 이 함수의 확장판 같은 개념이다.

예를 들면 덧셈의 기능을 하는 함수add가 있고 뺄셈을 하는 함수 minus가 있다고 하면

이 둘을 모두를 가지고 있는 거대한 집합체, 그것이 클래스다.

 

이 클래스를 소환해서 그 안에 있는 함수를 활용할 수도 있다.

클래스 안에 구현된 함수는 다른 말로 메서드(Method)라고 부른다

 

 

 

 

 

객체

 

클래스를 변수에 담은 것을 객체라 한다.

마치 뽑기 틀로 뽑기를 찍어내 듯

새로운 변수에 담은 만큼 새로운 객체가 생길 수 있으므로 무한히 생성이 가능하다.

하지만 같은 뽑기 틀로 뽑기를 뽑아도 다른 뽑기이듯이각 변수의 이름이 다를 것이므로 각각의 객체는 고유하다.

 

class bbopki :		# 클래스의 구조
    Pass
    
    
    
a = bbopki()
b = bbopki()		# a와 b는 각각 다른 객체다



type(a)				# 타입을 확인하면 클래스 타입이 나온다.
<class '__main__.bbopki'>

 

 

 

 

 


 

 

 

 

 

2. 사칙연산 클래스를 제작

 

사칙연산 클래스 안에는 무엇이 들어가야 할까?

1. 덧셈

2. 뺄셈

3. 곱셈

4. 나눗셈

 

각각의 함수를 제작하여 넣어야한다. 거기에 연산을 할 인수를 받는 함수도 필요하다.

필요한 함수들은 정해졌으니 각각에 맞춰 제작을 해보자.

 

 

 

인수 받는 함수 제작

 

def datacome(self, first, second):   # 메서드의 매개변수
    self.first = first              # 메서드의 수행문
    self.second = second            # 메서드의 수행문
    
    
    
a = Cal()						# a라는 객체 생성
a.datacome(4, 2)					# 메서드 호출

 

우선, 매개변수와 메서드 호출을 보면 뭔가 이상한 것을 알 수 있다.

호출 시 인수를 2개 밖에 받지 않는다.

메서드의 첫 번째 매개변수 self를 명시적으로 구현하는 것은 파이썬만의 독특한 특징이다.

이 self는 다른 이름이어도 되지만 해당 위치는 객체인 a를 인수로 받는다.

그리고 4,2 를 순차적으로 인수로 받는다.

 

 

 

 

 

매서드의 호출 방법은 위의 방법을 포함해서 2가지가 있다.

아래의 예시를 확인해보자.

 

1.
>>> a = Cal()			
>>> Cal.datacome(a, 4, 2)	# 객체 이름을 인수에 쓰고 앞에 클래스를 쓰는 방법



2.
>>> a = Cal()
>>> a.datacome(4, 2)		# 객체 이름을 앞에 쓰고 인수에 쓰지 않는 방법

 

 

 

 

 

객체에 생성되는 객체만의 변수를 객체변수라고 부른다.

클래스로 만든 객체의 객체변수는 다른 객체의 객체변수에 상관없이 독립적인 값을 유지한다.

아래의 예시를 보자.

 

>>> a = FourCal()
>>> b = FourCal()

>>> a.datacome(1, 2)
>>> print(a.first)
1

>>> b.datacome(3, 4)
>>> print(b.first)
3

 

a와 b는 다른 객체이므로 같은 first여도 독립적이다.

 

 

 

 

 

나머지 사칙연산 메서드 제작

 

>>> class Cal:
...     def datacome(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.setdata(2, 1)
>>> b.setdata(3, 1)
>>> a.add()
3
>>> b.mul()
3

 

위와 같이 제작 후 결과를 확인해보면 잘 동작하는 걸 확인할 수 있다.

 

 

 

 

 


 

 

 

 

 

3. 생성자

 

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

 

위의 예에서는 datacome이라는 데이터 인수를 받는 메서드를 만들었었다.

하지만 해당 인수를 일일히 넣으면서 수행하는 건 너무 번거로운 일이기도 하고

안전하지 않기 때문에 해당 메서드를 이용하는 게 좋다.

 

아래는 생성자의 구조이다.

 

def __init__(self, first, second):
    self.first = first
    self.second = second

 

datacome의 구조와 동일하고 명칭만 다르다. 해당 명칭이 생성자를 만드는 구문이다.

위의 예시를 datacome 대신에 넣으면

굳이 datacome 으로 값을 넣고 그 이후에 연산을 하지 않고

바로 연산이 가능하다.

 

1. 생성자 넣기 전
>>> a = Cal()
>>> a.datacome(4, 2)
>>> a.add()
6



2. 생성자 넣은 후
>>> a = Cal(4, 2)
>>> a.add()
6

 

 

 

 

 


 

 

 

 

 

4. 클래스의 상속

 

 

 

기존 클래스에 다른 클래스의 기능을 추가할 수 있게 하는 것.

 

상속을 하는 구조는 아래와 같다.

 

class 클래스 이름(상속할 클래스 이름)

 

 

 

 

 

위에서 만든 사칙연산 클래스의 기능을 새로 만든 클래스에 넣어보자면

 

>>> class CalCal(Cal):
...     def MulMul(self):
...         result = self.first * self.second * self.first
...         return result
... 
>>> a = CalCal(4, 2)
>>> a.add()
6
>>> a.MulMul()
32

 

위의 예시처럼 새로 만들어진 CalCal 의 객체인 a가 덧셈을 할 수 있음을 볼 수 있다.

또한 새로 생성된 CalCal 내부에 만들어진 메서드도 잘 동작하는 것을 볼 수 있다.

 

 

 

 

 


 

 

 

 

 

5. 메서드 오버라이딩

 

 

 

기본의 클래스에 있는 메서드를 새로운 클래스의 메서드로 덮어쓰기하는 것을 말한다.

 

위의 사칙연산에서 나눗셈을 0으로 한다고 가정하면 에러가 발생한다.

우리는 이 에러 발생을 막기 위해 아래처럼 만들어보면

 

>>> class CalCal(Cal):
...     def div(self):
...         if self.second == 0:  # 나누는 값이 0인 경우 0을 리턴하도록 수정
...             return 0
...         else:
...             return self.first / self.second
...
>>>
>>> a = CalCal(2, 0)
>>> a.div()
0

 

새로운 CalCal의 div 메서드가 기존의 메서드를 덮어 쓴 결과값이 나오는 걸 볼 수 있다.

 

 

 

 

 


 

 

 

 

 

6. 클래스 변수

 

별 건 없다. 말 그대로 클래스 안에 있는 변수다.

때문에 객체(아래 예시의 a, b)들은 클래스로 만들기 때문에 클래스 변수가 변하면 모두 변한다.

당연한 거다.

 

아래 예시를 보면 설명은 끝난다.

 

>>> class name:
...     lastname = "이"
...
>>> a = Family()
>>> b = Family()
>>> print(a.lastname)
이
>>> print(b.lastname)
이



>>> Family.lastname = "박"
>>> print(a.lastname)
박
>>> print(b.lastname)
박

 

 

 

 

 

참고로 객체의 변수를 바꾼다고 해도 클래스의 변수는 변하지 않는다.

당연히 다른 객체의 변수도 변하지 않는다.

 

>>> a.lastname = "최"		# a 객체의 값만 바꿨다.
>>> print(a.lastname)
최

>>> print(Family.lastname)		# 그대로다
박
>>> print(b.lastname)
박
728x90
반응형

댓글