객체지향 프로그래밍
OOP
실제 세계는 사물(객체, object)로 이루어져 있으며, 발생하는 모든 사건들은 사물 간의 상호작용이다. 이 개념을 이용하여 코드 간에 서로 관계를 맺어줌으로써 보다 유기적으로 프로그램을 구성할 수 있다.
상속
, 중복 방지, 성능 향상.# 절차지향
dog1 = {'vaccine' : 'covid19'
'name' : 'Happy'
'age' : 10
}
dog2 = {'vaccine' : 'covid19'
'name' : 'Rafael'
'age' : 37
}
dog3 = {'vaccine' : 'covid19'
'name' : 'Sunflower'
'age' : 35
}
dog4 = ...
코드를 바꿔야 할 경우, n개를 정직하게 일일이 바꿔줘야 한다.
# 객체지향
class Dog:
vaccine = 'covid19'
def __init__(self, dogname, dogage):
self.name = dogname
self.age = dogage
dog1 = Dog("Happy", 10)
dog2 = Dog("Rafael", 37)
dog3 = Dog("Sunflower", 35)
설계도/틀을 바꿔줌으로써 전체를 동시에 바꿀 수도 있다.
ex
클래스 변수 vaccine에 '광견병'을 추가한다.
다음 3가지 방법 모두 가능하다.
class Dog:
class Dog():
class Dog(object): # 모든 클래스는 object를 상속 받는다.
class Dog:
pass
class Dog:
vaccine = 'covid19'
def __init__(self, dogname, dogage): # 초기화
self.name = dogname
self.age = dogage
print(Dog)
# <class '__main__.Dog'>
클래스 : '개 설계도'
객체(object) : 우리가 구현할 대상인 '개'
인스턴스 : 설계도로 찍어낸 각각의 개들. ex
해피, 대랑이, 순돌이.. 등
인스턴스가 객체에 포함된다.
# 예제1
class Dog:
# 클래스 속성
vaccine = 'covid19'
def __init__(self, dogname, dogage):
# 인스턴스 속성
self.name = dogname
self.age = dogage
# '인스턴스'화
dog1 = Dog("Happy", 10)
dog2 = Dog("Rafael", 37)
dog3 = Dog("Sunflower", 35)
dog4 = Dog("Happy", 10)
self
가 붙은 변수. 객체마다 별도로 존재. 직접 접근 불가.dog1
과 같이 변수를 할당 받아 메모리에 올라갈 때 (id값을 갖게 될 때)
설계도를 바탕으로 구현된 것을 '인스턴스화' 되었다고 한다.
인스턴스화 해서 변수
가 생성된 객체들은 각각 다른 객체로 간주한다.
dog1 ~ dog4는 모두 다른 객체다.
dog1
과 dog4
는 둘 다 이름이 '해피'이고 나이가 10살로 같기 때문에 같은 강아지라 생각할 수 있지만, 우리집 말티즈 해피(10)와 공원에서 만난 푸들 해피(10)는 (아무리 이름과 나이가 같더라도) 다른 강아지다.
print(dog1 == dog4)
# False
print(id(dog1), id(dog2), id(dog3), id(dog4))
# 2881701779344 2881701972864 2881701638448 2881702011280, id 값이 모두 다르다.
# 인스턴스 속성 확인
print('{} is {} and {} is {}.'.format(dog1.name, dog1.age, dog2.name, dog2.age))
if dog1.vaccine == 'covid19':
print('{0} is {1}.'.format(dog1.name, dog1.age))
dog1 ~ dog4로 인스턴스화 했기 때문에 접근이 가능한 것이다.
# 직접 접근이 가능할까?
print(Dog.vaccine) # class로 바로 접근 가능
print(dog1.vaccine) # 인스턴스로도 접근 가능
print(dog3.vaccine)
# covid19
# covid19
# covid19
print(Dog('Rafael', 37))
# <__main__.Dog object at 0x0000025F54582340>
.__dict__
네임스페이스객체를 인스턴스화 하고 나면 ('해피' 생성)
'각자 방'이 지닌 속성attribute들을 {딕셔너리} 형태로 확인할 수 있다.
print('개1', dog1.__dict__)
print('개2', dog2.__dict__)
# 개1 {'name': 'Happy', 'age': 10}
# 개2 {'name': 'Rafael', 'age': 37}