본문 바로가기
Python

class

by oncerun 2023. 5. 5.
반응형

 

파이썬은 객체지향 프로그래밍을 지원한다.

 

이를 위해 잠시 객체지향에 대해 매우 짧게 정리하고 파이썬이 이를 위해 어떤 도구를 제공해 주고 이에 대한 문법을 알아보자.

 

객체지향

 

객체지향 프로그래밍에 대해 어떻게 정의를 내릴까?

 

아무것도 몰랐을 때 객체지향은 실세계를 반영하여 복잡한 구조를 현실적으로 쉽고 사람에 이해의 기반하여 유지보수하기 쉽고 실용성 있게 개발하기 위한 방법론이라고 공부했던 기억이 있고 이후 객체지향의 특징과 각 언어마다 제공해 주는 특징을 익히기 바빴다. 

 

이제 와서 다시 생각해 보니 위 설명은 너무나도 추상적이다. 

 

그렇다 객체지향은 매우 추상적 투성이었다. 현실세계를 소프트웨어 세계로 투영한다는 것 자체가 말이 안 된다. 

 

현실세계는 더욱 복잡하고 이를 한계가 있는 기술인 소프트웨어로 설계하기 위해선  몇 몇 타협이 필요했고 이를 위해 현실에는 존재하지 않는 특별한 소프트웨어 전용 객체들이 필요하기도 했다. 

원하는 방향의 특정 도메인이 아무도 개척하지 않은 길이라면 이는 더욱더 어려워질 것이다. 

 

객체지향은 말 그대로 객체를 지향한다는 말이다. 우리 프로그램에서 매우 중요한 역할을 정하고 추상화를 통해 정하고 이러한 역할을 기반으로 객체를 만들며 그 객체는 역할에 대한 책임을 가지고 있고 이렇게 정해진  객체들 간의 상호 협력적인 행동을 정하고 객체 내부는 감추며 필요한 인터페이스만 노출함으로 인해 캡슐화를 지키면서 지속적으로 확장이 가능하도록 프로그래밍하는 것이 아주 간단한 정의가 아닐까 싶다. 

 

 

프로토타입, 클래스 기반 등 객체지향을 사실 구현에 도움을 주는건 다양하더라. 클래스만 보았던 내게 자바스크립트의 프로토타입 기반 객체지향은 매우 새로웠기도 하다.  

 

파이썬은 그 중 클래스를 제공하는 것으로 보인다. 

 

구분 형식은 다음과 같다.

 

class name:
    __init__

 

__init__이 정말 맘에 안 든다. 자바스크립트의 __proto__와 같은 느낌이라서 그렇다.

이 명명법이 고정이라는 것이 좀 그렇다.

 

그리고 모든 메서드에 첫 번째 매개변수에 self라는 객체의 자신을 참조하는 매개변수를 반드시 사용해야 한다.

 

PEP 8 권장사항에는 클래스의 앞글자는 대문자를 권장한다.

 

예제로 원뿔에대한 클래스를 만들어 보자.

 

class Cone : 
  def __init__(self, radius = 20, height = 30) :
    self.r = raidus
    self.h = height


  def getVolume(self) :
    return 1/3 * 3.14 * self.r ** 2 * self.h

  def getSurf(self) :
    return 3.14 * self.r ** 2 + 3.14 * self.r * self.h

 

근데 인스턴스를 어떻게 만들지? 

 

class Cone : 
  def __init__(self, radius = 20, height = 30) :
    self.r = radius
    self.h = height

  def getVolume(self) :
    return 1/3 * 3.14 * self.r ** 2 * self.h

  def getSurf(self) :
    return 3.14 * self.r ** 2 + 3.14 * self.r * self.h


cone = Cone(20, 30)

print(cone.getVolume())
print(cone.getSurf())

 

파이썬이 복잡한 애플리케이션을 만드는데 한계가 있다고 알고 있는데, 그렇다면 목적에 따라 함수형 프로그래밍이나 절차형으로 작성해도 될 것 같다.

 

객체를 사용하는 것도 멤버 접근 연산자인 도트를 사용한다. 

 

캡슐화는 어떻게 진행해야 할까?

 

__를 적어주면 이는 private 데이터 필드로 변경된다고 한다. 

class Cone : 
  def __init__(self, radius = 20, height = 30) :
    self.__r = radius
    self.__h = height

  def getVolume(self) :
    return 1/3 * 3.14 * self.__r ** 2 * self.__h

  def getSurf(self) :
    return 3.14 * self.__r ** 2 + 3.14 * self.__r * self.__h

그러면 setter와 getter는 없나? 

 

class Cone : 
  def __init__(self, radius = 20, height = 30) :
    self.__r = radius
    self.__h = height

  def getVolume(self) :
    return 1/3 * 3.14 * self.__r ** 2 * self.__h

  def getSurf(self) :
    return 3.14 * self.__r ** 2 + 3.14 * self.__r * self.__h

  def getRadius(self) :
    return self.__r
  def setRadius(self, radius) :
    if (radius > 0) :
      self.__r = radius

  
cone = Cone(30, 22)

print(cone.getRadius())
cone.setRadius(3)
print(cone.getRadius())

 

 

 

 

다음과 같은 코드를 실행해 보자.

number = 20

type(number)

id(number)

객체네? 

 

기본 타입이라고 생각했던 것도 전부 객체라는 점도 알아가자

 

 

반응형

'Python' 카테고리의 다른 글

Module  (0) 2023.05.05
function  (0) 2023.05.05
Python  (0) 2023.04.24

댓글