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