한 걸음씩 기록하며

#.9 객체지향 프로그래밍 (OOP) 본문

Python

#.9 객체지향 프로그래밍 (OOP)

Haksae 2021. 12. 22. 06:34

1. 객체지향 프로그래밍 (Object-Oriented Programming)

출처 : 이고잉 : 객체지향 프로그래밍 1

객체지향 프로그래밍은 좀 더 나은 프로그램을 만들기 위한 프로그래밍 패러다임으로 로직을 상태(state)와 행위(behave)로 이루어진 객체로 만드는 것이다. 즉 객체지향 프로그래밍은 객체를 만들고, 그것들로 하나의 프로그램을 만드는 것이다.
객체는 변수와 함수를 그룹핑한 것

 

객체지향은 컴퓨터 프로그래밍의 패러다임 중 하나 (절차 지향 프로그래밍도 있다)
패러다임이란 프로그래밍을 어떤 관점에서 해나갈 것인가에 대한 고민이다.
-> 기존 절차 지향 프로그래밍 언어들이 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나,
-> 데이터나 정보의 표현에 중점을 두어, 프로그램을 여러 개의 독립적인 단위, 즉 "객체"들의 모임으로 파악하는 것이 객체 지향 프로그래밍이다.

OOPs Vs Procedural Programming

출처 : c-sharpcorner

 

 

2. 객체 지향 프로그래밍의 특성

OOP의 특성은 크게 추상화, 캡슐화, 상속성, 다형성이 있다.

 

1) Abstraction(추상화)

  • 객체들에게서 공통되는 속성이나 기능을 묶어서 이름을 붙이는 것
  • 예를 들면, 호랑이, 사자, 거북이, 기린 이라는 객체를, 동물 혹은 생물이라는 추상적인 객체로 묶는 것을 의미한다.
  • 추상화는 이름을 잘 짓고, 설명(문서화)을 잘 달아 놓는게 매우 중요하다.
  • 추상화에 대해서 딥하게 고민하려면 다음 글을 읽어보면.. 좋..https://black7375.tistory.com/6

2) Encapsulation(캡슐화)

캡슐화는 객체의 속성, 메소드를 하나로 묶고, 실제 구현 내용을 외부로부터 감추는 것을 뜻한다. 자세히 풀면 아래와 같다.

(1) 캡슐화 : 묶기

  • 캡슐화는 일반적으로 연관 있는 변수와 함수를 묶는 것을 뜻한다.
  • 클래스를 작성할 때, 내부적인 세부사항을 캡슐화하는 것이 일반적이다. 
  • 문제는 파이썬에서 클래스와 객체의 거의 모든 것이 오픈되어 있다는 것이다. 이는 외부의 잘못된 사용으로 인해 객체가 손상되거나 노출될 위험에 놓이게될 수 있다는 것을 의미한다.
  • 이것을 위해 캡슐화는 은닉성(막기)이라는 것도 포함한다.

(2) 은닉성

  • 은닉성(infomation hiding)은 객체의 상세한 내용은 객체 외부로부터 숨기고 제한된 데이터와 메소드 만을 노출시켜 객체와 상호작용을 할 수 있도록 하는 것을 의미한다.
  • 파이썬에서 어떻게 은닉하는가? (private attribute)
    • 클래스 내부에 이름이 " _" 로 시작하는 속성이나 메서드는 관행적으로 private으로 약속하고 처리한다.
  • 1) Name mangling
    •  " _ _" 를 사용하면 해당 속성에 대한 클래스 외부의 접근을 차단할 수 있다..
    • 그러나 이 또한 바뀐 이름으로 접근이 가능하기에 완벽한 캡슐화는 아니다.
      class Mangling:
      
          def __init__(self, name, age):
              self.__set(name, age)
      
          def __set(self, name, age):
              self.__name = name
              self.__age = age
      
          def getname(self):
              return self.__name
      
          def getage(self):
              return self.__age
    • 2) Property
      • 위의 한계에 대한 더 나은 방법이 바로 property이다.
      • 메서드 위에 @property를 지정하면 함수명으로 하나의 인스턴스를 만들고, 그 내부의 getter 메서드에 등록된다.
      • 갱신이 필요하다면 @함수명.setter로 처리한다. 
      • 정의가 끝나면 이 클래스가 객체로 전환된다.
        class PropertyClass:
        
            def __init__(self, name):
                self._name = name
        
            @property
            def name(slef):
                return self._name
        
            @name.setter
            def name(self, value):
                self._name = value​

3) Inheritance(상속)

상속은 자식 클래스가 부모 클래스의 특성과 기능을 그대로 물려받는 것을 말한다. 하나의 크래릇가 가지고 있는 특징(데이터와 메서드)들을 그대로 다른 클래스에 물려주고자 할 때 사용한다.
  • 상속은 코드 중복을 줄여주고, 유지 보수의 편리성을 제공해준다.
  • 또한 객체의 다형성을 구현할 수 있게 해준다.

4) Polymorphism(다형성)

다형성은 같은 타입이지만, 실행 결과가 다양한 객체를 대입(이용)할 수 있는 성질을 말한다. 객체 지향 프로그래밍 언어에서는 하나의 클래스 내부에 같은 이름의 행위를 파라미터의 타입과 개수를 다르게 하여 여러개 정의하거나, 상위 클래스의 메소드를 재정의하여 사용할 수 있는 것을 다형성이라고 한다.
  • Overloading : 같은 이름의 메서드를 가지면서 파라미터의 유형과 개수를 다르도록 하는 기술 (Python에는 없다)
  • Overriding: 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용하는 기술

'Python' 카테고리의 다른 글

#.11 Class  (0) 2021.12.22
#.10 Object(객체)에 대하여  (0) 2021.12.22
#.8 Data Structure Method  (0) 2021.12.21
#.7 Data Structure : list, tuple, set, dict  (0) 2021.12.20
#.6 Function & Lambda  (0) 2021.12.20
Comments