728x90
객체지향프로그래밍 _ OOP(Object Oriented Programming)이란?
파이썬 프로그래밍의 큰 장점은 객체지향프로그래밍 OOP(Object Oriented Programming)라는 무기를 가지고 있기 때문이다.
파이썬은 클래스라는 자료형을 이용해서 객체를 생성하고 인스턴스를 활용해서 다른 이름의 객체로 저장하는 시스템을 가지고 있다. 클래스를 얼마나 잘 다루는지를 보고 파이썬 실력을 평가할 때 기준이 되기도 한다.
- OOP의 기본 전제는 기능(클래스, 함수, 변수)을 재사용이 가능하도록 설계 및 프로그래밍 했는지다.
OOP에 대한 의견
- 중요한 것은 용어보다는, 현실에서 발생할 수 있는 특정 object를 컴퓨터라는 도구에 인식시키는 것이라 할 수 있다.
- 대부분의 분야에서 OOP의 개념을 적용하여 프로그래밍을 수행한다.
- 기본개념 : 설계(사람이 이해하는 방식)와 구현할 소스코드(컴퓨터가 이해하는 방식) 간의 상호이해가 중요하다.
- HW&SW 성능증가(CPU성능 증가, 소프트웨어 다중실행) 덕분에 OOP의 모든 기능을 활용할 필요는 없다.
- OOP의 개념을 무분별하게 활용하면 유지보수가 어려워질 수도 있기때문에 설계방향 및 서비스기능에 따라 사용해야 한다.
- HW&SW 성능증가(CPU성능 증가, 소프트웨어 다중실행) 덕분에 OOP의 모든 기능을 활용할 필요는 없다.
- OOP의 어려운 점 :
- OOP는 하나의 패러다임일 뿐이기 때문에 기존의 프로그래밍 패러다임(Procedural Programming, Functional Programming, ...)들과 우열을 가릴 필요는 없다.
- OOP는 주관성이 높으므로, 보편적으로 활용되는 개념에 대해 배운다.(주관성이 높다는 뜻은 소프트웨어 서비스 설계방향에 영향을 많이 받는다.)
- OOP를 제대로 하는 법은 프로그래밍뿐만 아니라 다양한 도메인에서 재사용 가능한 클래스, 메소드(기능) 설계가 중요하다.
객체 지향 프로그래밍의 장, 단점
- 장점
- 코드 재사용이 용이 : 남이 만든 클래스를 가져와서 이용할 수 있고 상속을 통해 사용자가 확장해서 사용할 수 있다.
- 유지보수가 쉬움 : 절차 지향 프로그래밍에서는 코드를 수정해야할 때 일일이 찾아 수정해야하는 반면 객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수혹은 메서드로 있기 때문에 해당 부분만 수정하면 된다.
- 대형 프로젝트에 활용하기 편함 : 클래스단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트처럼 여러명, 여러회사에서 개발이 필요할 시 업무 분담하기 쉽다.
- 단점
- 처리속도가 상대적으로 느릴 수 있다.
- 객체가 많으면 불필요한 용량이 커질 수 있다.
- 설계시 많은 시간과 노력이 필요하다.
OOP 개념을 활용하여 코드설계
코드설계에 단계를 두고 하나씩 확장하면서 설계전략을 세운다.
1단계
- 코드 설계 시 사용할 object부터 적어보자.
- Users
- Customers
- Vendors
- Admin
- Products
- Purchases
2단계
- 코드 작성 전, 각 object별로 요구되는 속성과 어떤 기능을 위해 생성되었는지 설계한다.
- Users
- Attributes(속성)
- 이름
- 사용자가 관리자인지?
- Customers
- Attributes
- 이름
- 구매목록
- Attributes
- Vendors
- Attributes
- 이름
- 상품목록
- Attributes
- Admin
- 이름
- 사용자가 관리자임을 나타내는 구분값
- Attributes(속성)
- Products
- Attributes
- 이름
- 가격
- 공급업체
- Attributes
- Purchases
- Attributes
- 제품
- 고객
- 가격
- 구매완료기간
- Attributes
OOP의 구성
- 캡슐화
- 기본개념 : 내부 속성(변수)과 함수를 하나로 묶어서 클래스로 선언하는 일반적인 개념
- 캡슐화형태로 코드를 작성하지 않으면 특정 기능(함수, 변수)에 직접 접근하게 되는 상황이 된다.
- 기능이 많아질수록 재사용의 개념을 활용하기가 어려움
- 해당 접근제어 관련해서는 Note 04에서 추가적으로 다룹니다.
- 캡슐화 예제코드
# 캡슐화코드
class Encap:
def __init__(self,value):
self.value = value
print('init :', self.value)
def _set(self):
print('set :', self.value)
def printTest(self):
print('printTest :', self.value)
# def __printTest2(self):
# print('printTest :', self.value)
# object 생성
e = Encap(10)
# object 실행
# 케이스1
e.__init__(20)
e._set()
e.printTest()
#e.__printTest2()
print('\n')
# 케이스2
e.__init__(30)
e._set()
e.printTest()
- 상속화
상속은 객체지향의 꽃이라고 할 수 있다. 상속이란 기존 상위클래스에 근거하여 새롭게 클래스와 행위를 정의할 수 있게 도와주는 개념이다.
- 코드를 재사용할 수 있다.
기존클래스에 기능을 가져와 재사용할 수있으면서도 동시에 새롭게 만든 클래스에 새로운 기능을 추가할 수 있게 만들어 준다.
# 상속코드
# 클래스 선언
class Person:
def __init__(self, name):
self.name = name
class Student(Person): # Person 클래스 상속받음(name 변수를 파라미터로 재사용)
def study(self):
print (self.name + " studies hard")
class Employee(Person): # Person 클래스 상속받음(name 변수를 파라미터로 재사용)
def work(self):
print (self.name + " works hard")
# object 생성
s = Student("Dave")
e = Employee("David")
# object 실행
s.study()
e.work()
- 추상화
- 기본개념 : 추상화(abstraction)는 복잡한 내용에서 핵심적인 개념 및 기능을 요약하는 것을 말한다.
- object의 기능에 따라 추상클래스(상위클래스)를 상속받아 개별적으로 클래스(하위클래스)를 생성한다.
- 기본적으로 추상메소드를 선언하며 실제 실행되는 기능은 보여지지 않는다.
- 실제 실행되는 기능은 선언된 추상클래스를 상속받은 다른 클래스의 메소드에서 확인할 수 있다.
- 추상클래스를 사용하는 이유
- 대형 프로젝트를 진행하는 경우 또는 프로그램이 복잡해지는 경우 1차적인 설계를 위해 기능을 추상화시켜놓고, 활용여부는 차후 결정하기 위함이다.
# 추상화 코드
from abc import * # abc 모듈의 클래스와 메소드를 갖고온다.(abc : abstract base class)
# 추상 클래스
class People(metaclass=ABCMeta):
# 추상 메소드
@abstractmethod # 추상 메소드에는 @abstractmethod를 선언해줘야 함
def charecter(self):
pass # 추상 메소드는 기능 내 실제 실행내용은 없다.
# 상속받는 클래스
class Student(People):
def charecter(self, pow, think):
self.pow = pow
self.think = think
print('체력: {0}'.format(self.pow))
print('생각: {0}'.format(self.think))
# 상속받는 클래스
class Driver(People):
def charecter(self, pow, think):
self.pow = pow
self.think = think
print('체력: {0}'.format(self.pow))
print('생각: {0}'.format(self.think))
# Student object 생성
peo1 = Student()
print('Student : ')
# Student object 실행
peo1.charecter(30, 10)
print()
# Driver object 생성
peo2 = Driver()
print('Driver : ')
# Driver object 실행
peo2.charecter(10, 10)
- 다형성
- 다형성은 구현되는 하위클래스에 따라 클래스를 다르게 처리하는 기능이다.
- 상속과 유사하다고 느껴질 수 있지만, 상속은 상위클래스의 기능(함수, 변수)을 재사용한다.
- 위의 그림과 같이 다형성은 상위클래스의 기능을 변경하여 사용하는 것이다.(그대로 재사용하지 않는다.)
class Person:
def run(self):
print('run')
def play(self):
print('play')
class Student(Person):
def run(self):
print('fast run')
def play(self):
print('play')
class teacher(Person):
def teach(self):
print('teach')
def play(self):
print('teach play')
# 리스트를 생성한다.
number = list()
# 생성한 리스트에 다형성 개념을 위해 다른 클래스(Student, teacher)가 상위 클래스(Person)를 참조할 수 있도록 한다.
number.append(Student()) # 리스트 끝에 서브 클래스 Student()를 넣습니다.
number.append(teacher()) # 다시 리스트 끝에 서브 클래스 teacher()를 넣습니다.
print("=========")
for Student in number:
Student.run() # 상위클래스인 Person의 run은 상속하여 사용하지만 내용은 다르다.
print("=========")
for teacher in number:
teacher.play() # 상위클래스인 Person의 play는 상속하여 사용하지만 내용은 다르다.
728x90
'Programming' 카테고리의 다른 글
[1544번] 사이클단어 with python (0) | 2022.07.20 |
---|---|
[1358번] 하키 with python (0) | 2022.07.16 |
[1940번] 주몽 with python (0) | 2022.07.14 |
[1764번] 듣보잡 with python (0) | 2022.07.13 |