학습내용
#1 : 클래스와 객체란 무엇인가? #2 : 클래스로 기능 만들기 #3 : 생성자(Constructor) #4 : 클래스의 상속(inheritance) |
#1 : 클래스와 객체란 무엇인가?
클래스(class)란 똑같은 무엇인가를 계속해서 만들어 낼 수 있는 설계 도면(틀)이다. 객체(object)란 클래스에 의해 만들어진 결과물이다. 클래스로 만든 객체는 객체마다 고유한 성격을 가지며, 동일한 클래스로 만든 객체들은 서로 전혀 영향을 주지 않는다. 객체는 클래스로 만들며 1개의 클래스는 무수히 많은 객체를 만들어 낼 수 있다.
int #정수 클래스
list #리스트 클래스
a = [1] #a는 리스트 객체, 클래스 리스트로부터 인스턴스화된 객체는 a
b = [2] #b는 리스트 객체, 클래스 리스트로부터 인스턴스화된 객체는 b
1) 클래스 구상 : 아래와 같이 동작하는 Cal 클래스 만들기.
a = Cal() # a 객체 생성
a.setdata(3,6) # a에 값 지정
print(a.add()) # add 수행 시 덧셈 결과 반환
print(a.mul()) # mul 수행 시 곱셈 결과 반환
print(a.sub()) # sub 수행 시 뺄셈 결과 반환
print(a.div()) # div 수행 시 나눗셈 결과 반환
2) 클래스 구조 만들기
- Cal 클래스 생성, a 객체 생성 후 a 객체의 타입 파악.
- pass는 아무것도 수행하지 않는 문법으로 임시로 코드를 작성할 때 주로 사용.
#Cal 클래스 생성
class Cal:
pass
# a 객체 생성 후 a 객체의 타입 파악
a = Cal()
type(a)
#__main__.Cal
3) 객체에 숫자 지정할 수 있게 만들기
#사칙연산에 쓰일 값 객체에 지정하기
class Cal:
def setdata(self,first,second):
self.first = first
self.second = second
#setdata 메소드의 매개변수
a = Cal()
a.setdata(3,6)
- 사칙연산에 쓰일 값 객체에 지정하기, setdata 메소드의 매개변수 값 입력.
- def setdata(self,first,second): self는 setdata로 호출한 객체를 self로 넘겨주는 것.
- self.first는 자기 자신의 first, self.second는 자기 자신의 second.
- 객체에서는 함수를 호출할 때 가장 앞에 self를 넣어주어야 한다.
- 클래스 안에 구현된 함수는 메서드(method)라고 부른다.
- 객체를 통해 클래스의 메서드를 호출하려면 도트(.)연산자를 사용해야 한다.
- a.setdata(3,6) 과 def setdata(self,first,second)
4) 메서드의 또 다른 호출 방법과 setdata 메서드의 수행문
#1
a = Cal()
Cal.setdata(a,3,6)
#2
a = Cal()
a.setdata(3,6)
#메서드 수행문
a = Cal()
a.setdata(3,6)
print(a.first) #3
print(a.second) #6
- 클래스를 통해 메서드를 호출할 수 있다.
- 클래스 이름.메서드 형태로 호출할 때는 객체 a를 첫 번째 매개변수 self에 꼭 전달해야한다.
- 객체.메서드 형태로 호출할 때는 self를 반드시 생략해서 호출해야한다.
5) a, b 객체 만들기
class Cal:
def setdata(self,first,second):
self.first = first
self.second = second
a = Cal()
b = Cal()
a.setdata(3,6)
b.setdata(4,9)
print(id(a.first))
print(id(b.first))
#94721947114048
#94721947114080
- a 객체의 first 주고 값과 b 객체의 first 주소 값이 서로 다르므로 각각 다른 곳에 값이 저장된다.
- 객체변수는 그 객체의 고유 값을 저장할 수 있는 공간이다. 즉, 다른 객체들의 영향을 받지 않고 독립적으로 그 값을 유지한다.
#2 : 클래스로 기능 만들기
1) 더하기 기능 만들기
class Cal:
def setdata(self,first,second):
self.first = first
self.second = second
def add(self):
result = self.first + self.second
return result
a = Cal()
a.setdata(3,6)
print(a.add())
#9
- setdata로 값을 세팅해주고 add로 더하기를 수행할 수 있도록 한다.
- a.setdata(3,6)으로 first에 3, second에 6을 넣고 add를 통해 3+6=9를 구한다.
- class로 두 함수를 묶어주었기에 add에서 setdata의 first, second 값을 사용할 수 있다.
2) 빼기, 곱하기, 나누기 기능 만들기
class Cal:
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 = Cal()
a.setdata(10,5)
print(a.add(), a.sub(), a.mul(), a.div())
#15 5 50 2.0
#객체 a
print("add:%d, sub:%d, mul:%d, div:%d" %(a.add(), a.sub(), a.mul(), a.div()))
#add:15, sub:5, mul:50, div:2
- 더하기와 구조는 똑같고 연산자만 바뀌었다.
#3 : 생성자(Constructor)
객체에 초기값을 설정해야 할 필요가 있을 때 setdata와 같은 메서드를 호출하여 초기값을 설정하기보다 생성자를 구현하는 것이 안전하다. 생성자(constructor)란 객체가 생성될 때 자동으로 호출되는 메서드를 의미하며, 쉽게 말해서 클래스를 인스턴스화 시킬 때 무조건 한 번 수행하는 함수를 생성자라 한다.
파이썬 메서드 이름으로 __init__를 사용하면 이 메서드는 생성자가 된다. __init__메서드는 setdata 메서드와 이름만 다르고 모두 동일하다. 단 메서드 이름이 __init__이므로 생성자로 인식되어 객체가 생성되는 시점에 자동으로 호출된다.
def _init_(self,first,second):
self.first = first
self.scond = second
class Cal:
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 = Cal(10,5)
b = Cal(100,50)
#객체 a
print("add:%d, sub:%d, mul:%d, div:%d" %(a.add(), a.sub(), a.mul(), a.div()))
#객체 b
print("add:%d, sub:%d, mul:%d, div:%d" %(b.add(), b.sub(), b.mul(), b.div()))
# add:15, sub:5, mul:50, div:2
# add:150, sub:50, mul:5000, div:2
- 따로 함수를 호출하지 않아도 parameter(매개변수)가 __init__을 통해 만들어 진다.
#4 : 클래스의 상속(inheritance)
상속(inheritance)이란 '물려받다'라는 뜻이다. 파이썬에서 어떤 클래스를 만들 때 다른 클래스의 기능을 물려받을 수 있다. 보통 상속은 기존 클래스를 변경하지 않고 기능을 추가하거나 기존 기능을 변경하고자 할 때 사용한다. 기존 클래스가 라이브러리 형태로 제공되거나 수정이 허용되지 않는 상황이라면 상속을 사용해야 한다.
class mod_cal(cal):
pass
- 클래스를 상속하려면 class 클래스 이름(상속할 클래스 이름) 형태로 만들어준다.
- 위에서 mod_Cal 클래스는 Cal 클래스를 상속했으므로 mod_Cal 클래스의 모든 기능을 사용할 수 있다.
- 상속은 빠진 기능을 추가하기 위해서 사용하는 경우가 많다.
1) 상속을 하는 이유(보편적으로 기능을 추가하기 위해)
상속 개념을 사용하여 Cal 클래스에 ab(a의 b제곱)을 구하는 기능을 구현. 사칙연산에 지수연산 기능을 추가.
class Cal:
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
#------------------------------------------------
class mod_Cal(Cal):
def pow(self):
result = self.first ** self.second
return result
a = mod_Cal(2,4)
a.pow()
#16
2) 메소드 오버라이딩(Method Overriding)
오버라이딩은 '재정의'라는 뜻으로 기존의 부모 클래스 함수를 고치고 싶을 때 사용.
a = Cal(10,0)
a.div()
#ZeroDivisionError: division by zero
class div_0(Cal):
def div(self):
if self.second == 0:
return 0
else:
return self.first / self.second
a = div_0(10,0)
a.div()
#0
- div_0 클래스는 Cal 클래스에 있는 div 메소드를 동일한 이름으로 다시 작성했다.
- 부모 클래스에 있는 메소드를 동일한 이름으로 다시 만드는 것을 메소드 오버라이딩이라고 한다.
- 메소드 오버라이딩하면 부모클래스의 메소드 대신 오버라이딩한 메소드가 호출된다.
3) 클래스 변수
클래스 변수는 클래스 안에 함수를 선언하는 것과 마찬가지로 클래스 안에 변수를 선언하여 생성.
class Univ:
name = "Seoul"
print(Univ.name)
#Seoul
a = Univ()
print(a.name)
#Seoul
Univ.name = "SIA"
print(a.name)
#SIA
print(id(Univ.name))
print(id(a.name))
# 139807431017200
# 139807431017200
- Univ 클래스에 선언한 name이 클래스 변수이다.
- 클래스 변수는 클래스이름.클래스 변수 혹은 클래스로 만든 객체를 통해서도 클래스 변수를 사용할 수 있다.
- 클래스 변수 값을 변경하면 클래스로 만든 객체의 값도 모두 변경된다.
- 클래스 변수는 클래스로 만든 모든 객체에 공유된다는 특징을 가지며 저장되는 주소 역시 동일하다.
'파이썬 > Basics(기초)' 카테고리의 다른 글
[Python] 16. 에러와 예외처리(Exception handling) (0) | 2021.10.12 |
---|---|
[Python] 15. 내장함수(built-in function) 21종 (0) | 2021.10.11 |
[Python] 13. 함수(function), 매개변수, 키워드 파라미터 (0) | 2021.10.09 |
[Python] 12. 반복문(while, for), 이중 for문, 리스트 내포 (0) | 2021.10.07 |
[Python] 11. 변수(variable)의 복사와 참조 (0) | 2021.10.06 |
댓글