[Week2] (파이썬 프로그래밍) 06. OOP(객체지향 프로그래밍)

jjooki-entist·2022년 9월 1일
0

💡 OOP : Object-Oriented Programming의 약자로 객체(Object)를 기반으로 프로그램을 만드는 방법론.

Source : https://velog.io/@gil0127/Object-Oriented-Programming-in-Javascript

  • OOP는 실제 세상을 표현하고 있는, 여러가지 개념들을 프로그램으로 옮겨서 구현할 수 있기 위한 컨셉의 프로그래밍 패러다임(paradigm)
    개념의 추상화(abstraction)

  • 객체(object)라는 개념은 실제 사물 하나하나를 의미할 수 있고, 이러한 사물들이 공유하는 속성을 정의한 것을 클래스(Class)이다.

  • 기존 방식은 데이터(변수, variable)와 데이터를 처리하는 기능(함수, function)이 독립적이었지만, OOP는 이를 하나의 개념(Class)로 묶어서 생각하기 때문에 그 객체가 처리되는 기능을 자연스럽게 정의할 수 있다.

  • Class에는 Class를 기술하는 정보를 나타내는 변수인 Class variable과 Class의 특징을 설명하는 기능인 Class method를 포함한다.

  • 추상적인 개념 Class를 실제로 사용하려면 하나 하나의 개별 사물로 만들어야 하는데, 이를 개별 사물인 객체(object)라고 한다.
    개념의 구체화(instantiation)

  • 위와 같은 개념을 살려 프로그램을 만드는 방식은 OOP의 장점은 다음과 같습니다.

    1. 클래스 구조를 잘 설계하면 라이브러리 형태로 재사용 용이
      생산성 향상
    2. 일상 생활에 존재하는 개념을 그대로 프로그램에 구현 가능
      자연적인 모델링
    3. 클래스의 상속의 개념 때문에, 프로그래밍 자체의 재사용성 극대화
      재사용성 증가
    4. OOP를 이용하여 개발을 하게되면, 다른 기능을 수정하더라도 클래스가 서로 다르게 구현되어 있어 다른 기능에 끼치는 영향 감소
      유지보수 용이성 증가

1. Inheritance(상속)

Source : https://masterdotnet.com/csharptutorial/csharpinheritance/

  • 클래스는 개념의 추상화이기 때문에, 해당 개념을 계승하는 하위 개념을 만들 수 있다.

  • 상위/하위 개념이 상대적으로 존재하며, 상속하는 클래스는 superclass, 상속받는 클래스는 subclass라고 얘기합니다.

  • subclass는 superclass의 모든 개념을 이어받기 때문에, class variable, class method도 그대로 이어받는다.

코드형식

# Superclass
class Parent:
	<statement>

# Subclass
class Child(Parent):
	<statement>

2. polymorphism(다형성)

Source : https://codegym.cc/groups/posts/polymorphism-in-java

  • 여러 하위 클래스가 같은 class method를 상속받게 되면, 그 기능을 다르게 구현할 수 있다.
  • 예를 들어 Animal 이라는 Class에 Speak()이라는 method가 있다면, 이 기능은 다른 동물을 표현하는 subclass들마다 다르게 구현될 수 있다.
    → Dog : “Woof” , Cat : “Meow” , Cow : “Moo”
  • 이렇게 하나의 기능을 나타내는 개념이 실제 구현해서 다양한 형태로 표현 가능한 것이 Polymorphism이다.
  • 이러한 다형성을 구현할 수 있는 기능을 Method Overriding 라고 한다.

사용예시

class Animal:
	def crying(self):
    	pass
        
class Dog(Parent):
	def crying(self):  # Override
    	return "Woof"

class Cat(Parent):
	def crying(self):  # Override
    	return "Meow"

Inheritance vs Polymorphism

  • 상속과 다형성은 superclass를 활용한다는 점에서 유사하다.
  • 하지만, 둘의 결정적인 차이는 Override에 있다.
  • 상속은 단지 superclass의 메소드를 그대로 넘겨받은 후 거기에 다른 메소드들을 추가하는 것이고, 다형성은 superclass의 메소드 자체를 subclass에 맞게 수정하여 사용한다는 점이다.
  • 다음 예시를 보며 그 차이를 이해해보자.
class Country:
    #Super Class

    name = '국가명'
    population = '인구'
    capital = '수도'

    def show(self):
        print('국가 클래스의 메소드입니다.')
        
    def show_capital(self):
    	print(capital)


class Korea(Country):
    """Sub Class"""

    def __init__(self, name):
        self.name = name

	def show_capital(self):  # Override
    	self.capital = '서울'
        print(f"{self.name}의 수도는 {self.capital}입니다.")

    def show_name(self):
        print(f"국가 이름은 {self.name}입니다.")
        
a = Korea('대한민국')
a.show() # superclass의 메소드 호출 -> 상속
>>> 국가 클래스의 메소드입니다.

a.show_name() # class 메소드 호출
>>> 국가 이름은 대한민국입니다.

a.capital  # superclass 변수 -> 상속
>>> '수도'

a.show_capital()  # 다형성
>>> 대한민국의 수도는 서울입니다.

a.capital
>>> '서울'
  • a.captial 변수가 처음 '수도'로 출력된 점은 수퍼클래스의 변수를 그대로 이어받았기 때문에 상속의 예시가 된다.
  • 반면, a.capital 변수가 show_capital() 메소드를 거치고 나서 '서울'이 된 점은 override된 메소드를 통과해서 바뀌었기 때문이다. 이는 다형성의 예시이다.

3. Abstraction(추상화)

  • Abstraction(추상화)는 Class 내부에 구현된 Class variable이나 Class method를 직접 보지 않아도 개념상으로 사용할 수 있게 하는 개념이다.
  • 기능에 대한 명세나 변수의 의미만 확실하게 알면, 내부 구현은 살펴보지 않아도 된다.

4. Encapsulation(은닉화)

Source : https://medium.com/javarevisited/why-should-encapsulation-to-be-used-e82a81f5c47c

  • Encapsulation은 Class variable과 Class method까지 단일 개념으로 구성되어 있어, 사용자가 개념 구현의 혼선을 막고 심플하게 사용할 수 있게 만드는 특징을 말합니다.
  • Encapsulation이 잘되면 사용자는 Class의 내부 구현 코드를 보지 않아도 내부 데이터와 기능을 사용하는데 아무런 문제가 없습니다.
  • 우리가 사용해왔던 모든 함수들, Data type들의 내부 구현 코드를 보지 않아도 개념적으로 이해하고 사용할 수 있는 이유도 Encapsulation이 잘되기 때문입니다.
    • 예시 : List.append(), Dict.keys()
    • 많이 활용되는 library들의 method들이 은닉화가 잘 된 예시들이다.
    • 따라서, 많은 라이브러리들을 사용해보면서 단순명료한 코드를 짜도록 학습하고 노력해보자!

Key Points

  1. OOP는 대규모 코드의 유지/보수를 편리하게 하기 위해서 생긴 프로그래밍 방법론입니다.
  2. OOP는 구현하고자 하는 대상을 Class로 정의하여 코드를 구현할 수 있게 해줍니다.
  3. 다양한 특징들이 Class를 통해서 구현된 코드가 재사용되기 편하게 해줍니다.
  4. 이러한 이유로 잘 만들어진 open-source library들을 손쉽게 이용할 수 있습니다.
profile
데이터 사이언티스트를 꿈꾸는 3년차 제품총괄입니다.

0개의 댓글