1. 객체지향 프로그래밍
객체지향 프로그래밍(Object-Oriented Programming, OOP)은 소프트웨어를 설계하고 구현하는 데 사용되는 중요한 프로그래밍 패러다임 중 하나입니다. 이 패러다임은 프로그램을 "객체"라고 불리는 독립적인 개체로 나누고, 이러한 객체들 간의 상호작용을 통해 프로그램을 구성하는 개발 방법론입니다.
절차지향 프로그래밍
- 절차지향프로그래밍은 프로그램을 작성할 때 일련의 절차 또는 단계에 따라 코드를 구성하는 방식입니다. 이러한 단계나 절차들은 주로 함수나 서브루틴으로 나누어져 있으며, 각각의 함수는 특정한 작업을 수행합니다. 주로 '입력 - 처리 - 출력'의 순차적인 절차를 따르며, 코드를 위에서부터 아래로 실행하면서 데이터를 처리하는 방식으로 동작합니다. C 언어와 같은 프로그래밍 언어는 주로 절차지향적인 스타일을 따릅니다.
함수형 프로그래밍
- 함수형프로그래밍은 함수(function)를 가장 중요하게 취급하여 프로그램을 작성하는 패러다임입니다. 함수는 다른 함수에 전달되거나 반환될 수 있으며, 함수들 간의 조합을 통해 복잡한 작업을 수행합니다. 상태를 변경하지 않고 데이터를 처리하고, 부작용(side effect)을 최소화하려는 노력이 있습니다. 함수형 언어로는 Haskell, Lisp, Clojure 등이 있으며, 몇몇 다른 언어들도 함수형 프로그래밍을 지원합니다. 함수형 프로그래밍은 병렬처리와 상태 관리에 용이하며, 함수들을 조합하여 간결하고 안정적인 코드를 작성하는데 도움이 됩니다.
2. 클래스 만들기
class 클래스이름:
# 클래스 속성(멤버 변수) 정의
속성1 = 초기값1
속성2 = 초기값2
# 생성자 메서드 (생략 가능)
def __init__(self, 매개변수1, 매개변수2, ...):
# 인스턴스 속성 초기화
self.속성1 = 매개변수1
self.속성2 = 매개변수2
# 메서드(멤버 함수) 정의
def 메서드1(self, 매개변수1, 매개변수2, ...):
# 메서드 동작 정의
pass
def 메서드2(self, 매개변수1, 매개변수2, ...):
# 메서드 동작 정의
pass
3. 객체(인스턴스) 생성
Rucy = Dog() # Rucy라는 강아지이름에 Dog()클래스 이름을 작성
print(Rucy)
print(type(Rucy))
PPomi = Dog()
print(PPomi)
print(type(PPomi))
4. 객체 속성 초기화
객체를 생성한 후에는 객체의 속성을 초기화할 수 있습니다. 이를 위해 . 연산자를 사용하여 객체의 속성에 접근하고 값을 할당합니다.
class Dog :
# 변수 초기화(기본값)
name = ''
age = 0
family = ''
#메소드
#self는 자기자신을 나타내는 객체
def eat(self) : # 첫 파라미터에는 self를 항상 넣어야함 // 파라미터가 없을때도 self를 넣어야함
print('사료를 먹습니다.')
Rucy = Dog()
Rucy.name = '루시'
Rucy.age = 14
Rucy.family = '포메'
PPomi = Dog()
PPomi.name = '뽀미'
PPomi.age = 7
PPomi.family = '폼피츠'
print(Rucy.name)
print(Rucy.age)
print(Rucy.family)
print(PPomi.name)
print(PPomi.age)
print(PPomi.family)
루시
14
포메
뽀미
7
폼피츠
5. 객체 메서드 호출
객체의 메서드를 호출하려면 객체와 메서드를 . 연산자를 사용하여 호출합니다.
Rucy.eat()
PPomi.eat()
사료를 먹습니다.
사료를 먹습니다.
6. 생성자
파이썬에서 생성자(Constructor)는 클래스의 인스턴스가 생성될 때 자동으로 호출되는 특별한 메서드입니다. 생성자는 객체의 초기화를 담당하며, 객체가 생성될 때 필요한 속성을 초기화하고 설정하는 역할을 합니다. 파이썬에서 생성자 메서드는 __init__라고 이름이 정해져 있습니다.
class 클래스이름:
def __init__(self, 매개변수1, 매개변수2):
self.속성1 = 매개변수1
self.속성2 = 매개변수2
class Dog :
# 생성자 (메소드)
def __init__(self): ## 첫 파라미터에는 self // self 자기자신
print(self, 'init 호출!')
Rucy = Dog()
<__main__.Dog object at 0x7b56e7e651e0> init 호출!
class Dog:
def __init__(self):
self.name = ''
self.age = 0
#a = 10 # 일반 변수를 만들면 다른 메소드에서 가져다 쓸 수없다
# => self를 이용해 어디 출신의 속성인지 알기위해 사용
Rucy = Dog()
print(Rucy)
print(Rucy.name)
print(Rucy.age)
<__main__.Dog object at 0x7b56e7e65150>
0
class Dog:
def __init__(self, name, age, family='족보 없음'): #생성자(self, 매개변수1, 매개변수2, ...)
self.name = name
self.age = age
self.family = family
Rucy = Dog('루시', 14, '포메')
print(Rucy.name)
print(Rucy.age)
print(Rucy.family)
PPomi = Dog('뽀미', 7)
print(PPomi.name)
print(PPomi.age)
print(PPomi.family)
루시
14
포메
뽀미
7
족보 없음
7. 메서드
메서드(Method)는 객체지향 프로그래밍(OOP)에서 사용되는 함수와 비슷한 개념이지만, 클래스 내부에 정의되어 특정 객체에 연결된 함수입니다. 메서드는 해당 클래스의 모든 객체에서 공유되며, 객체의 동작을 정의하거나 특정 작업을 수행하는 데 사용됩니다.
7-1. 메서드 정의
class Counter:
# 생성자
def __init__(self) :
self.num = 0
# 메서드
def increment(self):
self.num += 1
def decrement(self):
self.num -= 1
def current_value(self):
return self.num
def reset(self):
self.num = 0
# 현재 num의 값을 출력 (단 num 출력시 method로 출력)
# num의 값을 1증가
# num의 값을 1증가
# num의 값을 1증가
# num의 값을 1감소 #메소드 생성
# 현재 num의 값을 출력 #메소드 생성
KBbank = Counter() # 현재 값 = 0
KBbank.increment() # num 1증가
KBbank.increment()
KBbank.increment()
KBbank.decrement() # num 1감소
print(f'현재 대기인원 : {KBbank.current_value()}') # 출력
현재 대기인원 : 2
HanaBank = Counter() # 현재 값
print(f'현재 대기인원 : {HanaBank.current_value()}')
HanaBank.increment() # num +1 증가
HanaBank.increment() # num +1 증가
HanaBank.increment() # num +1 증가
HanaBank.increment() # num +1 증가
HanaBank.increment() # num +1 증가
HanaBank.increment() # num +1 증가
HanaBank.decrement() # num -1 감소
print(f'현재 대기인원 : {HanaBank.current_value()}') #카운터 값 출력
HanaBank.reset() # 카운터값 리셋
print(f'현재 대기인원 : {HanaBank.current_value()}') # 출력 : 0
현재 대기인원 : 0
현재 대기인원 : 5
현재 대기인원 : 0
7-2. 메서드 타입
- 인스턴스 메서드(Instance Method) : 객체의 상태를 조작하거나 객체에 특정 작업을 수행하는 메서드입니다. 대부분의 클래스 내부의 메서드는 인스턴스 메서드입니다. 위의 예제에서 보여진 _init_ 메서드도 인스턴스 메서드입니다.
- 클래스 메서드(Class Method) : 클래스 레벨에서 동작하며, 모든 인스턴스가 공유하는 메서드입니다. 클래스 메서드는 @classmethod 데코레이터를 사용하여 정의하며, 첫 번째 매개변수로 cls를 사용합니다.
- 정적 메서드(Static Method) : 특정 클래스나 인스턴스와 관련이 없는 메서드로, 클래스 내부에 정의되어 있지만 클래스나 인스턴스와 독립적으로 호출될 수 있습니다. 정적 메서드는 @staticmethod 데코레이터를 사용하여 정의합니다.
class Math:
def add(self, x, y):
return x + y
def multiply(self, x, y):
return x * y
math = Math()
result1 = math.add(10, 3)
print(result1)
result2 = math.multiply(10, 3)
print(result2)
13
30
class Calculater:
num = 1 # 클래스 변수 (클래스 내부에 들어있음) : 객체를 생성하지 않아도 메모리에 올라감
def add(self, x, y):
return x + y
@classmethod
def subtract(cls, x, y):
return x - y - cls.num # cls : 클래스 변수(num)을 가져다가 씀
@staticmethod #인스턴스 메소드 -> 객체생성 해야함
def multiply(x, y):
return x * y
# 인스턴스 메서드
# 인스턴스 메서드는 객체를 생성해야만 사용가능
calc = Calculater() #객체 생성
result1 = calc.add(5, 3)
print(result1)
# 클래스 메서드
# 객체를 생성할 필요가 없음
# 클래스명으로 호출
result2 = Calculater.subtract(10, 4) # 10 - 4 - cls.num(클래스변수)
print(result2)
# 정적 메서드
# 클래스 명으로 호출가능
# 클래스 명으로 불러올 수 있으나 주변속성을 갖다 쓸 수 없음(독립적임)
result3 = Calculater.multiply(5, 3)
print(result3)
8
5
15
8. ※ 클로저
클로저(Closure)는 프로그래밍 언어에서 중요한 개념 중 하나로, 함수와 그 함수가 참조하는 외부 변수(또는 자유 변수) 사이의 관계를 나타냅니다. 클로저는 함수의 내부에서 정의된 함수로, 내부 함수가 외부 함수의 변수에 접근할 수 있고, 외부 함수는 내부 함수를 반환할 수 있습니다. 이로 인해 함수와 그 함수가 참조하는 상태(변수)를 함께 저장하고 유지할 수 있습니다.
def mul2(n):
return n * 2
print(mul2(10))
print(mul2(5))
20
10
def mul5(n):
return n * 5
print(mul5(10))
print(mul5(5))
50
25
class Mul:
def __init__(self, m):
self.m = m
def mul(self, n):
return self.m * n
mul2 = Mul(2)
print(mul2.mul(10))
print(mul2.mul(5))
20
10
class Mul:
def __init__(self, m): # 객체를 생성할 때 자동으로 호출
print('생성자 호출')
self.m = m
def __call__(self, n): # 객체를 실행할 때 자동으로 호출
print('call 호출')
return self.m * n
mul2 = Mul(2)
mul2(10)
생성자 호출
call 호출
20
# 클로저 사용하기
#클로저 서용하기
def mul(m): #외부함수
def wrapper(n): #내부함수(클로저)
return m * n
return wrapper #함수안에 함수 바깥쪽 함수에 의해서 내부함수 리턴
mul2 = mul(2) # m = 2인 wrapper 함수가 mul2에 저장
print(mul2(10)) # m = 2, n = 10인 wrapper 함수가 실행
mul5= mul(5)
print(mul5(10))
20
50
9. ※ 데코레이터
데코레이터(Decorator)는 파이썬에서 함수나 메서드의 동작을 수정하거나 확장하기 위한 강력한 도구입니다. 데코레이터는 함수나 메서드를 래핑하거나 감싸서 추가 기능을 제공하며, 코드 재사용성과 가독성을 향상시킵니다. 데코레이터는 @ 기호를 사용하여 함수나 메서드 위에 적용됩니다.
# 데코레이터 만들기
def func1(a,b):
result = a + b
return result
def func2(a, b):
result = a * b
return result
def elapsed(func):
def wrapper(a, b):
start = time.time()
print('함수가 시작되었습니다.')
result = func(a, b) # elapsed(func)에 전달 받은 함수의 결과를 전달
end = time.time()
print(f'함수 수행시간{end - start}')
return result
return wrapper
deco1 = elapsed(func1)
result = deco1(10, 3)
print(result)
deco2 = elapsed(func2)
result = deco2(10, 3)
print(result)
함수가 시작되었습니다.
함수 수행시간8.082389831542969e-05
13
함수가 시작되었습니다.
함수 수행시간2.6702880859375e-05
30
@elapsed #클로저 이름
def func1(a,b):
result = a + b
return result
@elapsed
def func2(a, b):
result = a * b
return result
result = func1(10, 3)
print(result)
result = func2(10, 3)
print(result)
함수가 시작되었습니다.
함수 수행시간0.0002522468566894531
13
함수가 시작되었습니다.
함수 수행시간0.00047206878662109375
30
'컴퓨터 비전 > 파이썬 기초' 카테고리의 다른 글
17. 스페셜 메서드 (0) | 2023.12.12 |
---|---|
16. 파이썬 상속 (0) | 2023.12.12 |
14. 콜백함수와 람다함수 (1) | 2023.12.11 |
13. 변수의 범위 (1) | 2023.12.11 |
12. 사용자 정의 함수 (1) | 2023.12.10 |