[Do it! 점프 투 파이썬-스터디 노트] 05장 파이썬 날개 달기(05-1 클래스)

2021. 4. 17. 20:39PYTHON/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 클래스로 만든 객체를 통해서도 클래스 변수를 사용할 수 있다.

 

 

클래스 변수는 클래스로 만든 모든 객체에 공유된다.