📝 객체지향과 클래스
🖥️ 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('뽀삐',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