일단 OOP라는 개념에서 객체(Object)를 먼저 알아야한다.
객체란 어떤 속성(Attributes), 값(Value), 함수(Methods)를 갖는 데이터를 말한다.

캡슐화

내부 속성(변수), 함수를 하나로 묶어서 클래스로 선언하는 일반적인 개념
캡슐화 하지 않으면 특정 기능(함수, 변수)에 직접 접근하는 상황이 되고, 기능이 많아질수록 재사용성이 떨어진다.

이전에 JAVA를 배울때 접근제어에 대해 살짝 배운적이 있는데, Python 에서도 어느정도 접근제어가 가능하다!

name      # Public
_name     # Protected
__name    # Private
__asd__   # Public

어디서든 호출 가능한 Public과 동일 클래스나 인스턴스에서만 접근 가능한 Protected,
직접접근을 차단하는 Private를 선언할 수 있다.
그리고, 접미사(postfix)에 언더바가 2개 (__) 이상인 경우에 public으로 간주한다.!!
하지만... 이름만 복잡해질뿐, 기존의 객체지향언어에서 사용하던것만큼 엄격한 수준으로 접근관리가 이루어지지는 않는다..

상속과 포함

상속 Inheritance → 상위 클래스의 모든 기능(함수,변수)를 재사용 할 수 있음
포함 Composition → 다른 클래스의 일부 기능(함수)만을 재사용함

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

    def printPerson(self):
        print(f'Person_printPerson , Age : {self.age}')
        return self.age

class Student:
    def __init__(self, age):
        self.age = age
        # Student가 Person에 포함되기 위해, Person 클래스에 대한 object 생성
        self.p = Person(self.age+100)       

    def personComposit(self,age):
        # 포함개념적용된 Student 클래스의 Person object의 함수
        return age, self.p.printPerson()  

# object 생성
s = Student(10) # 한 번 생성된 object는 파라미터가 변하지 않는 이상 출력값 또한 변하지 않는다.
p = Person(20)

s.p.printPerson()
s.personComposit(40)

위와같은 경우 Student의 p라는 속성으로 Person인스턴스를 하나 갖는다.

따라서 s.p.printPerson()s.personComposit(40) 의 결과가 같다

추상화

Object의 기능에 따라 추상클래스(상위)를 상송받아 개별적으로 하위클래스를 생성

실제 실행되는 기능은 선언된 추상 클래스를 상속받은 다른 클래스의 메소드에서 확인가능
→ @abstractmethod를 선언해서 사용해줘야함

프로그램이 복잡해 지는 경우 1차적인 설계를 위해 기능을 추상화 시켜놓고 활용여부는 차후 결정하기 위함

from abc import *
class People(metaclass=ABCMeta):
    @abstractmethod
    def character(self):
        pass
class Student(People):
    def character(self, pow, think):
        self.pow=pow
        self.think=think
        print(self.pow, self.think)

# p=People()
s=Student()
s.character('pow','think')

위의 People 클래스는 추상클래스로, 그 안에 def character 라는 추상메소드를 갖고있다.

그렇기에 Student에서 People을 상속받으며 character 의 상세 내용을 구체화해줘야 한다.

class Student_2(People):
    def __init__(self):
        super().__init__()

s2 = Student_2()
# TypeError: Can't instantiate abstract class Student_2 with abstract methods character

People 클래스를 상속받은 Student_2에서 character를 구체화하지않는다면 위와같은 타입에러를 볼 수 있다.

다형성

구션되는 하위클래스에 따라 클래스를 다르게 처리하는 기능 → 상위클래스의 기능을 변경하여 사용하느것 (그대로 사용하지 않음)

class A:
    def run(self):
        print('A run')

    def play(self):
        print("A play")

class B(A):
    def run(self):
        print("B run")
    def play(self):
        print("B play")

class C(A):
    def run(self):
        print("C run")

a=A()
b=B()
c=C()
c.play()
## A play

A ← B , C 의 형태로 상속한다

C에는 play() 메소드가 없는데, 이를 실행할경우 A.play() 를 실행한것과 같은 효과를 받는다

class C(B):
    def run(self):
        print("C run")
c=C()
c.play()
## B play

위의 상황에서 A ← B ← C로 상속관계가 이뤄진다.

이때 c.play()를 하게될 경우 B의 play() 가 실행된다.

참조 : https://velog.io/@seonj102/OOPS-파이썬

'Python' 카테고리의 다른 글

Python Decorator에 대하여 @ 데코레이터  (0) 2021.06.14
lambda , filter, map  (0) 2021.05.11
Python Generator 제너레이터, yield  (0) 2021.05.11
Global에 대하여  (0) 2021.05.11

+ Recent posts