[TIL] 파이썬 - 객체지향적 프로그래밍( 추상화, 캡슐화 )

hyo_·2021년 4월 19일
1

python

목록 보기
1/5
post-thumbnail

주절주절..🤔

학교에서 자바를 배우면서도 객체를 제대로 이해하지 못하고 넘어갔던 것이 너무 답답했는지,, 휴학하면서 객체,클래스 등등.. 객체지향적 프로그래밍 공부에 빠져버렸..다죠

  • 객체란?
  • 클래스는?
  • 추상화, 캡슐화, 상속, 다형성..?
  • solid??..
  • 그래서 객체지향적 프로그래밍의 장점이 뭔데..?

다 배워놓고도 이거 말해봐!하면 하나도 말 못하는 그런상황.. 그땐 왜 이 내용들이 이어지는게 아닌 각각 다른 내용으로 보였는지ㅠㅠ
쨋든, 자바에서 객체지향적 개념을 다시 이해하고 이제 파이썬을 하게되었는데 또 내 눈에 들어오는건 객체지향? 이번엔 파이썬에서 추상화, 캡슐화를 어떻게 나타내는지 알아보자.


👋 간단한 용어 정리

추상화(abstraction)

  • 몰라도 되는 정보는 가리고! 꼭 알아야 되는 정보만 나타내자

캡슐화(encapsulation)

  1. 객체의 일부 구현 내용을 외부 접근으로 부터 막자
  2. 객체의 속성과 행동을 하나로 묶자

📌 추상화

변수, 함수, 클래스의 사용도 추상화 방법
⇨ 변수의 값을 알지 못하여도 변수는 사용할 수 있다.

리스트( 개발자들이 미리 만들어 놓은 클래스 )
⇨ 리스트의 내부 코드를 몰라도 사용가능 하다.

이런게 추상화다.

🔥 추상화 잘하는 법

  • 이름 잘 짓기

    잘 지어진 클래스 이름은 이름만 보고도 직관적으로 어디에 쓰이는지 어떻게 사용해야 할지 등을 유추할 수 있다.
  • 문서화 하기 - docstring ( documentation string)

    클래스, 메소드, 변수 등에 설명 부여하기
    파이썬에서는 docstring을 사용하여 문서화 할 수 있다.( 클래스나 메소드가 어떤 역할을 하는지, return 값 등을 설명 )

작성 방법
class or 함수 선언부 바로 밑에 작성

class Student
    """
    클래스 설명
    """
    def __init__(self, name, number):
    	"""
        함수 설명
        """

이름을 잘 짓거나, 문서화를 잘 해놓으면 협업 할 때도 👍


캡슐화

위에서 말했듯이 캡슐화는 두 가지 역할이 있는데 각각 파이썬에서 어떻게 해결하는지 알아보자.

✔️ 객체의 일부 구현 내용을 외부 접근으로 부터 막자

1. 변수나 메소드 앞에 _ 두 개를 붙이면 외부에서 접근 불가

ex) __count , __sum(self, number1, number2)

🙅🏼‍♀️ 단, __str__의 경우 특수 메소드이기 때문에 외부에서 접근 가능 (특수 메소드는 앞뒤로 __를 붙임)

but!!

위 방법은 네임 맹글링(Name mangling)으로 완벽한 캡슐화 방법은 아니다.

네임 맹글링 방식은 속성의 이름이 _클래스이름__속성명이렇게 바뀌게 된다. 원래 이름으로 접근 불가능해질 뿐 바뀐 이름으로 접근 가능하기 때문에 완벽한 캡슐화라곤 할 수 없다.

파이썬에서는 자바만큼 캡슐화를 무조건 해야해! 는 아니라고 한다. 자바처럼 private 접근지정자가 있는 것은 아니지만 파이썬에서도 private 하게 만드는 방법이 있다. 변수이름 앞에 _ 하나를 붙이는 것이다. 저렇게 생긴 속성들은 개발자들 사이에서 private 하게 간주된다고 한다. ( 문법적으로 막아주는 것은 아니다. )

ex) _count

이렇게 변수에 직접 접근하지 못하게 만들면 값을 어떻게 세팅하고 얻어야 할까??

여기서 바로 캡슐화의 두 번째 역할이 나타난다.

✔️ 객체의 속성과 행동을 하나로 묶자

변수에 직접 접근이 불가능하니 getter, setter 등 함수를 사용하여 접근한다.
🙌 이것이 바로 객체의 속성과 행동을 하나로 묶는 일
( 모든 속성이 getter,setter 함수가 필요한 것은 x ➡️ 주민등록 번호 처럼 막 변경하거나 가져오면 안되는 정보들도 있다.)

ex)	
class Student:
	def __init__(self, name, number):
		self._name = name
		self._number = number
            
 	def get_name(self):
		return self._name
        
	def set_name(self, name):
		self._name = name
        
	def get_number(self):
		return self._number
        
	def set_number(self, number):
		self._number = number


student = Student("민지", 13)
print(student.get_name())
print(student.get_number())
  • 출력 결과

이러한 방식은 캡슐화가 안되어 있던 변수를 중간에 캡슐화하게 되면 변수에 직접 접근 했던 부분들을 전부 수정해야 한다. 이 부분을 개선하기 위해 @property@필드명.setter 데코레이터를 사용한다.
두 데코레이터를 사용할 경우 변수에 직접 접근 했던 부분들을(student.name, student.number) 수정하지 않고 getter setter 함수 사용이 가능하다. ( 함수명은 필드명과 같게 한다. )

ex)	
class Student:
    def __init__(self, name, number):
        self._name = name
        self._number = number

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, name):
        self._name = name

    @property
    def number(self):
        return self._number

    @number.setter
    def number(self, number):
        self._number = number


student = Student("민지", 13)
print(student.name)
print(student.number)
  • 출력 결과

위, 아래 동일한 결과를 얻을 수 있다.

파이썬 vs 자바

추상화는 자바와 docstring 부분 말고는 차이가 없었지만, 캡슐화의 경우 접근 지정자를 사용하지 않는 것이 좀 생소했다. 하지만 결론적으로 둘 다 캡슐화, 추상화의 의미는 같은 것 같다! 다음엔 상속과 다형성에 대해 정리해봐야 겠다.

profile
🎓의지적인 삶을 살자!😊

0개의 댓글