2021. 4. 17. 20:39ㆍPYTHON/Do it! 점프 투 파이썬
05장 파이썬 날개 달기
05-1 클래스
클래스와 객체
동일한 클래스로 만든 객체들은 서로 전혀 영향을 주지 않는다.
객체는 클래스로 만들며 1개의 클래스는 무수히 많은 객체를 만들어 낼 수 있다.
◈ 객체와 인스턴스의 차이
클래스로 만든 객체를 인스턴스라고도 한다. 그렇다면 객체와 인스턴스의 차이는 무엇일까? a=Cookie() 이렇게 만든 a는 객체이다. 그리고 a객체는 Cookie의 인스턴스이다. 즉 인스턴스라는 말은 특정 객체(a)가 어떤 클래스(Cookie)의 객체인지를 관계 위주로 설명할 때 사용한다. 'a는 인스턴스'보다는 'a는 객체'라는 표현이 어울리며 'a는 Cookie의 객체'보다는 'a는 Cookie의 인스턴스'라는 표현이 훨씬 잘 어울린다.
사칙연산 클래스 만들기
클래스를 어떻게 만들지 먼저 구상하기
클래스 구조 만들기
class FourCal()
pass
객체에 숫자 지정할 수 있게 만들기
연산을 수행할 대상을 객체에 지정할 수 있게 만든다
a.setdata(4, 2)
위 문장을 수행하려면 다음과 같이 소스 코드를 작성해야 한다
class FourCal:
def setdata(self, first, second):
self.first=first
self.second=second
앞에서 만든 FourCal 클래스에서 pass 문장을 삭제하고 대신 setdata 함수를 만들었다. 클래스 안에 구현된 함수는 다른 말로 메서드(Method)라고 부른다.
① setdata 메서드의 매개변수
setdata메서드는 매개변수로 self, first, second 3개의 입력값을 받는다. 일반 함수와는 달리 메서드의 첫 번째 매개변수 self는 특별한 의미를 가진다. (파이썬 메서드의 첫 번째 매개변수 이름은 관례적으로 self를 사용한다. 객체를 호출할 때 호출한 객체 자신이 전달되기 때문이다.)
a=FourCal()
a.setdata(4, 2)
a.setdata(4, 2)처럼 호출하면 setdata 메서드의 첫 번째 매개변수 self에는 setdata 메서드를 호출한 객체 a가 자동으로 전달된다.
*메서드의 또 다른 호출 방법
a=FourCal()
FourCal.setdata(a, 4, 2)
위와 같이 '클래스이름.메서드' 형태로 호출할때는 객체 a를 첫 번째 매개변수 self에 꼭 전달해주어야 한다. 반면에 아래처럼 '객체.메서드' 형태로 호출할 때는 self를 반드시 생략하고 호출해야한다.
a=FourCal()
a.setdata(4, 2)
② setdata 메서드의 수행문
def setdata(self, first, second):
self.first=first
self.second=second
a.setdata(4,2)처럼 호출하면 setdata 메서드의 매개변수 first, second에는 각각 값 4와 2가 전달되어 setdata 메서드의 수행문은 다음과 같이 해석된다.
self.first=4
self.second=2
self는 전달된 객체 a이므로 다시 다음과 같이 해석된다.
a.first=4
a.second=2
a.first=4 문장이 수행되면 a객체에 객체변수 first가 생성되고 값 4가 저장된다. 마찬가지로 a.second=2문장이 수행되면 a객체에 객체변수 second가 생성되고 값 2가 저장된다.
객체에 생성되는 객체만의 변수를 객체변수라고 부른다.
클래스로 만든 객체의 객체변수는 다른 객체의 객체변수에 상관없이 독립적인 값을 유지한다.
객체변수는 그 객체의 고유 값을 저장할 수 있는 공간이므로 다른 객체들의 영향을 받지 않고 독립적으로 그 값을 유지한다.
class FourCal:
def setdata(self, first, second):
self.first=first
self.second=second
③ 더하기 기능 만들기
class FourCal:
def setdata(self, first, second):
self.first=first
self.second=second
def add(self):
result=self.first+self.second
return result
a=FourCal()
a.setdata(4,2)
print(a.add())
6
④ 곱하기, 빼기, 나누기 기능 만들기
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
생성자(Constructor)
FourCal 클래스의 인스턴스 a에 setdata 메서드를 수행하지 않고 add 메서드를 수행하면 'AttributeError: 'FourCal' object has no attribute 'first'' 오류가 발생한다. setdata 메서드를 수행해야 객체 a의 객체변수 first와 second가 생성되기 때문이다.
객체에 초기값을 설정해야 할 필요가 있을 때는 setdata와 같은 메서드를 호출하여 초기값을 설정하기보다는 생성자를 구현하는 것이 안전한 방법이다. 생성자란 객체가 생성될 때 자동으로 호출하는 메서드를 의미하다. 파이썬 메서드 이름으로 __init__를 사용하면 이 메서드는 생성자가 된다.
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
__init__ 메서드는 setdata 메서드와 이름만 다르고 모든 게 동일하다. 단 메서드 이름을 __init__으로 했기 때문에 생성자로 인식되어 객체가 생성되는 시점에 자동으로 호출되는 차이가 있다.
클래스의 상속(Inheritance)
class 클래스 이름(상속할 클래스 이름)
class MoreFourCal(FourCal):
pass
MoreFourCal 클래스는 FourCal 클래스를 상속했으므로 FourCal 클래스의 모든 기능을 사용할 수 있다.
상속은 기존 클래스는 그대로 놔둔 채 클래스의 기능을 확장시킬 때 주로 사용한다.
class MoreFourCal(FourCal):
def pow(self):
result=self.first**self.second
return result
a=MoreFourCal(4, 2)
a.pow()
16
메서드 오버라이딩(Overriding)
class SafeFourCal(FourCal):
def div(self):
if self.second==0:
return 0
else:
return self.first/self.second
부모 클래스(상속한 클래스)에 있는 메서드를 동일한 이름으로 다시 만드는 것을 메서드 오버라이딩(덮어쓰기)이라고 한다. 메서드를 오버라이딩하면 부모클래스의 메서드 대신 오버라이딩한 메서드가 호출된다.
클래스 변수
class Family:
lastname="김"
Family 클래스에 선언한 lastname이 바로 클래스 변수이다. 클래스 변수는 클래스 안에 함수를 선언하는 것과 마찬가지로 클래스 안에 변수를 선언하여 생성한다.
print(Family.lastname)
김
클래스 변수는 위와 같이 클래스 이름.클래스 변수로 사용할 수 있다.
a=Family()
b=Family()
print(a.lastname)
김
print(b.lastname)
김
Family 클래스로 만든 객체를 통해서도 클래스 변수를 사용할 수 있다.
클래스 변수는 클래스로 만든 모든 객체에 공유된다.
'PYTHON > Do it! 점프 투 파이썬' 카테고리의 다른 글
[Do it! 점프 투 파이썬-스터디 노트] 05장 파이썬 날개 달기(05-3 패키지) (0) | 2021.04.18 |
---|---|
[Do it! 점프 투 파이썬-스터디 노트] 05장 파이썬 날개 달기(05-2 모듈) (0) | 2021.04.17 |
[Do it! 점프 투 파이썬-스터디 노트] 04장 프로그램의 입력과 출력은 어떻게 해야할까? 연습문제 (0) | 2021.04.16 |
[Do it! 점프 투 파이썬-스터디 노트] 04장 프로그램의 입력과 출력은 어떻게 해야할까?(04-2 사용자 입력과 출력, 04-3 파일 읽고 (0) | 2021.04.16 |
[Do it! 점프 투 파이썬-스터디 노트] 04장 프로그램의 입력과 출력은 어떻게 해야할까?(04-1 함수) (0) | 2021.04.16 |