본문 바로가기

Programming/Python

Do it! 공부단 5일차 | ch05 파이썬 날개달기_클래스

ch05 파이썬 날개달기

01 클래스

클래스를 사용하면 독립적인 결괏값을 유지하면서도 같은 기능을 가진 객체들을 생성할 수 있다.

 

01-1 클래스와 객체

  • 클래스란 똑같은 무엇인가를 계속 만들어낼 수 있는 설계도면이다.
  • 객체란 클래스로 만든 피조물이다.
  • 동일한 클래스로 만든 객체라도 각자 고유한 성격을 가지며 서로 영향을 주지 않는다.

 

*객체와 인스턴스

인스턴스는 객체와 클래스의 관계를 설명할 때 사용한다. 예시를 보자.

a = Cookie()에서 a는 객체이다.

a는 Coocie의 인스턴스이다.

 

01-2 사칙연산 클래스 만들기

클래스를 만들기 전에는 어떤 동작을 할 것인지 미리 구상하는 것이 좋다.

 

사칙연산에 필요한 숫자 두 개 입력받기: setdata 메서드

사칙연산 기능 구현하기: add, sub, mul, div 메서드

 

클래스 구조 만들기

하나하나씩 구현해보자. 실습은 파이썬 대화형 인터프리터에서 진행했다.

 

우선 pass를 사용해 FourCal 클래스를 만들었다. 그리고 객체 a를 만들어 타입을 알아보았다.

*pass문법은 아무것도 수행하지 않는 문법으로 임시 코드에 주로 사용한다.

 

 

객체에 숫자 지정하기

객체에 연산을 수행할 대상(숫자)을 알려주자.

 

  • FourCal 클래스에서 pass문장을 삭제하고 setdata 함수를 만들었다.
  • 클래스 안에 구현된 함수는 메서드(method)라고 한다. 
  • setdata 메서드의 첫 번째 매개변수 self에는 호출한 객체(a)가 전달된다.

위 코드처럼 a.setdata(4, 2)를 호출하면 a객체에 객체 변수 first와 second가 생성되고 값이 저장된다.

 

 

이번에는 b객체를 만들었다. 그 후 b와 a의 객체를 출력하고 id함수로 주소 값을 확인했다. 객체 변수는 다른 객체들의 영향을 받지 않고 독립적으로 값을 유지한다는 개념을 확인할 수 있었다. 

 

 

더하기 기능 만들기

사칙연산의 기능을 구현해보자. 

 

add 매서드를 추가한 후 객체 a를 만들었다. a.add()를 출력하니 더하기 결괏값이 나왔다. 코드를 살펴보자.

 

  • add 매서드의 매개변수는 self이고 반환 값은 result이다.
  • result 계산 부분의 self.first는 a.first(=4)로 해석된다.

 

곱하기·빼기·나누기 기능 만들기

*코드가 길어져 에디터를 사용했다.

#class: FourCal

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())
print(a.mul())
print(a.sub())
print(a.div())

결괏값

add 매서드와 마찬가지로 sub, mul, div 메서드를 만들고 실행시켰다.

 

01-3 생성자

  • 객체에 초깃값을 설정해야 할 때는 setdata 매서드를 호출하는 것보다 생성자를 구현하는 것이 안전하다.
  • 생성자(Constructor)란 객체가 생성될 때 자동으로 호출되는 메서드이다.
  • 생성자는 파이썬 메서드 이름으로 __init__를 사용한다(언더스코어(_) 두 개).

 

FourCal 클래스에 생성자를 추가해보자.

#class: FourCal
#constructor

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() #오류발생
a.setdata(4, 2)
print(a.add())
print(a.mul())
print(a.sub())
print(a.div())
        

  • 같은 코드에 생성자 __init__메서드만 추가해서 실행시키니 에러가 발생했다. 
  • a = FourCal()을 수행할 때 생성자가 자동으로 호출되었기 때문이다.
  • 위 오류를 해결하려면 객체변수에 해당하는 값을 전달하도록 코드를 수정하면 된다.

 

#class: 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)
print(a.add())
print(a.mul())
print(a.sub())
print(a.div())

코드를 수정하니 프로그램이 잘 실행되었다.

 

01-4 클래스와 상속

상속(Inheritance)란 '물려받다'는 뜻으로 클래스에도 이 개념을 적용할 수 있다.

클래스에서 상속을 사용하면 기능을 물려받을 수 있다.

 

앞서 만든 FourCal 클래스에 제곱(a^b)을 구할 수 있는 기능을 추가해보자.

 

#class: FourCal
#inheritance

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):
    pass

a = MoreFourCal(4, 2)
print(a.add())
print(a.mul())
print(a.sub())
print(a.div())

우선 상속 기능을 확인하기 위해 pass 명령어를 사용해서 MoreFourCal 클래스를 만들었다. 클래스를 상속할 때에는 괄호 안에 상속할 클래스 이름을 넣어주면 된다.

 

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

 

a 객체를 만들어 사칙연산을 실행하니 결괏값이 정상적으로 나왔다. 정상적으로 기능이 상속된 것을 확인했다.

 

#class: FourCal
#inheritance

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.pow())

pass 명령어를 지운 후 제곱 연산을 하는 pow 메서드를 만들어 프로그램을 실행시켰다. 이처럼 상속은 기존 클래스는 그대로 놔둔 채 클래스의 기능을 확장시킬 때 사용한다.

 

*기존 클래스가 라이브러리 형태로 제공되거나 수정이 허용되지 않는 상황에서도 상속이 유용하게 쓰인다.

 

01-5 메서드 오버라이딩

#class: 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, 0)
print(a.div())

다시 FourCal 클래스로 돌아가 프로그램을 실행시켜보자. 이번에는 객체 a에 객체 변수로 4와 0을 주고 나눗셈 값을 출력하고자 했다.

 

 

하지만 프로그램을 실행시켜보니 'ZeroDivisionError: division by zero'에러가 발생했다. 4를 0으로 나누려고 했기 때문이다. 

 

 

오류가 아닌 0을 출력하는 프로그램을 만들어보자.

#class: 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

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())

코드를 살펴보자

 

  • FourCal 클래스를 상속한 SafeFourCal 클래스를 만들었다.
  • FourCal 클래스에 있는 div 메서드를 동일한 이름으로 다시 작성했다.
  • 이렇게 부모 클래스에 있는 메서드를 동일한 이름으로 다시 만드는 것을 매서드 오버 라이딩이라고 한다.
  • 오버 라이딩(Overriding)은 '덮어쓰기'라는 의미이다.

 

프로그램을 실행시켜보니 값이 정상적으로 나왔다.

 

01-6 클래스 변수

객체 변수는 다른 객체들에 영향을 받지 않고 독립적으로 값을 유지한다고 배웠다. 이번에는 클래스 변수를 알아보자.

 

Family 클래스에 선언한 lastname이 클래스 변수다. 클래스 변수는 클래스 이름. 클래스 변수로 사용할 수 있다.

 

 

또는 객체를 통해서도 사용이 가능하다.

 

 

클래스 변수의 특징을 보자.

 

클래스 변수의 값을 변하면 클래스 객체의 변수 값도 모두 변경된다. 즉 클래스 변수는 클래스로 만든 모든 객체에 공유된다는 특징이 있다.

 

 


 

이 글은 책 『Do it! 점프 투 파이썬』을 읽은 후 작성한 글입니다.

 

Do it! 점프 투 파이썬

코딩을 처음 배우는 중·고등학생과 나만의 경쟁력을 갖추고 싶은 문과생, 소프트웨어 시대에 대비하여 새로운 스펙을 준비하려는 직장인까지! 모두 ‘점프 투 파이썬’으로 프로그래밍을 시작

www.easyspub.co.kr