갬미의 성장일기

Day12 - Python OOP 본문

Cloud/Cloud 공부일기

Day12 - Python OOP

갬미 2022. 1. 18. 23:45

클래스 수업 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시간정도 간단한 과제를 내주셨는데 스스로 배운내용을 되짚으며 클래스를 구현하니 은근 어려우면서도 뿌듯했다 
  • 몇번을 들어도 모르겠었던 클래스를 더 깊게 이해하는 중이다 기쁘다
  • 실무 관련 이야기를 종종 해주시는데 내가 실무에 나가도 되는거 맞나.,?하는 생각을 매번한다 열심히 해야겠다
  • 내일은 자료구조에 대해 배운다 기대된다!
Comments