네이버 부스트코스 강의 <인공지능(AI) 기초다지기>를 참고하여 작성하였습니다.
만들어 놓은 코드를 어떻게 잘 구조화해야 용도에 맞게 재사용할 수 있을까?
=> 객체!
객체 지향 언어(OOP, OO, Object-Oriented Programming)
-객체: 실생활에서 일종의 물건
속성(Attribute)와 행동(Action)을 가진다.
-속성 = 변수(variable), 행동 = 함수(method)로 표현
-파이썬, 자바, C++, C#, ...
OOP는 설계도에 해당하는 클래스 Class,
실제 구현체인 인스턴스 Instance로 나눈다.
ex) 붕어빵 틀 = class
붕어빵 = instance
(object는 python3에서 자동 상속)
class SoccerPlayer(object):
class: class 예약어
SoccerPlayer: class 이름
(object): 상속받는 객체명
⭕ Python naming rule
- 변수, Class 명 함수명에 해당
- snake_case: 띄어쓰기 부분에 " __ "를 추가
- CamelCase: 띄어쓰기 부분에 대문자
🎃 예제
class SoccerPlayer(object):
#초기화
def __init__(self, name, position, back_number):
self.name = name
self.position = position
self.back_number = back_number
는 특수한 예약 함수나 변수, 함수명 변경(맨글링)으로 사용
ex) main, add, str, eq__
우와 이거 코틀린으로도 만들어봐야겠따
-method
Notebook : add_note, remove_note, get_number_of_pages
Note : write_content, remove_all
-variable
Notebook : title, page_number, notes
Note : content
class Note(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 "Note Content: %s" % \
self.content
class NoteBook(object):
def __init__(self, title):
self.title = title
self.page_number = 1
self.notes = {}
def add_note(self, note, page = 0):
if self.page_number < 300:
if page == 0:
self.notes[self.page_number] = note
self.page_number += 1
else:
self.notes = {page : note}
self.page_number += 1
else:
print("All pages are filled")
def remove_note(self, page_number):
if page_number in self.notes.keys():
return self.notes.pop(page_number)
else:
print("Page not found")
def get_number_of_pages(self):
return len(self.notes.keys())
class Person(object):
...
class Korean(Person):
...
=> Person의 속성을 Korean이 그대로 사용할 수 있음.
저 object는 기본값으로 비워놔도 됨. 자동으로 상속받는 기본 클래스!
=> 쉽게 접근할 수 없게 막아놓는 기능
이런 경우에 사용한다!
1) 객체를 사용하는 사용자가 임의로 정보 수정
2) 필요 없는 정보는 접근할 필요 없음
3) 제품으로 판매하는 경우 - 소스 보호
: 캡슐화 / 정보 은닉
Product 객체를 Inventory 객체에 추가
Inventory에는 오직 Product 객체만 들어감
Inventory에 Product가 몇 개인지 확인 필요
Inventory에 Product items는 직접 접근 X
우선 items를 기본 변수로 선언해보자!
주석으로 달아놓은 것처럼
private 변수로 선언해야 타 객체가 접근할 수 없게 된다.
접근이 안된다!
개념적으로 언더바2개로 시작하는 private 변수들은
다른 객체에서 마음대로 변경할 수 없게 할 수 있다.
@property ### => property decorator
#숨겨진 변수를 반환
def items(self):
return self.__items
@property decorator로 함수를 변수처럼 호출할 수 있다.
앞에서 사용해본 property도 데코레이터 중 하나이다.
1. first - class object
: 일등 함수 / 일급 객체
- 변수, 데이터 구조에 할당 가능한 객체
- parameter로 전달, return 값으로 사용 가능
=> 파이썬의 함수들은 다 일급 함수이다.
함수가 파라미터로 쓰이기 때문!
ex) map(f, ex) : f가 함수였어def square(x): return x*x f = square f(5) ######################### def cube(x): return x*x*x def formula(method, argument_list): return [method(value) for value in argument_list]
=> 함수를 파라메터로 사용
2. inner function
: 함수 내에 또 다른 함수 존재
1) 기본def print_msg(msg): def printer(): print(msg) printer() print_msg("Hi")
2) closures: inner function을 return 값으로 반환하는 경우
def print_msg(msg): def printer(): print(msg) return printer() another = print_msg("Hi") another()
=> another는 항상 메세지에 print_msg가 리턴된다.
이렇게 사용하면 좋은 점:def tag_func(tag, text): text = text tag = tag def inner_func(): return '<{0}>{1}<{0}>'.format(tag,text) return inner_func h1_func = tag_func('title', "This is Python") p_func = tag_func('p', "Data Academy")
3.decorator function
:복잡한 클로져 함수를 간단하게!