[Python] 객체지향과 클래스

형이·2023년 11월 7일

Python

목록 보기
16/34
post-thumbnail

📝 객체지향과 클래스

🖥️ 1. 객체지향 프로그래밍

  • 문제를 여러 개의 객체 단위로 나눠 작업하는 방식
  • 클래스를 이용해 연관있는 처리 부분과 데이터 부분을 하나로 묶어 객체를 생성해 사용

1-1. 클래스와 객체

  • 객체는 클래스로 생성되어 구체화된 인스턴스
  • 실제로 클래스가 인스턴스화 되어 메모리에 상주하는 상태를 객체라고 부름
  • 건축 설계도가 클래스라면, 실제로 지어진 집은 객체로 비유
  • 파이썬의 모든 변수는 객체

1-2. 클래스 만들기

class 클래스명 :
  def __init__(self) :
    self.필드명1 = 값1
    self.필드명2 = 값2
    ...
    객체가 메모리에 로드될 때 가장 먼저 실행될 문장
    ...

  def 메소드명(변수1, 변수2, ...) :
    메소드가 호출되면 실행될 문장
    ...

# 기능이 없는 클래스
class Dog :
  pass    # 내용이 없는 블록을 만들 때 사용 (에러 방지)
  
def func1() :
  pass
  
# 클래스를 통해 객체를 생성
# 객체를 생성 -> 메모리에 올린다는 의미
Dog1 = Dog()
print(Dog1, type(Dog1))

Dog2 = Dog()
print(Dog2, type(Dog2))

[결과]
<__main__.Dog object at 0x7b44452f3760> <class '__main__.Dog'>
<__main__.Dog object at 0x7b44452f1bd0> <class '__main__.Dog'>
li1 = list([1, 2])
li2 = list([1, 2])

print(li1, type(li1))
print(li2, type(li2))

[결과]
[1, 2] <class 'list'>
[1, 2] <class 'list'>
a = 10
print(type(a))

[결과]
<class 'int'>

1-3. 생성자

  • 클래스 인스턴스가 생성될 때 호출
  • __init__(self, 변수1, 변수2, ...)
  • self 매개변수는 항상 첫번째에 오며, 자기 자신의 객체를 가리킴
  • 이름이 꼭 self일 필요는 없지만 관례적으로 self를 사용
  • 생성자에서는 해당 클래스가 다루는 데이터를 정의

class Dog :
  def __init__(self) :
    print(self, 'init 호출')
    
Dog1 = Dog()
Dog2 = Dog()

[결과]
<__main__.Dog object at 0x7b44452f0fa0> init 호출
<__main__.Dog object at 0x7b44452f3940> init 호출
class Dog :
  def __init__(self) :
    print(self, 'init 호출')
    self.name = '이름 없음'
    self.age = 0
    
Dog1 = Dog()
print(Dog1)
print(Dog1.name)
print(Dog1.age)

Dog2 = Dog()
print(Dog2.name)
print(Dog2.age)

[결과]
<__main__.Dog object at 0x7b44452f1de0> init 호출
<__main__.Dog object at 0x7b44452f1de0>
이름 없음
0
<__main__.Dog object at 0x7b44452f0ee0> init 호출
이름 없음
0
Dog1.name = '뽀삐'
Dog1.age = 10
print(Dog1.name)
print(Dog1.age)

print(Dog2.name)
print(Dog2.age)

[결과]
뽀삐
10
이름 없음
0
class Dog :
  def __init__(self, name, age, family = '닥스훈트') :
    self.name = name
    self.age = age
    self.family = family
    
# Dog1 = Dog()
# TypeError: Dog.__init__() missing 2 required positional arguments: 'name' and 'age'

Dog1 = Dog('뽀삐',10)
print(Dog1.name)
print(Dog1.age)
print(Dog1.family)

Dog2 = Dog('해피',6,'포메')
print(Dog2.name)
print(Dog2.age)
print(Dog2.family)

[결과]
뽀삐
10
닥스훈트
해피
6
포메

1-4. 메서드 정의하기

  • 멤버함수라고도 하며, 해당 클래스의 객체에서만 호출가능한 함수
  • 메소드는 객체에서만 호출되며, 해당 객체의 속성에 대한 연산을 행함
  • 객체이름, 메소드명() 형태로 호출

class Counter :
  def __init__(self) :
    self.num = 0
  def increment(self) :
    self.num += 1
  def current_value(self) :
    return self.num
  def reset(self) :
    self.num = 0
    
KBbank = Counter()
print(KBbank.num)

KBbank.increment()
KBbank.increment()
KBbank.increment()
print(KBbank.num)
print(KBbank.current_value())

print('대기인원 : %d' % KBbank.current_value())

[결과]
0
3
3
대기인원 : 3



HanaBank = Counter()
print(HanaBank.num)

HanaBank.increment()
HanaBank.increment()
HanaBank.increment()
HanaBank.increment()
HanaBank.increment()
print(HanaBank.num)
HanaBank.reset()
print(HanaBank.num)
print('대기인원 : %d' % HanaBank.current_value())

[결과]
0
5
0
대기인원 : 0

1-5. 메소드 타입

  • instance method : 객체 형태로 호출되기 때문에 해당 메소드를 호출한 객체에만 영향을 미침
  • class method : class로 호출 (함수 선언 위에 @staticmethod라고 표기)
class Math :
  def add(self, x, y) :
    return x + y
  def multipy(self, x, y) :
    return x * y

math = Math()
result1 = math.add(10,5)
print(result1)
result2 = math.multipy(10,5)
print(result2)

[결과]
15
50
class Math :
  @staticmethod
  def add(x, y) :
    return x + y
  @staticmethod
  def multipy(x, y) :
    return x * y
    
result1 = Math.add(10,5)
print(result1)

result2 = Math.multipy(10,5)
print(result2)

[결과]
15
50

0개의 댓글