데이터분석

[23.06.13] Python 클래스 - 08(1)

gmwoo 2023. 6. 13. 11:19

1. 클래스

result1 = 0
result2 = 0

def add1(num):
    global result1
    result1 += num
    return result1

def add2(num):
    global result2
    result2 += num
    return result2

print(add1(3))
print(add2(3))

 * 위의 코드는 계산기 프로그램
 * 함수로 두 개의 계산기를 만들었는데, 10개의 계산기를 만들기 위해 함수 10개가 필요함??
 * 이를 해결하기 위한 것이 "클래스"
 * 클래스 안에서 구현된 함수는 함수라고 하지 않고 메서드라고 함
 

1) 클래스는 왜 필요한가?

 - 반복되는 변수나 메서드(함수)를 미리 정해놓은 틀(설계도)

############ 위의 함수를 클래스로 묶어 계산기 만듦 ##############

class Calculator:
    def __init__(self):
        self.result = 0
        
    def add(self, num):
        self.result += num
        return self.result
    
    def sub(self, num):
        self.result -= num
        return self.result
        
cal1 = Calculator()
cal2 = Calculator()
cal3 = Calculator()  # 계속해서 계산기를 만들 수 있음(클래스 장점)

print(cal1.add(3))
print(cal1.add(4))
print(cal2.add(3))
print(cal2.add(7))
print(cal3.sub(4))

 

2) 클래스 쓰는 방법

 - class 입력
 - 대문자로 시작하는 클래스 이름 작성
 - 안에 들어갈 함수와 변수 설정

 

3) 클래스(class)와 객체(object)

 - 클래스: 똑같은 무엇인가를 계쏙해서 만들어 낼 수 있는 설계 도면
 - 객체: 클래스로 만든 피조물
 - ex) 과자 틀(클래스)과 이 틀로 찍어 만든 과자(객체)
 

4) pass

 - 아무 기능이 없는 껍질뿐인 클래스도 객체 생성이 가능

class Cookie:
    pass

a = Cookie()
b = Cookie()

 - a = Cookie(): a는 객체
 - a 객체는 Cookie의 인스턴스
 

5) 생성자

class class_name:
    def __init__(self):
        # 이 부분에 초기화할 코드 입력

 - 인스턴스를 생성하면서 필드값을 초기화 시키는 함수
 - 기본 형태: __init__()
 - 프로그램을 작성 시 이 이름을 사용해서 새로운 함수나 변수명을 만들지 말 것
 

2. 클래스를 이용하여 계산기 만들기

 * 사칙연산이 모두 가능한 계산기
 ** 클래스 안에 구현된 함수를 메서드(method) 라고 부름
 ** setdata 메서드의 입력 인수는 self, first, second라는 3개의 입력값을 받음
 ** set 메서드의 첫 번째 인수에는 자동으로 a라는 인스턴스가 입력으로 들어가게 됨

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 sub(self):
        result = self.first - self.second
        return result
        
    def mul(self):
        result = self.first * self.second
        return result
        
    def div(self):
        result = self.first / self.second
        return result
    
a = FourCal(4, 2)   # a는 setdata, add를 가지고 있음
print(a.add())
print(a.first)
print(a.second)

print(a.sub())
print(a.mul())
print(a.div())

 

1) 클래스의 상속

 - 물려받다

##### 위 코드 상속 #####

class MoreFourCal(FourCal):
    pass

a = MoreFourCal(4, 2)
print(a.add())

 - 어떤 클래스를 만들 때 다른 클래스의 기능을 물려받을 수 있게 만드는 것
  ** FourCal 클래스를 상속하는 MoreFourCal 클래스

###### 제곱 ######

class MoreFourCal(FourCal):
    def pow(self):
        result = self.first ** self.second
        return result
    
a = MoreFourCal(4, 2)
print(a.pow())

 - 상속하는 클래스에 pass 뿐만 아니라 새로운 연산이 필요한 경우, 함수를 만들 수 있음 
 

2) 메서드 오버라이딩(Overriding)

 - 상속받을 대상인 클래스의 메서드와 이름은 같지만, 그 행동을 다르게 해야 할 때 메서드 이름을 동일하게 다시 구현하는 것
 - 상위 클래스의 메서드를 서브 클래스에서 재정의
  ** FourCal 클래스의 객체 a에 4와 0 값을 설정하고 div 메서드를 호출하면 4/0 오류 발생
  ** 오류가 아닌 0을 돌려주도록 만들고 싶다면 FourCal 클래스를 상속하는 SafeFourCal 클래스를 만듦

###### 메서드 오버라이딩 #####
class SafeFourCal(FourCal):
    def div(self):
        if self.second == 0:
            return 0
        else:
            return self.first / self.second
        
a = SafeFourCal(4, 0)
print(a.div())
반응형