데이터과학자 - 강의/python

210427 python day-08 : 클래스

vs질럿 2021. 4. 27. 20:27

강의목표

1. 클래스 생성 후 연동할 수 있다.
2. 클래스 멤버를 선언하고 생성자와 소멸자를 이해할 수 있다.
3. 클래스 선언 및 객체 생성, 멤버 호출을 실행할 수 있다.

 

============================================================================

OOP(객체 지향 프로그래밍)의 특징
  - 클래스  - 사용자 자료형 = 변수 + 메소드
    캡슐화  - 은닉된 멤버 변수에게 오픈된 메소드가 값을 전달 및 변경하는 구조


  - 상속     - 클래스의 기능을 확장, 선조 클래스가 1이면 단일상속, 1more(+)면 다중상속

    자손 클래스(this class) -----------> 선조 클래스(super class)
    선조가 가지고 있는 기능(메서드)이 자손에게 상속되면서 확장
    선조는 자손을 모르지만 자손은 선조를 알고 상속받는다
    # this : 현재 object를 지칭하는 연산자. python은 self


  - 다형성  - 다양한 형태의 성질로 이루어진 클래스의 동적 바인딩 구조

    다형성 = 추상화, 동적바인딩
    메소드 이름은 같은데 기능은 조금씩 다름, 리턴이 다름
    선조클래스는 자손들의 틀만 잡아준다 => 추상화

 

============================================================================

자료형선언 -> 객체 생성 -> 멤버 호출
[형식]
class 클래스이름 (상속 클래스명):
    <클래스 변수 선언>
def 클래스 함수(self, ...): -> 클래스 내부에 선언되는 매개인자는 첫번째 자리에 self
    <수행할 문장>

ex)
값을 받아서 저장하고 추가하는 클래스를 만들려고 한다.
값을 받아 저장하는 멤버를 가진 메소드를 empty()라고 하고 
값을 받아 추가하는 메소드를 add()라고 명명하게 설계하자
[step 01 자료형, 클래스 선언]

class Test:
    def empty(self):
        self.data = []
        
    def add(self, x):
        self.data.append(x)

 

[step 02 객체 생성]
Test클래스가 선언 및 정의가 되면 클래스 객체 생성을 통한 인스턴스를 만든다.
클래스변수 = 클래스명() # 생성자를 호출하면서 객체를 생성

class Test:
    def empty(self):
        self.data = []
        
    def add(self, x):
        self.data.append(x)
        
        
my01 = Test()
my02 = Test()

 

[step 03 멤버 호출]

class Test:          # object의 자손클래스가 되어 선조의 메소드들을 참조하고 있다. class Test(object):
    def empty(self):
        self.data = []
        
    def add(self, x):
        self.data.append(x)
        
        
my01 = Test()        # my01의 변수에 Test라는 클래스의 객체를 생성하게 되면 메모리에 Test클래스와 같은 자료형이
my02 = Test()        # 생성되어 메모리에 확보되고 확보된 주소가 my01 = 연산자를 통해 대입되어 참조된다.


my01.empty()
my02.empyt()

 

============================================================================

메소드에 지정하는 self의 의미
  - 클래스 내부에 선언하는 메소드의 매개인자는 첫번째 자리에 반드시 self
  - 모든 메소드는 최소한 self는 반드시 명시되어야하며 리턴되거나 매개인자로 대입받을 수 없다.
  - 객체를 통해서 호출되는 메소드의 self는 자동으로 객체 참조될 주소로 대입받는다.
  - self를 통해서 클래스의 멤버변수 or 메소드를 자유롭게 클래스 내부에서 호출할 수 있다.

 

============================================================================

클래스의 내장함수
  - 파이썬에서 사용되는 모든 클래스안에서 사용할 수 있는 특별한 메소드를 말한다.
  - 클래스의 내장함수는 크게 (생성자, 소멸자), 연산자 오버로드, 기본 자료형중 시퀀스자료형에서
    사용되는 인덱싱 관련함수 등의 세가지로 나뉜다.

생성자 : __init__(initialization) 객체가 인스턴스화 될 때 호출도는 특수 메소드
소멸자 : __del__(destructor) 인스턴스가 소멸될 때 호출되는 특수 메소드

# 생성자를 명시하지 않으면 자동으로 내부호출되어 생성되고 명시하게 되면 명시된 생성자가 호출된다.
# 생성자는 단 한번 객체를 생성할 때 자동 호출되며 해당클래스의 모든 멤버를 동적 할당 메모리로 로드하게 된다.
# 생성자의 목적은 멤버변수 초기화에 있다.
class MyDel:
    def __init__(self):  # 생성자
        print("__init__")

    def __del__(self):   # 소멸자 객체가 소멸되는 시점에서 호출되면서 리소스 해제
        print("__del__")


if __name__ == '__main__':
    a1 = MyDel()         # MyDel이라는 클래스를 생성자를 호출하면서 객체를 생성한다.
    
    
#result
__init__
__del__

 

============================================================================

번외

oop에서 접근제한자
private   - 비공개
protected  - 상속시 공개
public   - 공개
default   - 현재 패키지에서만 공개

ex)
class Test{
private int a // 비공개
}
Test t1 = new Test() -> t1.a 호출 불가능

파이썬은 표현이 다르다

__ : non-public, 기본은 public

# 정수형 변수 a를 관리하는 클래스를 만들어보자. 단, 캡슐화로 구현해보자.
# 캡슐화 : 은닉된 멤버 변수에 오픈된 메소드로 값을 전달(setXX) 및 변경하는 구조(getXX-return)
# 은닉된 멤버 변수에게 setXX으로 값 전달 및 변경하고 getXX return메소드로 리턴하는 구조
class Test():
    __a = 0  # 주소 히든 private

    def setA(self, a):   # 객체 생성 후 값을 a로 전달받아 멤버 __a에게 값 전달 및 변경
        self.__a = a  

    def getA(self):      # 객체 생성 후 a의 값을 요청받으면 return해서 알려줌
        return self.__a


if __name__ == '__main__':
    t1 = Test()
    print(t1.getA())
    t1.setA(100)
    print(t1.getA())


#result
0
100