갬미의 성장일기
Day12 - Python OOP 본문
클래스 수업 ing~~
오늘 배운 내용
- OOP를 위한 class 기초
- 객체지향 3대(4대라고도 함)이론
class 기초
클래스 안에서 변수를 어느정도 공유할 수 있는지 확인
클래스 안에서 사용할 변수들은 __init__ 메서드에 지정해놓는다
이때 __init__ 메서드는 class를 인스턴스 할때 (객체를 만들때) 자동으로 실행되므로
객체 생성 시 변수를 지정해주어야 한다.
- 인스턴스 할 때 초기에 어떤 값을 가지고 시작하고 싶을 때 사용한다
#클래스 선언
class Calc:
total = 0 # 클래스 변수
def __init__(self, inputData1, inputData2):
#다른 메서드에서 접근 가능
self.data1 = inputData1 # 인스턴스 변수
self.data2 = inputData2 # 인스턴스 변수
def Plus(self):
tempData = self.data1 + self.data2
return tempData
result = Calc(20,511) # 인스턴스 할 때 초기값을 넣어줄 경우에 사용 : 인스턴스 변수에 할당해서 사용하는 것
d1 = result.total
k = result.data1
d2 = result.Plus()
total 과 data1,2 는 같은 초기자이다
대신 init에 들어가는 값은 인스턴스 시 지정해 주어야하며
이는 다른 메서드에서 자유롭게 사용이 가능하다 (인스턴스시 바로 실행되는 메서드이기 때문)
d1 == 0 ( 클래스 변수)
k == 20 ( 초기자 )
d2 == 531
객체지향 3대(4대) 이론
1. 정보은닉(은닉성)
2. 상속
3. 다형
1. 정보은닉
클래스 안에 있는 메서드와 변수를 권한이 있는 사람만 접근하는 것
Public(누구나), Private (나만), Protected (상속 받은 클래스만 접근)
: Python 에서는 무조건 Public이 기본이다
Private 메서드 - 이름, 클래스 변수, 인스턴스 변수 앞에 __ 할경우 Private
class CLSTest:
__data = 0
def __init__(self, name, age):
# 인스턴스 변수 : 주의점 파라미터의 변수를 그대로 사용하면서 self를 붙인다.
self.name = name
self.__age = age #인스턴스 변수 private 타입의 변수
def __Method1(self): # private 타입의 메서드
pass
result = CLSTest('홍길동', 20)
result2 = CLSTest(name='김바보', age=25) # 초기자 메서드이기 때문에 명명된 파라미터의 응용
#data1 = result.__age # 오류 : 정보 은닉
#result.__Method1() # 오류 : 정보 은닉
2. 상속
원본 클래스가 있고, 원본 클래스에서 기능을 추가할 때 사용
기본 클래스 - 부모 클래스
인스턴스 할때 파생(자식) 클래스를 인스턴스 하면 - 파생 클래스의 메서드 + 기본 클래스의 메서드를 모두 사용 가능함
# 상속 이론
class MyInfo:
def __init__(self, name, age):
self.name = name
self.age = age
def UserName(self):
return self.name
# 상속 - 클래스 이름뒤에 (부모 클래스 이름)
class ExtMyInfo(MyInfo): # 부모클래스(MyInfo)를 상속
def UserAge(self):
return self.age
class Ext2MyInfo(ExtMyInfo):
def __init__(self, name, age, year):
super().__init__(name, age) # 부모꺼 가져오는 예약어
self.year = year
def AfterAge(self):
return self.age + self.year
result = Ext2MyInfo('홍길동', 20, year = 3)
data1 = result.AfterAge()
print(data1)
3. 다형 : 메소드 오버라이드(오버라이딩)
원본 클래스와 자식 클래스가 있으면 메서드가 같은것으로 자식 클래스가 메서드를 덮어쓰는것
# 다형 : 메서드 오버라이드(오버라이딩)
class MyInfo:
def __init__(self, name):
self.name = name
def UserName(self):
return self.name
def UserAge(self):
pass
class ExtMyInfo(MyInfo):
# 메서드 오버라이드
def UserName(self): # 부모클래스의 메서드와 똑같은 이름, 파라미터도 똑같이 한 메서드
return self.name + '님' # 부모에서 return이 있었다면 다형에도 있어야 함 -> 위와 같은 결과임
def UserEmail(self):
pass
result1 = MyInfo('홀길동')
data1 = result1.UserName()
result2 = ExtMyInfo('홀길동')
data2 = result2.UserName()
data3 = result2.UserAge()
class 상속에서 super()란 무엇인가?
super()란 부모클래스를 의미한다
부모,자식 클래스에서 메서드 오버라이딩을 가장 조심해야하는 메서드는 __init__()이다
자식클래스에서 __init__으로 초기자를 생성할때 super()를 사용하지 않으면 부모 클래스의 __init__()는 자식 클래스의 __init__()에 의해 overriding(덮어쓰기)된다
자식 클래스에서 부모 클래스의 변수를 가져오고 싶다면
자식 클래스의 __init__() 메소드내에서 super().__init__()을 입력하면 Parent 클래스의 __init__()에 있는 클래스 변수들을 가지고 올 수 있다
👇 부모 클래스의 변수 가져오기
class Grand:
def __init__(self, name, age, contry, email):
self.name = name
self.age = age
self.contry = contry
self.email = email
def UserInfo(self):
info = self.contry + ' ' + str(self.age) + ' ' + self.name + ' ' + self.email
print(self.name, self.age, self.contry, self.email)
return info
def UserName(self):
return self.name
class Father(Grand):
def __init__(self, name, age, contry, email, phone):
Grand.__init__(self, name, age, contry, email)
self.phone = phone
def UserPhone(self):
print (self.name, self.age, self.contry, self.email, self.phone)
return self.phone
오늘의 회고
- 저번주에 수업을 들으면서 VScode로 디버하는 방법을 배웠는데 매번 print 찍어가며 변수 확인하던 나에게는 너무너무 신세계같다,, 습관적으로 사용해야겠다는 생각을 했다
- 마지막 1시간정도 간단한 과제를 내주셨는데 스스로 배운내용을 되짚으며 클래스를 구현하니 은근 어려우면서도 뿌듯했다
- 몇번을 들어도 모르겠었던 클래스를 더 깊게 이해하는 중이다 기쁘다
- 실무 관련 이야기를 종종 해주시는데 내가 실무에 나가도 되는거 맞나.,?하는 생각을 매번한다 열심히 해야겠다
- 내일은 자료구조에 대해 배운다 기대된다!
'Cloud > Cloud 공부일기' 카테고리의 다른 글
Day16 - Flask | 공공 API 사용하기 (0) | 2022.01.24 |
---|---|
Day15 - VScode 디버깅 구성추가 | 파일 읽고쓰기, 예외처리 (python) (2) | 2022.01.21 |
Day14 - Django (0) | 2022.01.20 |
Day13 - Python 주요 자료구조 (0) | 2022.01.20 |
Day 1~11 - 그동안 뭘 배웠는가?(Python 기초 ,Django) (0) | 2022.01.17 |