카테고리 없음
객체지향과 클래스
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([1, 2])
li2 = list([1, 2])
#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(10, 5)
print(result1)
15
[ ]
50
[ ]
반응형