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

jjooki-entist·2022년 9월 1일

💡 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개의 댓글