클래스
프로그래밍 측면에서 어떠한 객체의 변수, 메서드의 집합으로 정의됨
현실세계에서는 동일한 속성과 행위를 수행하는 객체의 집합으로 정의
ex) 학생을 객체라고 생각하면 아래와 같은 변수와 메서드를 가지는 클래스로 정의될 수 있음
| 학생 |
|---|
| 학번 |
| 이름 |
| 성별 |
| 전공 |
| 수강과목 |
| 함수 : 수강하다() |
학생은 학번, 이름, 성별, 전공 등을 가지므로 모두 같은 객체임
무조건 클래스를 사용할 필요는 없지만 *클래스를 적재적소에 사용하면 프로그래밍 과정이 편리해질 수 있음*
# 계산기에 3 -> + -> 4 -> 7 -> + -> 3 -> 10
# in in in out in in out
# in은 입력, out은 출력
result = 0
def add(num):
global result
result += num
return result
print(add(3))
print(add(4))

결괏값을 유지하기위해 global을 이용해 전역변수로 사용했음
만약 계산기 2대가 필요한 경우에는 result1, result2로 나누어서 계산할 수 있음
# 계산기가 2대가 필요한경우
result1 = 0
result2 = 0
def add1(num):
global result1
result1 += num
return result1
def add2(num):
global result2
result2 += num
return result2
print(add1(3))
print(add1(4))
print(add2(3))
print(add2(7))

계산기를 2대 사용하는 경우 똑같은 일을 수행하는 함수 add1, add2와 각 결과 값을 저장하는 변수 result1, rusult2가
계산기를 점점 더 많이 사용할경우 코드의 길이와 번거로움이 많아짐 -> 클래스로 해결
# 클래스를 사용한경우
class calculation:
def __init__(self):
self.result = 0
def add(self, num):
self.result += num
return self.result
cal1 = calculation()
cal2 = calculation()
print(cal1.add(3))
print(cal1.add(4))
print(cal2.add(3))
print(cal2.add(7))

claculation 클래스로 생성한 객체 cal1, cal2가 각각의 역할을 수행함
결과값이 다른 계산기의 결과 값과 독립적으로 유지됨
클래스를 사용하면 계산기 대수가 늘어나더라고 객체를 생성만 하면 되므로 함수를 사용하는 경우와 달리 매우 간단해짐

클래스는 과자틀 객체는 과자에 비유할 수 있음
클래스(class)란 똑같은 무엇인가를 계속해서 만들어 낼 수 있는 설계 도면
객체(object)란 클래스로 만든 피조물
클래스로 만든 객체는 객체마다 고유한 성격을 가짐 -> 동일한 클래스로 만든 객체들은 서로 전형 영향을 주지 않음
# 클래스 가장 간단한 예
class cookie:
pass
a = cookie()
b = cookie()
### 사칙연산 클래스 Example
class Fourcal:
def setdate(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 = Fourcal()
a.setdate(4, 2)
print(a.add())
print(a.sub())
print(a.mul())
print(a.div())

생성자란 객체가 생성될때 자동으로 호출되는 메서드를 의미
파이썬에서는 __init__을 사용하면 메서드가 생성됨
# 생성자가 없는 경우
# 위에 fourCal 코드를 사용
class Fourcal:
def setdate(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 = Fourcal()
print(a.add())

FourCal 클래스의 인스턴스a 에 setdata 메서드를 수행하지 않고 add메서드를 수행하면 위와같은 오류가 발생
setdata 메서드를 수행해야 a의 객체변수 first와 second가 생성되기 때문에 발생하는 오류
# 생성자를 사용하는 경우 Example
class Fourcal:
def __init__(self,first, second):
self.first = first
self.second = second
def setdate(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 = Fourcal() # 매배견수를 제대로 전달해주지않아 오류발생
a = Fourcal(4,2)
print(a.add())

__init__을 통해 생성자를 명시해주었음
위 코드를 실행한 경우 위와 같은 오류가 발생하는데 매개변수 first와 second에 해당하는 갑이 전달되지 않아서 발생하는 오류임

a = Fourcal(4,2)를 사용하면 오류가 발생하지않고 위처럼 6이 출력됨
생성자에 매개변수를 제대로 전달해주었기 때문에 오류가 발생하지 않음
a 생성부의 주석처리를 바꿔가면서 코드를 실행해보면 오류가 뜨고 안뜨고를 확인해볼 수 있음
어떤 클래스를 만들 때 다른 클래스의 기능을 물려받는 것
클래스를 상속받기 위해서는 class 클래스명(상속받을 클래스명) : 의 형식으로 사용할 수 있음
# MoreFourCal Example
class Fourcal:
def __init__(self,first, second):
self.first = first
self.second = second
def setdate(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 MoreFourcal(Fourcal):
def pow(self):
result = self.first ** self.second
return result
a = MoreFourcal(4,2)
print(a.add())
print(a.sub())
print(a.mul())
print(a.div())
print(a.pow())

부모 클래스의 기능을 상속받은 자식 클래스가 부모 클래스의 함수와 똑같은 이름을 다시 작성하는 것을 메서드 오버라이딩이라고 함
메서드 오버라이딩 후 메서드를 자식 객체에서 그 메서드를 호출하면 자식 클래스에서 정의된 메서드가 호출됨
# FourCal 클래스는 위 코드의 FourCal 클래스를 사용
a = FourCal(4,0)
print(a.div)

# 메서드 오버라이딩 Example
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())

오류가 발생하지 않도록 0으로 나우면 0을 반환하도록 메서드 오버라이딩한 코드
오류가 발생하지 않고 0을 반환하는것을 확인할 수 있음
객체 변수는 다른 객체의 영향을 받지 않고 독립적으로 그값을 유지함
클래스 변수는 모든 객체가 공유하는 변수를 의미
class Family:
lastname = "kim"
print(Family.lastname)
a = Family()
b = Family()
print(a.lastname)
print(b.lastname)

클래스 변수는 위처럼 클래스 선언된 변수에 값을 할당하면됨
클래스 변수는 위와같이 클래스 이름.클래스 변수 형식으로 사용할 수 있음
위 예제에서 모든 객체가 같은 값을 공유하는 것을 확인할 수 있음 -> 같은 값, 같은 주소를 가짐
일반적으론 클래스 변수보다 객체변수가 사용하는 비율이 높음
모듈
모듈이란 함수나 변수 또는 클래스를 모아놓은 파일
다른 파이썬 프로그램에서 불러와 사용할 수 있게끔 만든 파이썬 파일
# 모듈 만들기 Example
def add(a,b):
return a + b
def sub(a,b):
retrun a - b
모듈을 불러와 사용하는 방법
방금 만듬 모듈 파일 mod1.py를 불러와 사용하는 방법
import 모듈명을 사용해서 모듈을 사용할 수 있음
import mod1
print(mod1.add(3, 4))
print(mod1.sub(4, 2))

from 모듈명 import 함수명 형식으로 특정함수만 임포트 할 수 있음
동일한 디렉토리에 있어야 모듈을 import할 수 잇음
print(add(3, 4))

# mod1.py
def add(a, b):
return a + b
def sub(a, b):
return a - b
print(add(1, 4))
print(sub(4, 2))

import mod1

다른 파일에서 mod1을 임포트하면 위와 같이 5 2가 출력된다.
import mod1을 수행하는 순간 mod1.py가 실행이되어 5 2 결괏값이 출력됨
이러한 문제를 방지하려면 mod1.py를 아래와 같이 수정해야됨
# mod1.py
def add(a, b):
return a + b
def sub(a, b):
return a - b
if __name__ == "__main__":
print(add(1, 4))
print(sub(4, 2))
위와 같이 if __name__ == "__main__":문을 추가하면 다른 파일에서 mod1을 임포트해도 출력문이 실행되지 않음
mod1.py를 직접실행하면 if __name__ == "__main__":이 참이되어 출력문이 수행됨
mod1.py를 임포트하면 if __name__ == "__main__":이 거짓이 되어 출력문이 수행이 안됨
PI = 3.141592
class Math:
def solv(self, r):
return PI * (r ** 2)
def add(a, b):
return a + b
import mod2
print(mod2.PI)
a = mod2.Math()
print(a.solv(2))
print(mod2.add(mod2.PI, 4))
