16. 객체지향과 클래스
2024. 9. 27. 16:40ㆍ파이썬(python)
1.객체지향 프로그래밍(Object-Oriented Programming, OOP)
- 객체지향 프로그래밍은 소프트웨어를 설계하고 구현하는 데 사용되는 중요한 프로그래밍 패러다임 중 하나입니다.
이 패러다임은 프로그램을 "객체"라고 불리는 독립적인 개체로 나누고, 이러한 객체들 간의 상호작용을 통해 프로그램을 구성하는 개발 방법론입니다.
1-1) 함수형 프로그래밍
- 함수형 프로그래밍은 함수(Function)를 가장 중요하게 생각하는 프로그램을 작성하는 패러다임입니다.
- 함수는 다른 함수에 전달되거나 반환될수 있으며, 함수들 간의 조합을 통해 복잡한 작업을 수행합니다.
- 상태를 변경하지 않고 데이터를 처리하고, 부작용(side effect)을 최소화하려는 노력이 있습니다.
- 함수형 언어로는 Haskell, Lisp, Clojure 등이 있으며, 몇몇 다른 언어들도 함수형 프로그래민을 지원합니다.
- 함수형 프로그래밍은 병렬처리와 상태 관리에 용이하며, 함수들을 조합하여 간결하고 안정적인 코드를 작성하는데 도움이 됩니다.
2. 클래스(Class)
- 클래스는 객체를 만들기 위한 템플릿 또는 설계도입니다.
- 클래스는 객체의 공통 속성과 동작을 정의하며, 객체를 생성하는데 사용됩니다.
- 예를 들어, "자동차" 클래스는 모든 자동차 객체가 가져야 하는 속성(색상, 속도)과 메서드(주행 멈춤)를 정의할 수 있습니다.
* 정의
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
*객체(Object):
- 객체는 현실 세계에서의 실제 개체나 추상적인 개념을 모델링한 것입니다.
- 예를 들어, 자동차, 사람, 은행 계좌 등이 객체가 될 수 있습니다.
- 객체는 데이터(속성, 상태)와 메서드(동작, 함수)로 구성됩니다.
* 클래스(Class):
- 클래스는 객체를 만들기 위한 템플릿 또는 설계도입니다.
- 클래스는 객체의 공통 속성과 동작을 정의하며, 객체를 생성하는데 사용됩니다.
- 예를 들어, "자동차" 클래스는 모든 자동차 객체가 가져야 하는 속성(색상, 속도)과 메서드(주행, 멈춤)를 정의할 수 있습니다.
* 인스턴스(Instance):
-클래스를 기반으로 실제로 생성된 객체를 인스턴스라고 합니다.
-클래스는 여러 인스턴스를 생성할 수 있으며, 각 인스턴스는 독립적인 데이터와 메서드를 가집니다.
*속성(Attributes) 또는 멤버 변수(Fields) :
-객체는 데이터를 저장하기 위한 속성을 가집니다.
이러한 속성은 객체의 상태나 특성을 나타내며 변수로 표현됩니다.
-예를 들어, 자동차 객체의 속성은 색상, 속도,모델 등이 될 수 있습니다.
*메서드(Methods) 또는 멤버 함수(Functions) :
- 객체는 데이터를 조작하거나 특정 작업을 수행하기 위한 메서드를 포함합니다.
이러한 메서드는 함수와 비슷하게 동작하지만, 객체의 상태에 접근하고 조작 할 수있습니다.
- 자동차 객체의 메서드로는 주행, 정지, 경적 올리기 등이 있을 수 있습니다.
3. 객체 생성
class Dog: # 빈 class가 생성된다
pass
1)
Dog()
print(Dog())
-->
<__main__.Dog object at 0x000002D4C9518CD0>
2)
class Dog:
pass
Rucy = Dog()
print(Rucy) #다른 주소
print(type(Dog))
-->
<__main__.Dog object at 0x0000020F154D8C90>
<class 'type'>
3)
class Dog:
pass
Rucy = Dog()
print(Rucy)
print(type(Rucy))
-->
<__main__.Dog object at 0x0000022E8CB08C90>
<class '__main__.Dog'>
4)
class Dog:
pass
PPomi = Dog() #동일한 클래스로 만들어진 객체
print(PPomi)
print(type(PPomi))
-->
<__main__.Dog object at 0x7b1eb1317550> <class '__main__.Dog'>
5)
class Dog():
#클래스 변수
name = '김사과'
age = 0
family = '0'
Rucy = Dog()
print(Rucy.name)
print(Rucy.age)
print(Rucy.family)
-->
김사과
0
0
4)
Rucy.name = '루시'
Rucy.age = 14
Rucy.family = '포메'
print(Rucy.name)
print(Rucy.age)
print(Rucy.family)
-->
루시
14
포메
5)
PPomi.name = '뽀미'
PPomi.age = 8
PPomi.family = '폼피츠'
print(PPomi.name)
print(PPomi.age)
print(PPomi.family)
-->
뽀미
7
폼피츠
6)
class Dog():
#클래스 변수
name = ' '
age = 0
family = ' '
def eat(self): ##파라미터를 self로
print('사료를 먹습니다.')
Rucy = Dog()
Rucy.eat()
#print(Rucy.eat)
-->
사료를 먹습니다.
4.생성자
-파이썬에서 생성자(Constructor)는 클래스의 인스턴스가 생성될때 자동으로 호출되는 특별한 메서드입니다. 생성자는 객체의 초기화를 담당하며, 객체가 생성될때 필요한 속성을 초기화하고 설정하는 역할을 합니다. 파이썬에서 생성자 메서드는 __init__라고 이름이 정해져 있습니다.
#CLASS
class 클래스이름:
def __init__(self, 매개변수1, 매개변수2):
self.속성1 = 매개변수1
self.속성2 = 매개변수2
1)
class Dog:
def __init__(self):
print(self, 'init호출')
Rucy = Dog()
-->
<__main__.Dog object at 0x79110c322ef0> init 호출
2)
class Dog:
def __init__(self, name, age, family='족보 없음'):
self.name = name
self.age = age
self.family = family
Rucy = Dog('루시', 14, '포메')
print(Rucy)
print(Rucy.name)
print(Rucy.age)
print(Rucy.family)
-->
<__main__.Dog object at 0x7e28fc688c70>
루시
14
포메
3)
class Dog:
def __init__(self, name, age, family='족보 없음'):
self.name = name
self.age = age
self.family = family
Rucy = Dog('루시', 14, '포메')
print(Rucy)
print(Rucy.name)
print(Rucy.age)
print(Rucy.family)
--->
<__main__.Dog object at 0x7910db32f370>
루시
14
포메
5. 메서드
-메서드(Method)는 객체지향 프로그래밍(OOP)에서 사용되는 함수와 비슷한 개념이지만, 클래스 내부에 정의되어 특정
객체에 연결된 함수입니다. 메서드는 해당 클래스의 모든 객체에서 공유되며, 객체의 동작을 정의하거나 특정 작업을 수행하는데 사용됩니다.
사용 예시)
class Counter:
def __init__(self):
self.num = 0
def increment(self):
self.num += 1
def current_value(self):
return self.num
def decrement(self):
self.num = 0
KBBank = Counter()
print(KBBank.num)
print(KBBank.current_value())
KBBank.increment()
KBBank.increment()
KBBank.increment()
print(KBBank.current_value())
------>
0
0
3
2
2
2)
HanaBank = Counter()
print(HanaBank.num)
print(HanaBank.current_value())
HanaBank.increment()
HanaBank.increment()
HanaBank.increment()
HanaBank.increment()
HanaBank.increment()
print(HanaBank.current_value())
print(KBBank.current_value())
---->
0
5
0
##문제
* Math 라는 클래스에 사칙연산을 할 수 있는 메서드를 만들고 이를 사용하는 예제 프로그램을 작성해보자.
* 단, 사칙연산 메서드는 각각 별도로 생성(예: add, sub, mul, div)
-->
class math:
pass
class math():
add = ''
sub = ''
mul = ''
div = ''
class Math:
def add(self, x, y):
return x + y
def sub(self, x, y):
return x - y
def mul(self, x, y):
return x * y
def div(self, x, y):
return x / y
math =Math()
result = math.add(10, 3)
print(result)
result = math.sub(10, 3)
print(result)
result = math.mul(10, 3)
print(result)
result = math.div(10, 3)
print(result)
-->
13
7
30
3.3333333333333335
6. 클래스 변수와 인스턴스 변수 ???검토
class Dog:
family = '포매' #클래스 변수
def __init__(self, name, age):
#인스턴스 변수
self.family = family
self.name = name
self.age = age
def print_info(self):
print(f'종 : {Dog.family}') #클래스 변수
print(f'이름 : {self.name}') #인스턴스 변수
print(f'나이 : {self.age}') #인스턴스 변수
Rucy = Dog('루시', 14)
PPomi = Dog('뽀미', 7)
Rucy.print_info()
-->
종: 포메
이름 : 루시
이름 : 14
종 : 포메
이름 : 뽀미
나이 : 7
7. 메서드 타입
* 인스턴스 메서드(Instance Method) : 객체의 상태를 조작하거나 객체에 특정 작업을 수행하는 메서드입니다. 대부분의 클래스 내의 메서드는 인스턴스 메서드입니다. __init__ 메서드는 인스턴스 메서드입니다.
* 클래스 메서드(Class Method) : 클래스 레벨에서 동작하며, 노든 인스턴스가 공유하는 메서드입니다. 클래스 메서드는 @classmethod 데코레이터를 사용하여 정의하며, 첫번째 매개변수로 cls를 사용합니다.
*정적 메서드(Static Method) : 특정 클래스나 인스턴스와 관련이 없는 메서드로, 클래스 내부에 정의되어 있지만 클래스나 인스턴스와 독립적으로 호출될 수 있습니다. 정적 메서드는 @staticmethod 데코레이터를 사용하여 정의합니다.
1)
#인스턴스 메서드 얘제
class Math:
def add(self, x, y):
return x + y
def sub(self, x, y):
return x - y
def mul(self, x, y):
return x * y
def div(self, x, y):
return x / y
math = Math()
result = math.add(10, 3)
print(result)
result = math.sub(10, 3)
print(result)
result = math.mul(10, 3)
print(result)
result = math.div(10, 3)
print(result)
-->
13
7
30
3.333333333333335
3)
# 정적 메서드 예제
class Math:
def __init__(self, x, y):
self.x = x
self.y = y
def add(self):
return self.x + self.y
@staticmethod
def div(x, y):
return x / y
math = Math(10, 3)
print(math.add())
print(math.div(10, 3)) # 사용하지 않음
8. random 모듈
import random
1)
import random
random.random() # 0 <= x < 1 실수
random.random() * 10
int(random.random() * 10)
random.random() * 45 # 0 ~ 44.99999
int((random.random()*45)+1)
-->
0.0340935
0.080488
7
43.09339
20
728x90
LIST
'파이썬(python)' 카테고리의 다른 글
18. 파이썬의 상속 (2) | 2024.09.30 |
---|---|
17. 클로저 (2) | 2024.09.30 |
15. 콜백 함수 & 람다 함수 (2) | 2024.09.27 |
14. 변수의 범위 (2) | 2024.09.27 |
13. 사용자 정의 함수 (2) | 2024.09.26 |