캡슐화 그리고 상속
Language/Python

캡슐화 그리고 상속

뉴비뉴 2020. 7. 2.

캡슐화(Encapsulation)

  • 클래스 내부에 모든 내용이 존재하고, 외부에서는 메소드를 이용하여 사용할 수 있습니다.
  • 추가로 은닉화(Protect, Private) 하고 싶은 자료들은 파이썬에서는 규칙을 정해 다루고 있습니다.
  • 아래 설명한 Behavior 를 이용해서만 접근이 가능합니다.

Object(객체) = Data + Behavior

  • Data: field, member variable, attribute
  • Behavior: method, member function, operation 

잠깐 정리해보겠습니다.

캡슐화란 외부와 통신할 수 있는 통로(함수, 메소드)를 열어주고, 내부적으로 은닉할 정보는 은닉합니다.

 

여기서 혼동할 수 있는 개념은 캡슐화(encapsulation)은닉화(information hiding)랑은 다르다는 것 입니다.

캡슐화와 은닉화를 합친 내용이 이 글에서 설명하는 것 입니다.

은닉화로 객체 내부의 중요한 정보를 은닉하고, 은닉한 데이터와 외부와 통신할 수 있는 메소드를 설정하는 것이 캡슐화 라고 보면 될 것 같습니다.

 

private ('only i can see')

protected

public ('many can see')

 

하지만 파이썬에서는 속성과 메서드가 전부 공개되어있기 때문에 속성을 숨길 방안이 없습니다.

 

__이름 

클래스 내부에 __ 가 있는 속성이나 메서드는 관행적으로 private 으로 약속하고 처리합니다.

이는 외부에서 보호된 이름으로 사용되기에 호출해서 사용하면 안됩니다. 하지만 어디까지나 약속이기 때문에 데이터를 수정할 수 있습니다.

 

C, Java 에서는 실제로 활용하여 Visibility 를 조절할 수 있습니다.

 

상속(Inheritance)

상속은 간단하게 '내가 갖고 있는 Attributes를 descendants(자식, 자손) 에게 준다' 라고 생각하면 됩니다.

여기서 말하는 Attributes는 Member variable, Methods 입니다. 오브젝트를 구현하고 있는 것들을 넘겨준다고 생각하시면 됩니다.

 

그렇다면 자식들은 부모에게 상속받은 것만 사용할 수 있는가?

 

그렇지 않습니다. 기본적으로 부모는 자식에게 모든 것을 제공합니다. 자식들은 새로운 것들을 만들고, 부모의 것을 수정(overriding) 하여 사용할 수 있습니다. 그리고 전부 다 상속받을 필요도 없습니다. 부모에게 물려받고 싶은 것들만 골라 물려받을 수 있습니다.

 

SuperClass

- 최상위의 클래스를 의미합니다.

SubClass(Specifically)

- 부모에게 물려받은 데이터와 본인이 스스로 생성한 데이터들이 존재합니다.

 

다른 언어와 차이점

자바에서는 여러 클래스를 다중으로 상속받을 수 없습니다.

C, Python 의 경우에는 여러 클래스를 다중으로 상속받을 수 있고, 어떤 순서로 상속을 하냐에 따라에 영향을 받습니다.

 

실습

class Father(object):  # object 란 파이썬에서 가장 최상위에있는 것, 하지만 아무것도 들어있지 않다.
    strHometown = "Jeju"
    def __init__(self):
    	print("Father is created")
    def doFatherThing(self):
    	print("Father's action")
    def doRunning(self):
    	print("Slow")
        
class Mother(object):
    strHometown = "seoul"
    def __init__(self):
    	print("Mother is created")
    def doMotherThing(self):
    	print("Mother's action")
        
class Child(Father, Mother):
    strName = "Moon"
    def __init__(self):
    	super(Child, self).__init__()
        print("Child is created")
    def doRunning(self):
    	print("Fast")

me = Child()
>>> Father is created
>>> Child is created

me.doFatherThing()
>>> Father's action
me.doMotherThing()
>>> Mother's action

me.doRunning()  # Father 에도 doRunning이 있지만 overriding 하였기에 child의 Fast가 출력
>>> Fast

print(me.strHometown)
>>> Jeju  # 상단에 있는 Jeju가 출력
print(me.strName)
>>> Moon
 

self and super

self 는 자기 자신을 의미합니다. self란 클래스의 인스턴스를 나타내는 변수입니다.

 

super 함수는 슈퍼클래스의 method를 호출하라는 의미입니다.

다수의 슈퍼 클래스가 존재 시 클래스 호출 순서의 결정은 __mor__를 통해 결정됩니다.

 

mor(Method Resolution Order)

This attribute is a tuple of classes that are considered when looking for base classes during method resolution.

 

아래 예시의 super는 Child(Father, Mother) 의 Father를 가리킨다.

Father의 __init__의 인자 paramHome 에 Child 가 입력받은 paramHome을 넘기는 것을 의미한다.

class Father(object):
    strHometown = "Jeju"
    def __init__(self, paramHome):
    	self.strHometown = paramHome
        print("Father is created")
    def doFatherThing(self):
    	print("Father's action")
    def doRunning(self):
    	print("Slow")

class Child(Father, Mother):
    strName = "cslee"
    def __init__(self, paramName, paramHome):  # me = Child("Sun", "Moon")
        super(Child, self).__init__(paramHome)  # super(Child) 는 Child(Father, Mother) 중에 Father로 이동
        self.strName = paramName  # 여기서 의미하는 strNmae은 class Child 안에 생성 된 strName을 paramName으로 변경
        print("Chile is created")
    def doRunning(self):
        print("Fast")
        
 
 me = Child("Sun", "Moon")
 >>> Father is created
 >>> Child is created
 me.doFatherThing()
 >>> Fahter's action
 me.doMotherThing()
 >>> Mother's action
 me.doRunnding()
 >>> Fast
 print(me.strHometown)
 >>> Moon
 print(me.strName)
 >>> Sun
 

 

Reference

- https://www.youtube.com/watch?v=7TybxSyxHq8&list=PLbhbGI_ppZIQZIq1HiPM2rIBa_ikf9FWD&index=14 

- https://kimdoky.github.io/python/2018/10/17/python-encapsulation/

 

 

댓글

💲 추천 글