데이터 놀이터
Section 5 - Sprint 1. Python and Problem Solving - 3. Python with OOP 본문
Section 5 - Sprint 1. Python and Problem Solving - 3. Python with OOP
jjjk84 2023. 4. 21. 01:12오늘의 키워드
- OOP
- 캡슐화, 다형성, 추상화, 상속
- 접근제어
알게된 내용
1. OOP
(1) 개념
Object Oriented Programming, 객체 지향 프로그래밍으로 세상에 모든 물체를 인스턴스, 함수, 변수라는 object로 변화시켜서 프로그램으로 구성하는 것이다. OOP의 전제는 함수, 변수 등의 기능을 재사용 가능하도록 설계하는 것이며 프로그래밍의 효율성을 높일 수 있는 방법들 중의 하나이다.
(2) 구성
- 캡슐화 : 내부 변수와 함수를 하나로 묶어 class로 선언한다.
- 상속과 포함 : 부모 클래스로부터 함수, 변수 등을 전부 가져와 사용하면 상속(Inheritance), 일부 가져와 사용하면 포함(Composition)이다.
## 상속
class Person:
def __init__(self, name):
self.name = name
def printPerson(self):
return self.name
class Student(Person):
def __init__(self, name, id):
super().__init__(name) ## 상속받고자 하는 인수를 ()안에 입력
self.id = id
def printPerson(self): ## 메서드 오버라이딩
return self.name, self.id
## 포함
class Person:
def __init__(self, name):
self.name = name
def printPerson(self):
return self.name
class Student:
def __init__(self, name, id):
self.person = Person(name) ## Person으로부터 기능을 가져오기 위해 연결
self.id = id
def test(self, score):
if score > 80:
return self.person.printPerson() + " passes" ## Person의 printPerson 가져옴
else:
print (self.name + " needs supplementary lessons")
- 추상화 : 실제 실행되는 기능이 없는 추상 클래스를 선언하고, 이를 상속하는 자식 클래스에서 다양한 추상 메서드로 활용한다. 유지보수 시에는 추상 클래스만 수정하면 되어 복잡성을 낮출 수 있는 이점이 있다. 추상 클래스는 하나 이상의 추상 메서드를 갖고 있는데 이 추상 메서드는 자식 클래스에서 반드시 구현해야된다는 특징이 있다.
from abc import ABCMeta, abstractmethod
# 추상 클래스
class People(metaclass=ABCMeta):
# 추상 메소드
@abstractmethod
def character(self):
pass
def working(self):
pass
# 상속받는 클래스
class Student(People):
def character(self, pow, int):
self.pow = pow
self.int = int
print('체력: {0}'.format(self.pow))
print('지능: {0}'.format(self.int))
- 다형성 : 상속을 받은 자식 클래스에서는 상속받은 기능 외에 다른 기능을 추가적으로 사용할 수 있다. 메서드 오버라이딩이 대표적이다.
2. 접근 제어
Python은 객체에 접근을 제어하기 위한 접근제어자를 제공하지 않고 있어 외부에서의 class 내 접근을 막을 방법은 사실상 없다. 이를 보완하기 위해 Python에서는 변수나 함수를 감춰주는 기능으로 name 앞에 _나 __를 추가 시키는 규칙을 만들었다. 강제로 접근을 막을 방법은 없으나 이러한 규칙을 만들어 외부에서의 무분별한 접근을 방지할 수 있다.
가장 접근이 어려운 Private(__name)은 '_클래스이름__메서드이름'으로 외부에서 접근이 가능하다.
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
self.__private_name = "private 접근"
class Point_sub(Point):
def __init__(self,x, y):
Point.__init__(self,x,y)
self.x = x
self.y = y
def __sub(self):
self.__x = 10
self.__y = 20
def sub(self):
self.__sub()
print(self.__x)
print(self.__y)
my_point = Point(1, 2)
my_point_sub = Point_sub(10,20)
# case 1 - error case: private 으로 해당코드로 접근할 수 없다
# print(my_point.__private_name)
# case 2
# 클래스 생성자에 있는 private변수에 접근하기위해 '_클래스이름__private변수' 를 활용한다.
print(my_point._Point__private_name)
# case 3
print('case3 ------------')
my_point_sub.sub() # 변환된 이름에 대해 값 출력
더 알아봐야 할 점
- 기계학습에서의 OOP (자습자료) 보기
- 고릴라 클래스 구현하기
'코드스테이츠 AIB 17' 카테고리의 다른 글
Section 5 - Sprint 1 Challenge, 코딩 스터디 (0) | 2023.04.24 |
---|---|
Section 5 - Sprint 1. Python and Problem Solving - 4. DataStructure Essential (0) | 2023.04.21 |
Section 5 - Sprint 1. Python and Problem Solving - 2. Problem Solving (0) | 2023.04.20 |
Section 5 - Sprint 1. Python and Problem Solving - 1. Python Programming (0) | 2023.04.18 |
Section 4 - Sprint 3. API 개발과 대시보드 (0) | 2023.04.18 |