Python - OOP 개념 및 Class 정리 및 실습

David's Data Science·2021년 11월 24일
0

OOP(Object Oriented Programming)

Object(객체) Oriented(지향하는) Programming(프로그래밍)으로 나타낼 수 있는 OOP에 대한 정리.
객체지향이 어떤 것을 의미하고, 어떠한 특징을 갖는지 살펴본다.

프로그래밍 방식

절차지향:

절차지향이 객체지향과 반대되는 개념이라고 알고 있는 경우도 있지만 그렇지는 않다.
특정 문제를 해결하기 위해 작성된 대로 순차적으로 기능을 수행해 결과를 반환한다.
단적으로, 절차지향은 단지 순차적으로 작성되어 특정 부분의 기능을 사용하고 싶은 경우, 상위 단계의 기능이 불필요 하더라도 꼭 On 해줘야 사용할 수 있는 것을 의미한다.

구조적:

절차지향 프로그래밍을 개선한 것으로 문제 해결을 위해 문제를 작은 단위로 나누어 작은 문제들을 해결해 나가는 방식

객체지향:

추상적인 표현으로 현실 세상의 것을 컴퓨터와 연결시켰다고 표현하며, class, instance, method, variables 등의 객체(object)로 연결된다. 작은 문제들을 해결할 수 있는 기능(객체)들이 모여 최종적인 문제해결을 할 수 있는 객체를 만들어낸다.

각각의 객체(Object)들이 저마다의 기능들을 가지고 있으며, 객체들 간의 관계를 설계하여
기능들을 유기적으로 사용할 수 있다.

이전에는 속성과 기능이 증가할 때마다 배열(array) 및 함수(function)을 계속 생성해 관리에 비효율이 있었다면, OOP를 이용해서는 기존에 있던 기능을 수정하거나 손쉽게 추가할 수 있다.

OOP의 특성

Class의 캡슐화

내부속성(variables)와 함수(method) 등 여러 기능들이 객체(Object)내에 묶여 하나의 Class로 선언되는 개념. 구현 시에는 해당 부분들을 드러내지 않는다. 함수적 특징을 생각하면 된다.

class Person:
    def __init__(self, name, age):
        self.name = name
		self.age = age
        
person = Person('david', 30)
print(person.age) # Person 클래스의 인스턴스인 person의 age속성에 따로 기능구현을 하지 않았지만, 클래스의 기능이 역할을 하는것을 볼 수 있다. 

Class의 상속 / 포함

서브클래스(자식클래스)가 부모클래스(수퍼클래스)의 기능을 그대로 물려받아 이용하는 것. 말 그대로 부모의 기능을 자식이 상속받아 사용하는것.

포함의 개념은 전체를 모두 상속받는것이 아니라, 다른 클래스의 일부 기능을 재사용할 수 있다.

class person:
    def __init__(self, name):
        self.name = name
        
class Student(Person):      # Person 클래스 상속받음(name 변수를 파라미터로 재사용)
    def study(self):
        print (self.name + " studies hard")

class greeting:
	def __init

# 포함 
class Person:
  def __init__(self, name, age):
    self.name = name
    self.age = age
  
  def greeting(self):
    print(f'안녕하세요, {self.name}입니다')

class Student(Person):
  def __init__(self, name, age, studytime):
    Person.__init__(self, name, age)	# 완전히 받지 않고 인스턴스화
    Person.greeting(self)				# 기능 사용
    self.time = studytime				# Person의 속성이 아닌것도 사용
    print(f'하루 공부는 {self.time}시간 정도 합니다.')
stu = Student('david',30, 12)

Class의 다형성(Polymorphism) - Overiding

객체지향의 다형성은 여러 타입을 받아들일 수 있는 성질을 뜻한다. 상황에 따라 필요에 의한 형태로 사용을 해야하는데, 다형성은 그러한 점에서 강점을 갖고있다.

클래스의 개념에선 하위클래스의 형태에 따라 하위클래스에서 해당 상위클래스의 속성이나 메소드를 그대로 사용하지 않고 변형해서 사용할 수 있음을 나타내기도 한다.

파이썬으로 하위클래스에서 다형성을 이용해 상위클래스의 기능을 받아 변형해서 사용하는 것을 오버라이딩(overiding)이라한다.

class Person:
  def greeting(self):
    print("안녕!", end='')
  
class Student(Person):
  def greeting(self):
    print("안녕하십니까!", end='')
  
class Teacher(Person):
  def greeting(self):
    print("안녕 얘들아~")

stu = Student()
tea = Teacher()

stu.greeting()
[output]
안녕하십니까!
tea.greeting()
[output]
안녕 얘들아~

Class의 추상화

추상화란 말 그대로 추상적으로 의미만을 담고 내용이 따로 없는 것을 의미한다. 무슨말인지 이해가 잘 안될 수 있는데, 기능이 아예 없는 존재만하는 추상클래스에서 각각 그 하위 클래스들(형제 관계)이 상속을 받아 서로다른 기능을 작성해서 사용하는것. 보통 대규모 프로젝트에서 사용한다고 한다.

from abc import *    # abc 모듈의 클래스와 메소드를 갖고온다.(abc : abstract base class)

# 추상 클래스
class Car(metaclass=ABCMeta):  

# 추상 메소드
    @abstractmethod # 추상 클래스의 메소드에는 @abstractmethod를 선언해줘야 함
    def accelerate(self): 
        pass        # 기능 없음
# 상속받는 클래스
class Avante(Car):
    def accelerate(self, power):
        self.speed = power * 5
        print(f'vroong~ \ncurrent speed is {self.speed}km/h')

# 상속받는 클래스
class M5(Car):
    def accelerate(self, power):
        self.speed = power * 20
        print(f'vang!!! \ncurrent speed is {self.speed}km/h')
a = Avante()
b = M5()
a.accelerate(3)
b.accelerate(3)
[output]
vroong~ current speed is 15km/h
vang!!! current speed is 60km/h
profile
데이터 사이언티스트가 되고싶은 David입니다.

0개의 댓글