카테고리 없음

객체지향과 클래스

Data Analyst / PO 2022. 11. 2. 20:49
반응형

1. 객체지향 프로그래밍

 

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

1-1. 클래스와 객체

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

1-2. 클래스 만들기

class 클래스명:
  def __init__(self):
    self.필드명1 = 값1
    self.필드명2 = 값2
    ...
    객체가 메모리에 로드될 때 가장 먼저 실행될 문장
    ...
  def 메소드명(변수1, 변수2 ..):
    메소드가 호출되면 실행될 문장 
  • 생성자는 클래스를 객체화 시킬 때 가장 먼저 실행되는 함수
  • 클래스를 통해 호출되는 변수를 필드라고 함
  • 클래스를 통해 호출되는 함수를 메소드라고 함

[ ]
 
# 기능이 없는 빈 클래스
class dog:
  pass # 내용이 없는 클래스/함수를 만들 때 사용
 

[ ]
 
# 클래스를 통해 객체를 생성
rucy = dog()
print(rucy, type(rucy))

pomi = dog()
print(pomi, type(pomi))

#생긴 건 같아도, 객체 위치는 다르다. 
#붕어빵 틀 = 클래스, 붕어빵 = 객체/인스턴스. 똑같이 생겼지만 따로따로 존재하기 때문에 저장 위치가 다름. 붕어빵 하나 지워도 나머지는 그대로 살아있음

 
<__main__.dog object at 0x7f51fbd12f90> <class '__main__.dog'>
<__main__.dog object at 0x7f51fbcbb6d0> <class '__main__.dog'>

[ ]
 
li1 = list([12])
li2 = list([12])
#list 는 클래스. 
print(li1, type(li1))
print(li2, type(li2))
 
[1, 2] <class 'list'>
[1, 2] <class 'list'>

1-3. 생성자

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

[ ]
 
class dog:
  def __init__(self):
    print(self, 'init 호출')
 

[ ]
 
rucy = dog()
#변수 = 객체
print(rucy)

pomi = dog()
print(pomi)

#생성자 = init을 가진거.. def 전체가 생성자
 
<__main__.dog object at 0x7f51fbc34a50> init 호출
<__main__.dog object at 0x7f51fbc34a50>
<__main__.dog object at 0x7f51fbc34910> init 호출
<__main__.dog object at 0x7f51fbc34910>

[ ]
 
class dog:
  def __init__(self):
    print(self'init 호출')
    self.name = '이름없음'
    self.age = 0
    
 

[ ]
 
dog()
print('-')
pomi = dog()
print(pomi)
print(pomi.name)
print(pomi.age)

rucy = dog()
 
<__main__.dog object at 0x7f51fbdcd6d0> init 호출
-
<__main__.dog object at 0x7f51fbdcd6d0> init 호출
<__main__.dog object at 0x7f51fbdcd6d0>
이름없음
0

[ ]
 
rucy.name = '루시'
rucy.age = 12
print(rucy.name)
print(rucy.age)

print(pomi.name)
print(pomi.age)
 
루시
12
이름없음
0

[ ]
 
class dog:
  def __init__(self, name, age, family='포메'):
    print(self'init 호출')
    self.name = name
    self.age = age
    self.family = family
  # 주로 게임 시작할 때, 초기값 설정할 때 생성자를 활용함. 
 

[ ]
 
rucy = dog('루시',12)
print(rucy.name)
print(rucy.age)
print(rucy.family)

pomi = dog('보미', 6, '폼피츠')
print(pomi.name)
print(pomi.age)
print(pomi.family)
 
<__main__.dog object at 0x7f51fbc3b410> init 호출
루시
12
포메
<__main__.dog object at 0x7f51fbc3bc10> init 호출
보미
6
폼피츠

[ ]
 
#tory = dog('폼피츠'TypeError: __init__() missing 1 required positional argument: 'age'

 
 

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
 

[ ]
 
kb = counter()
print(kb.num)

kb.increment()
kb.increment()
kb.increment()
kb.increment()
print(kb.num)
print(kb.current_value())
print('대기인원 : %d' % kb.current_value())
 
0
4
4
대기인원 : 4

[ ]
 
hana = counter()
print(hana.num)
# kb와 hana는 객체가 다르기 때문에, 모양은 같아도 첫 세팅 값이 출력됨

hana.increment()
hana.increment()
print(hana.num)
print(hana.current_value())
hana.reset()
print(hana.num)
 
0
2
2
0

1-5. 메소드 타입

  • instance method:객체 형태로 호출되기 때문에 해당 메소드를 호출한 객체에만 영향을 미치는 일반 메소드.
  • class method: class로 호출(함수 선언 위에 @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)
 
13

[ ]
 
result2 = math.multiply(3,6)
print(result2)
 
18

[ ]
 
class math:
  @staticmethod
  def add(x,y): #클래스 메소드는 객체가 없으니까 self안씀
    return x + y
  @staticmethod
  def multiply(x,y):
    return x * y 
 

[ ]
 
result1 = math.add(105)
print(result1)
 
15

[ ]
 
 
 
 
 
50

[ ]
 
 
반응형
댓글수0