[부스트캠프 AI Tech 5기] Pre-Course : (2) Object Oriented Programming

araseo·2022년 12월 5일
0
post-thumbnail

📖 객체지향 프로그래밍 개요

  • Object-Oriented Programming, OOP
  • 객체: 실생활에서 일종의 물건 속성(Attribute)와 행동(Action)을 가짐
  • OOP는 이러한 객체 개념을 프로그램으로 표현
  • 속성은 변수(variable), 행동은 함수(method)로 표현됨
  • 파이썬 역시 객체 지향 프로그램 언어
  • OOP는 설계도에 해당하는 클래스(Class)와 실제 구현체인 인스턴스(instance)로 나눔


📖 class 구현하기 in Python

  • 축구 선수 정보를 Class로 구현하기
class SoccerPlayer(object):
def __init__(self, name, position, back_number):
        self.name = name
        self.position = position
        self.back_number = back_number
def change_back_number(self, new_number):
print("선수의 등번호를 변경합니다 : From %d to %d" % (self.back_number, new_number)) self.back_number = new_number
  • class 선언, object는 python3에서 자동 상속

📖 Attribute 추가하기

  • Attribute 추가는 __init__, self와 함께!
    __init__ 은 객체 초기화 예약 함수

📖 method 구현하기

  • method(Action) 추가는 기존 함수와 같으나, 반드시 self를 추가해야만 class 함수로 인정됨
class SoccerPlayer(object):
	def change_back_number(self, new_number):
    	print("선수의 등번호를 변경합니다:
        	   From %d to %d" % \
             (self.back_number, new_number))
        self.back_number = new_number

📖 object(instance) 사용하기

  • Object 이름 선언과 함께 초기값 입력하기
jinhyun = SoccerPlayer("Jinhyun", "MF", 10)
print("현재 선수의 등번호는 :", jinhyun.back_number)
jinhyun.change_back_number(5)
print("현재 선수의 등번호는 :", jinhyun.back_number)

📖 상속(Inheritance)

  • 부모 클래스로부터 속성과 Method를 물려받은 자식 클래스를 생성하는 것
# example 1.
class Person(Object):
	def __init__(self, name, age):
    	self.name = name
        self.age = age

class Korean(Person):
	pass

first_korean = Korean("Sungchul", 35)
print(first_korean.name)

# example 2.
class Person(object):		# 부모 클래스 Person 선언
	def __init__(self, name, age, gender):
    	self.name = name
        self.age = age
        self.gender = gender
        
	def about_me(self):		# Method 선언
    	print("저의 이름은", self.name,"이구요, 제 나이는", str(self.age),"살 입니다.")

class Employee(Person):		# 부모 클래스 Person으로부터 상속
	def __init__(self, name, age, gender, salary, hire_date):
    	super().__init__(name, age, gender)
        self.salary = salary
        self.hire_date = hire_date
    
    def do_work(self):		# 새로운 Method 추가
    	print("열심히 일을 합니다.")
    
    def about_me(self):		# 부모 클래스 함수 재정의
    	super().about_me()	# 부모 클래스 함수 사용
        print("제 급여는", self.salary,"원 이구요, 제 입사일은", self.hire_date,"입니다.")

📖 Polymorphism overview

  • 같은 이름 메소드의 내부 로직을 다르게 작성
  • Dynamic Typing 특성으로 인해 파이썬에서는 같은 부모클래스의 상속에서 주로 발생함
  • 중요한 OOP의 개념이긴 하지만, 너무 깊이 알 필요는 없음

📖 Polymorphism code

class Animal:
  def __init__(self, name): # Constructor of the class
      self.name = name
  def talk(self): # Abstract method, defined by convention only
      raise NotImplementedError("Subclass must implement abstract method")
      
class Cat(Animal):
	def talk(self):
    	return 'Meow!'
        
class Dog(Animal):
	def talk(self):
        return 'Woof! Woof!'
        
animals = [Cat('Missy'), Cat('Mr. Mistoffelees'), Dog('Lassie')]

for animal in animals:
	print(animal.name + ': ' + animal.talk())

📖 Visibility overview

  • 객체의 정보를 볼 수 있는 레벨을 조절하는 것
  • 누구나 객체 안에 모든 변수를 볼 필요가 없음
    1) 객체를 사용하는 사용자가 임의로 정보 수정
    2) 필요 없는 정보에는 접근할 필요가 없음
    3) 만약 제품으로 판매한다면? 소스의 보호

📖 Visibility Example 1

  • Product 객체를 Inventory 객체에 추가
  • Inventory에는 오직 Product 객체만 들어감
  • Inventory에 Product가 몇 개인지 확인이 필요
  • Inventory에 Product items는 직접 접근이 불가
class Product(object):
	pass
    
class Inventory(obejct):
	def __init__(self):
    	# Private 변수로 선언하여 타객체가 접근하지 못함
    	self.__items__ = []
    
    def add_new_item(self, product):
    	if type(product) == Product:
        	self.__items.append(product)
            print("new item added")
        
        else:
        	raise ValueError("Invalid Item")
    
    def get_number_of_items(self):
    	return len(self.__items)

my_inventory = Inventory()
my_inventory.add_new_item(Product())
my_inventory.add_new_item(Product())
print(my_inventory.get_number_of_items())

print(my_my_inventory.__items)
my_inventory.add_new_item(object)

📖 Visibility Example 2

  • Product 객체를 Inventory 객체에 추가
  • Inventory에는 오직 Product 객체만 들어감
  • Inventory에 Product가 몇 개인지 확인이 필요
  • Inventory에 Product items 접근 허용
class Inventory(obejct):
	def __init__(self):
    	self.__items__ = []
    
    @property
    # property decorator : 숨겨진 변수를 반환하게 해줌
    def items(self):
    	return self.__items

my_inventory = Inventory()
my_inventory.add_new_item(Product())
my_inventory.add_new_item(Product())
print(my_inventory.get_number_of_items())

# property decorator로 함수를 변수처럼 호출
items = my_inventory.items
items.append(Product())
print(my_inventory.get_number_of_items())

📖 First-class object

  • 일등 함수 또는 일급 객체
  • 변수나 데이터 구조에 할당이 가능한 객체
  • parameter로 전달이 가능 + return 값으로 사용
  • 파이썬의 모든 함수는 일급 함수임
# example 1

def squqre(x):
	return x * x

# 함수를 변수로 사용
f = square

f(5)

# example 2.
def square(x):
	return x * x

def cube(x):
	return x * x * x

# 함수를 parameter로 사용
def formula(method, argumenr_list):
	return [method(value) for value in argument_list]

📖 Inner function

  • 함수 내에 또 다른 함수가 존재
def print_msg(msg):
	def printer():
    	print(msg)
    printer()

print_msg("Hello, Python")
  • closures : inner function을 return 값으로 반환
# example 1.
def print_msg(msg):
	def printer():
    	print(msg)
    return printer

another = print_msg("Hello, Python")
another()

# example 2.
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 Class")
p_func = tag_func('p', "Data Academy")

📖 decorator function

  • 복잡한 closure 함수를 간단하게!
# example 1.
def star(func):
    def inner(*args, **kwargs):
        print("*" * 30)
        func(*args, **kwargs)
        print("*" * 30)
return inner

@star
def printer(msg):
    print(msg)
printer("Hello")

# example 2.
def star(func):
    def inner(*args, **kwargs):
        print("*" * 30)
        func(*args, **kwargs)
        print("*" * 30)
return inner

def percent(func):
    def inner(*args, **kwargs):
        print("%" * 30)
        func(*args, **kwargs)
        print("%" * 30)
return inner

@star
@percent
def printer(msg):
    print(msg)
printer("Hello")

# example 3.
def generate_power(exponent):
    def wrapper(f):
        def inner(*args):
            result = f(*args)
            return exponent**result
        return inner
    return wrapper
    
@generate_power(2)
def raise_two(n):
	return n**2

<이 게시물은 최성철 교수님의 Object Oriented Programming 강의 자료를 참고하여 작성되었습니다.>

본 포스트의 학습 내용은 [부스트캠프 AI Tech 5기] Pre-Course 강의 내용을 바탕으로 작성되었습니다.
부스트캠프 AI Tech 5기 Pre-Course는 일정 기간 동안에만 운영되는 강의이며,
AI 관련 강의를 학습하고자 하시는 분들은 부스트코스 AI 강좌에서 기간 제한 없이 학습하실 수 있습니다.
(https://www.boostcourse.org/)

profile
AI를 공부하고 있는 학생입니다:)

0개의 댓글