알고리즘 _ 객체지향프로그래밍_ OOP란?(Python)
Programming

알고리즘 _ 객체지향프로그래밍_ OOP란?(Python)

728x90

객체지향프로그래밍 _ OOP(Object Oriented Programming)이란?

파이썬 프로그래밍의 큰 장점은 객체지향프로그래밍 OOP(Object Oriented Programming)라는 무기를 가지고 있기 때문이다. 

파이썬은 클래스라는 자료형을 이용해서 객체를 생성하고 인스턴스를 활용해서 다른 이름의 객체로 저장하는 시스템을 가지고 있다. 클래스를 얼마나 잘 다루는지를 보고 파이썬 실력을 평가할 때 기준이 되기도 한다.

  • OOP의 기본 전제는 기능(클래스, 함수, 변수)을 재사용이 가능하도록 설계 및 프로그래밍 했는지다.

OOP에 대한 의견

  • 중요한 것은 용어보다는, 현실에서 발생할 수 있는 특정 object를 컴퓨터라는 도구에 인식시키는 것이라 할 수 있다.
  • 대부분의 분야에서 OOP의 개념을 적용하여 프로그래밍을 수행한다.
  • 기본개념 : 설계(사람이 이해하는 방식)와 구현할 소스코드(컴퓨터가 이해하는 방식) 간의 상호이해가 중요하다.
    • HW&SW 성능증가(CPU성능 증가, 소프트웨어 다중실행) 덕분에 OOP의 모든 기능을 활용할 필요는 없다.
      • OOP의 개념을 무분별하게 활용하면 유지보수가 어려워질 수도 있기때문에 설계방향 및 서비스기능에 따라 사용해야 한다.
  • OOP의 어려운 점 :
    • OOP는 하나의 패러다임일 뿐이기 때문에 기존의 프로그래밍 패러다임(Procedural Programming, Functional Programming, ...)들과 우열을 가릴 필요는 없다.
    • OOP는 주관성이 높으므로, 보편적으로 활용되는 개념에 대해 배운다.(주관성이 높다는 뜻은 소프트웨어 서비스 설계방향에 영향을 많이 받는다.)
    • OOP를 제대로 하는 법은 프로그래밍뿐만 아니라 다양한 도메인에서 재사용 가능한 클래스, 메소드(기능) 설계가 중요하다.

객체 지향 프로그래밍의 장, 단점

- 장점

  • 코드 재사용이 용이 : 남이 만든 클래스를 가져와서 이용할 수 있고 상속을 통해 사용자가 확장해서 사용할 수 있다.
  • 유지보수가 쉬움 : 절차 지향 프로그래밍에서는 코드를 수정해야할 때 일일이 찾아 수정해야하는 반면 객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수혹은 메서드로 있기 때문에 해당 부분만 수정하면 된다.
  • 대형 프로젝트에 활용하기 편함 : 클래스단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트처럼 여러명, 여러회사에서 개발이 필요할 시 업무 분담하기 쉽다.

- 단점

  • 처리속도가 상대적으로 느릴 수 있다.
  • 객체가 많으면 불필요한 용량이 커질 수 있다.
  • 설계시 많은 시간과 노력이 필요하다.

OOP 개념을 활용하여 코드설계

코드설계에 단계를 두고 하나씩 확장하면서 설계전략을 세운다.

1단계

  • 코드 설계 시 사용할 object부터 적어보자.
  • Users
    • Customers
    • Vendors
    • Admin
  • Products
  • Purchases

 

2단계

  • 코드 작성 전, 각 object별로 요구되는 속성과 어떤 기능을 위해 생성되었는지 설계한다.
  • Users
    • Attributes(속성)
      • 이름
      • 사용자가 관리자인지?
    • Customers
      • Attributes
        • 이름
        • 구매목록
    • Vendors
      • Attributes
        • 이름
        • 상품목록
    • Admin
      • 이름
      • 사용자가 관리자임을 나타내는 구분값
  • Products
    • Attributes
      • 이름
      • 가격
      • 공급업체
  • Purchases
    • 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