OOP (Object-Oriented-Programming)

Dev_Honey·2022년 6월 15일
0
post-thumbnail

OOP(Object-Oriented-Programing)

  • OOP(객체 지향 프로그래밍)이란 ?
    문제를 여러 개의 객체 단위로 나눠 작업하는 방식으로, 객체들이 서로 유기적으로 상호작용하는 프로그래밍 이론이다.
    대표적으로 Java, Python이 있다.

객체(Object) : 세상에 존재하는 모든 것, 프로그래밍에서의 객체는 데이터의 분산을 막기 위해 데이터와 기능을 하나로 묶은 그룹

[OOP]코드 재사용성생산성의 향상 효과를 볼 수 있고, 유지보수의 편의성 덕택에 협업이 중요하고 규모가 큰 대형 프로젝트에 사용되는 프로그래밍 이론이다.


OOP의 장점과 단점

장점

  • 코드 재사용성 증가
    상속을 통해 프로그래밍시 코드의 재사용을 높일 수 있다.

  • 생산성 향상
    잘 설계된 클래스를 만들어서 독립적인 객체를 사용함으로써 개발의 생산성을 향상시킬 수 있다.

  • 자연적인 모델링
    우리 일상생활의 모습의 구조가 객체에 자연스럽게 녹아들어 있기 때문에 생각하고 있는 것을 그대로 자연스럽게 구현할 수 있다.

  • 유지보수의 우수성
    프로그램 수정시 추가, 수정을 하더라도 캡슐화를 통해 주변 영향이 적기때문에 유지보수가 쉬워서 매우 경제적이라할 수 있다.

단점

  • 개발속도가 느린점
    객체가 처리하려는 것에 대한 정확한 이해가 필요하기에 설계단계부터 많은 시간이 소모 된다.

  • 실행속도가 느린점
    객체지향언어는 대체적으로 실행속도가 느리다.

  • 코딩 난이도 상승
    다중 상속이 지원되는 C++ 같은 경우에 너무 복잡해져 코딩의 난이도가 상승할 수 있다.


OOP의 특징

객체 지향 프로그래밍의 가장 큰 특징은 클래스를 이용해 연관 있는 처리 부분(함수)데이터 부분(변수)하나의 객체(인스턴스)로 묶어 생성해 사용한다는 점이다.

객체 지향 프로그래밍은 캡슐화, 추상화, 상속성, 다형성 네 가지 특성을 지닌다.


캡슐화 (Encapsulation)

캡슐화란 데이터와 코드의 형태를 외부로부터 알 수 없게하고, 데이터의 구조와 역할, 기능을 하나의 캡슐형태로 만드는 방법이다.

캡슐화의 중요한 목적은 변수를 private로 선언하여 데이터를 보호하고, 보호된 변수는 gettersetter등의 메서드를 통해서만 간접적으로 접근을 허용하는 것 이다.

캡슐화를 하면 불필요한 정보를 감출 수 있기 때문에, 정보은닉을 할 수 있다는 특징이 있다.
캡슐화와 정보은닉은 동일한 개념은 아니다.

Class의 캡슐화(python)

내부속성(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속성
에 따로 기능구현을 하지 않았지만, 클래스의 기능이 역할을 하는 것을 볼 수 있다. 

추상화 (Abstraction)

추상화는 객체의 공통적인 속성과 기능을 추출하여 정의하는 것을 말한다.

다시 말해 실제로 존재하는 객체들을 프로그램으로 만들기 위해 공통 특성을 파악해 필요없는 특성을 제거하는 과정을 가르킨다.

객체들은 실제 그 모습이지만, 클래스는 객체들이 어떤 특징들이 있어야 한다고 정의하는 추상화된 개념이다.
즉, 추상화는 객체들의 공통된 특징을 파악해 정의해 놓은 설계 기법이라 할 수 있다.

Class의 추상화(python)

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

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

상속(Inheritance)

상속이란 기존 상위클래스에 기능을 가져와 재사용할 수 있으면서도 동시에 새로운 하위 클래스에 새로운 기능도 추가할 수 있는 것이다.

즉, 부모가 자식에게 유전자를 물려주듯이 부모의 특징을 자식에게 모두 물려준다.

OOP에서 이를 부모 클래스, 자식 클래스라고 표현한다.

상속이 필요한 이유는 코드의 중복을 없애기 위해서다.

코드의 중복이 많아지면 개발 단계와 유지 보수에서 많은 비용이 들게 된다.

상속관계를 맺으면 자식 객체를 생성할 때 부모 클래스의 속성들을 자동으로 물려받기 때문에 자식 클래스에서 또 정의할 필요가 없다.

Class의 상속 / 포함(python)

서브클래스(자식클래스)가 부모클래스(수퍼클래스)의 기능을 그대로 물려받아 이용하는 것. 말 그대로 부모의 기능을 자식이 상속받아 사용하는것.
포함의 개념은 전체를 모두 상속받는것이 아니라, 다른 클래스의 일부 기능을 재사용할 수 있다.

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)

다형성(Polymorphism)

다형성이란 상속과 연관있는 개념으로 한 객체가 상속을 통해 기능을 확장하거나 변경하여 다른 여러형태(객체)로 재구성 되는 것을 말한다.

쉽게 말하면 한 부모의 밑에서 태어난 자식들이 조금씩 다르다는 것이다.

오버로드(Overload) 또는 오버라이드(Override)가 다형성의 대표적인 예라 할 수있고, 이것을 구현하는 걸 오버로딩(Overloading)오버라이딩(Overriding)이라고 한다.

간단하게 설명하자면,

오버라이딩은 하위 클래스(자식)가 상위 클래스(부모)에서 만들어진 메서드를 자신의 입맛대로 다시 재창조해서 사용하는 것을 말한다.

오버로딩은 하나의 클래스 안에서 같은 이름의 메서드를 사용하지만 각 메서드마다 다른 용도로 사용되며 그 결과물다르게 구현하는 것을 말한다.

오버로딩이 가능하려면 메서드끼리 이름은 같지만 매개변수의 개수나 데이터 타입이 달라야 한다.

다형성을 사용하면 같은 이름의 속성을 유지함으로서, 속성을 사용하기 위한 인터페이스를 유지하고, 메서드 이름을 낭비하지 않는다.

API가 많아질수록 복잡성은 증가하기 때문에 다형성은 유용하며 코드 재사용성을 늘려주어 유지보수가 용이하도록 도와주는 개념이다.

Class의 다형성(Polymorphism) - Overiding (python)

객체지향의 다형성은 여러 타입을 받아들일 수 있는 성질을 뜻한다. 상황에 따라 필요에 의한 형태로 사용을 해야하는데, 다형성은 그러한 점에서 강점을 갖고있다.
클래스의 개념에선 하위클래스의 형태에 따라 하위클래스에서 해당 상위클래스의 속성이나 메소드를 그대로 사용하지 않고 변형해서 사용할 수 있음을 나타내기도 한다.
파이썬으로 하위클래스에서 다형성을 이용해 상위클래스의 기능을 받아 변형해서 사용하는 것을 오버라이딩(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]
안녕 얘들아~

Summary

OOP는 위 네 가지 특성들을 통해서 어떤 대상을 추상화(Abstraction)하여 공통점을 찾고, 그것을 캡슐화(Encapsulation)해 한 군데에 모아 객체를 만들고, 새로운 객체가 상속(Inheritance)받아 재사용이 가능하게 만들어 준다.
상속받은 객체는 다형성(Polymorphism)을 통해 기능을 수정 또는 추가하여 재사용할 수 있다.


참고

https://velog.io/@gillog/OOP%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

https://velog.io/@dlskawns/Python-OOP-%EA%B0%9C%EB%85%90-%EB%B0%8F-Class-%EC%A0%95%EB%A6%AC-%EB%B0%8F-%EC%8B%A4%EC%8A%B5

profile
자습서 같은 공부 블로그 만들기!

0개의 댓글