04장 연습문제 ~ 05~1 (p.179 ~ p.206)

 

오늘 공부한 클래스는 처음 접하는 개념이라서 이해를 하는데 전보다는 시간이 더 걸렸다.

클래스를 공부하기 전에 4장 연습문제를 풀었는데 한 문제씩 정답을 맞히니 기분이 좋았다.

이 기분을 양분으로 삼아서 더 열심히 해야겠다.

 

기분이 조크든요

 


 

5장 : 파이썬 날개 달기

 

5장에서는 프로그래밍의 꽃이라 할 수 있는 클래스와 모듈, 예외 처리 및 파이썬 라이브러리에 대해서 배운다. 여기까지 끝내면 파이썬 프로그램을 작성하기 위해 알아야 할 대부분의 내용을 배우게 된다고 한다.

 

05-1 클래스

 

클래스는 프로그램 작성을 위해 꼭 필요한 건 아니지만, 적재적소에 사용하면 매우 편리한 요소이다.

# 클래스의 예
class Calculator:
    def __init__(self):
        self.result = 0
    
    def add(self, num):
        self.result += num
        return self.result

cal1 = Calculator()
cal2 = Calculator()

* 클래스(class)란 똑같은 무언가를 계속해서 만들어 낼 수 있는 설계 도면(과자 틀)이고, 객체(object)란 클래스로 만든 피조물(과자)을 뜻한다.

클래스는 함수처럼 구조는 여러 로직들을 모아놓은 모양새지만 가장 큰 특징은 같은 클래스로 생성한 여러 가지 다른 이름의 객체(cal1, cal2)들은 서로 영향을 받지 않고 독립적인 값을 유지한다는 것이다.

 

* 클래스로 만든 객체를 인스턴스라고도 한다. 객체와의 차이는 'cal1 = Calculator()'에서 cal1은 객체이고 a객체는 Calculator의 인스턴스이다.

 

사칙연산 클래스 만들기

클래스는 무작정 만드는 것보다 클래스로 만든 객체를 중심으로 어떤 식으로 동작하게 할 것인지 미리 구상을 한 후에 생각한 것들을 하나씩 해결하면서 완성해 나가는 것이 좋다.(메서드 = 클래스 안에 구현된 함수)

사칙연산 클래스(FourCal)
setdata 메서드 두 숫자 입력
add 메서드 더하기 기능
mul 메서드 곱하기 기능
sub 메서드 빼기 기능
div 메서드 나누기 기능

 

# 사칙연산 클래스
class FourCal: # 클래스 구조
    def setdata(self, first, second): # 객체에 숫자 지정 
                                      # a 객체를 만들면(a.setdata(4, 2)) 첫 번째 매개변수 self에는 setdata메서드를 호출한 객체 a가 자동으로 전달
        self.first = first
        self.second = second
    def add(self): # 매개변수 = self, 반환값 = result
        result = self.first + self.second # = result = a.first + a.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()
b = FourCal()
a.setdata(4, 2)
b.setdata(3, 8)

a.add()
>>> 6
a.mul()
>>> 8
a.sub()
>>> 2
a.div()
>>> 2

b.add()
>>> 11
b.mul()
>>> 24
b.sub()
>>> -5
b.div()
>>> 0.375

 

생성자(Constructor)

객체에 초깃값을 설정해야 할 필요가 있을 때는 setdata와 같은 메서드를 호출하여 초깃값을 설정하기보다는 생성자를 구현하는 것이 안전한 방법이다.

 

* 생성자(Constructor)란 객체가 생성될 때 자동으로 호출되는 메서드를 의미한다. 파이썬 메서드 이름으로 __init__를 사용하면 생성자 생성

# FourCal 클래스에 생성자 사용
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
        
a = FourCal(4, 2) # 생성자로 인해 a.first = 4, a.second = 2 바로 대입
print(a.first)
>>> 4
print(a.second)
>>> 2

a.add()
>>> 6
a.div()
>>> 2.0

 

클래스의 상속

'재산을 상속받다'의 상속과 같은 의미로 어떤 클래스를 만들 때 다른 클래스의 기능을 물려받을 수 있게 한다.

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): # class 클래스 이름(상속할 클래스 이름):
    def pow(self):
        result = self.first ** self.second # 제곱
        return result
# FourCal 클래스를 상속했으므로 FourCal 클래스의 모든 기능 사용 가능

a = MoreFourCal(4, 2)
a.add()
>>> 6
a.mul()
>>> 8
a.sub()
>>> 2
a.div()
>>> 2
a.pow() # 제곱
>>> 16

# 메서드 오버라이딩(상속한 클래스에 있는 메서드를 동일한 이름으로 다시 만드는 것)
a = FourCal(4, 0)
a.div()
>>> ZeroDivisionError 오류 # 4를 0으로 나누려고 하기 때문에 오류 발생

class SafeFourCal(FourCal):
    def div(self):
        if self.second == 0:
            return 0 # div 메서드에서 0으로 나누면 0 반환
        else:
            return self.first / self.second
            
a = SafeFourCal(4, 0)
a.div()
>>> 0

 

클래스 변수

# 클래스 변수
class Family:
    lastname = "김"

print(Family.lastname)
>>> 김

a = Family()
b = Family()
print(a.lastname)
>>> 김
print(b.lastname)
>>> 김

Family.lastname = "박"
print(a.lastname)
>>> 박
print(b.lastname)
>>> 박
# 클래스 변수는 클래스로 만든 모든 객체에 공유됨

 

+ Recent posts