객체지향이란 어떠한 물체의 고유한 특징을 추출(추상화)하는 것을 의미한다. 객체라는 개념을 이용하여 사람이 생각하는 방식과 가깝게 프로그래밍을 할 수 있게되었다.
아래의 조건을 만족하는 노트정리 프로그램을 객체지향프로그래밍으로 만들어보자.
Note Class
class Note(object): #object 생략가능
def __init__(self,content = None):
self.content = content
def write_content(self,content):
self.content = content
def remove_all(self):
self.content = ""
def __add__(self,other): #두개의 노트를 합치는 기능
return self.content + other.content
def __str__(self):
return self.content
NoteBook class
class NoteBook(object):
def __init__(self,title):
self.title = title
self.page_number = 1
self.notes = {}
def add_note(self,note,page=0):#note: note 객체
if self.page_number < 300:
self.notes[self.page_number] = note
self.page_number += 1
else:
print("page가 모두 찼습니다.")
def remove_note(self,page_number):
if page_number in self.notes.keys():
return self.notes.pop(page_number)
else:
print("해당 페이지는 존재하지 않습니다.")
객체 지향 프로그래밍을 위해서는 아래 세가지 특성들이 필요하다.
#부모클래스
class Person(object):
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
def about_me(self):
print("저의 이름은",self.name,"이구요, 제 나이는",str(self.age),"살 입니다.")
#자식 클래스
class Employee(Person):
def __init__(self, name,age, gender, salary,hire_data):
super().__init__(name, age, gender) # 부모객체 사용
self.salary = slary
self.hire_date = hire_date
def do_work(self):
print("열심히 일을 합니다.")
def about_me(self): # 부모클래스 함수 재정의
super().about_me() # 부모클래스 함수 사용
print("제급여는",self.salary,"원입니다.") #기능 추가
polymorphism(다형성): 같은 이름을 갖는 메소드들의 내부 로직을 다르게 작성.
visibility (가시성): 객체의 정보를 볼 수 있는 레벨을 조절하는 것. 사용자가 임의로 접근,수정하지 않도록한다.
class test():
def __init__(self):
self.__items = [] #_를 두개 붙이면 private 변수로 선언되어 사용자가 접근할 수 없다.
그러나 데코레이터를 이용하면 클래스 외부에서 숨겨진 변수를 호출할 수 있다.
class test():
def __init__(self):
self.__items = [] 사용자가 접근할 수 없다.
@property
def items(self):
return self.__items #원본 객체를 반환하면 사용자가 수정할 수 있으므로 copy를 사용하여 반환하는 것이 바람직하다
my_test = test()
items = my_test.items #property를 사용하면 호출시 괄호 생략가능
데코레이터를 이해하기 위해 추가적인 개념이 필요하다.
#case 1
def squares(X):
return x*x
f = square #함수를 변수에 할당
f(5) #25
f = lambda x: 2*x
f(5) # 10
#case 2
def func(method,ex): #함수이름을 파라미터로 받는다
return [method(value) for value in ex]
실행결과
******************************
Hello
******************************