OOP

MostlyFor·2023년 1월 2일
0

용어 정리

  1. 객체 지향 프로그래밍 (Object oriented Programming)

    객체 지향 프로그래밍이란 객체와 관련된 코드를 분리할 수 있게 하여 객체를 위주로 생각하여 프로그래밍 하는 것!

    이러한 구조가 계속 반복되다 보니 클래스라는 구조가 만들어짐 !

  2. 클래스 (class)

    클래스란 데이터와 그 데이터를 효과적으로 다룰 수 있는 함수를 하나로 묶은 새로운 타입. 즉, 객체와 관련하여 묶은 새로운 데이터 타입!

    * 이름을 지을 때 BeautifulSoup 처럼 단어마다 앞에 대문자로 바꾸어 붙여야함.
    (캐멀 케이스 규칙)

  3. 객체 (object)

    여러 가지 속성을 가질 수 있는 대상 !

    + 사람을 객체로 표현한다면 이름, 성별 등등이 속성 !

    * 클래스 기반으로 만들어진 객체는 인스턴스라고 함.

OOP Characteristics

1. Inheritance (상속)

  • 부모클래스로 부터 속성과 Method를 물려받은 자식 클래스를 생성하는 것
  • 아래의 예시를 보면 Employee 클래스가 Person 클래스를 상속 받았다.
    super()는 부모 클래스를 지칭한다. 따라서 super().__init__ 은 부모 클래스의 생성자를 의미하고 아래의 경우 처럼 주석 처리를 하여 부모 클래스의 생성자를 이용하지 않은 경우 B 객체는 name을 가지지 않는다.

2. Polymorphism (다형성)

  • 같은 이름의 함수가 상황에 따라 다른 역할을 하도록 하는 것을 말한다.
    (overriding과 비슷한 개념이라고 이해하면 될 듯 하다.)
  • 아래의 경우 about_me() 함수는 다른 클래스인 A와 B에게 서로 다르게 작동한다.

3. Visibility (가시성)

  • 객체 정보에 대한 접근 권한을 조절하는 것
  • private 변수로 선언하여 다른 객체가 접근하지 못하게 할 수 있음. 변수 앞에 __를 붙이면 private 변수가 됨.

ex) self.__salary = 1000


class Person:
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender =gender

    def about_me(self):
        print("저의 이름은 ", self.name)

    def __str__(self):
          return f"저의 이름은 {self.name} 입니다"
        
        
class Employee(Person):
    def __init__(self,name,age,gender, salary):
        #super().__init__(name, age, gender)
        self.salary = salary
        
    def about_me(self):
        #super().about_me()
        print('급여는', self.salary)
        
        
A = Person('John',28,'M')

B = Employee('sam',30,'M',1000)

Dacorate

선행 개념

1.First - class objects
	- 변수나 데이터 구조에 할당이 가능한 객체
    - 파라미터로 전달이 가능 + 리턴 값으로 사용
    - 파이썬의 함수는 일급함수 (아래 예시를 보면 함수를 파라미터로 받아서 사용함.)
def square(x):
    return x*x

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

def formula(method, x):
    return method(x)

print(formula(square,6))
print(formula(cube,6))
2. Inner function
	- 함수 내에 또 다른 함수가 존재
    - 두 번째 예시는 위의 특성을 일급 함수 개념을 살려서 함수 자체를 return 함. 이 개념이 closure임.
    
def print_msg(msg):
    def printer():
        print(msg)
    printer()
    
print_msg('hi')
def print_msg(msg):
    def printer():
        print(msg)
    return printer
    
hi = print_msg('hi')
hi()
3.decorator
	- 복잡한 클로져 함수를 간단하게 해줄 수 있음.
    
    
def star(func):
    def inner(*args):
        print("*"*30)
        func(*args)
        print("*"*30)
    return inner


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

printer('hi')

밑의 star(printer('hi))는 마지막 return 값이 존재하는데, printer('hi')는 존재하지 않는다. 어떤 순서로 데코레이터가 동작하는 것일까?

def star(func):
    def inner(*args):
        print("*"*30)
        func(*args)
        print("*"*30)
    return inner
@star
def printer(msg):
    print(msg)
star(printer('hi'))
printer('hi')

-> 데코레이터를 사용하면 star(printer('hi'))가 아니라 star(printer)('hi')로 동작한다. star는 inner라는 함수를 반환하기 때문에 그 반환 함수의 인자로 ('hi')를 받는다는 뜻이다. 따라서 inner 함수가 한 번 실행이 되고 종료된다.

0개의 댓글