210427 python day-08 : 클래스
강의목표
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