now is better than never

[easyupclass] 초심자를 위한 빅데이터 분석 및 머신러닝 응용과정(파이썬) 13강 ~ 14강 - 클래스, 상속 1 본문

Python/초심자를 위한 빅데이터 분석 및 머신러닝 응용과정

[easyupclass] 초심자를 위한 빅데이터 분석 및 머신러닝 응용과정(파이썬) 13강 ~ 14강 - 클래스, 상속 1

김초송 2022. 10. 22. 00:38

Class

- 변수와 함수를 묶어놓은 개념

- 클래스와 선언

- 변수와 함수를 클래스 안에서 선언

- 클래스를 객체로 만들어서 클래스 안의 변수와 함수를 사용

 

Basic class

1. Class 선언

- class 안에 여러 개 함수 선언하고 필요할 때마다 호출

- 객체 지향 = 모든 것을 변수화

- 함수명은 CamelCase(대문자 구분)로 작성

- 클래스 안에서 선언한 변수는 local 변수

 

- 변수 = 클래스()

    -> 클래스 인스턴스화: 새로운 변수에 클래스를 담아두는 것

- .을 통해 클래스의 변수, 메소드에 접근해서 사용

 

2. Self

- 객체 자신

- 어떤 변수에 클래스가 선언되면 호출되는 함수들의 self는 모두 변수로 바뀜!

 

3. 생성자, 소멸자

- 클래스의 인스턴스 객체가 생성/소멸될 때 자동으로 호출되는 메소드, 선언과 동시에 실행됨

- 생성자: __init__(self)

- 소멸자: __del__(self)

class Account:
    
    def __init__(self):
        self.loan = 0
        self.deposit = 0
        print("계좌가 개설되었습니다.")
    
    def save(self, money):
        self.deposit += money
        print("현재 계좌 잔액은 {}원 입니다.".format(self.deposit))
        
    def withdraw(self, money):
        self.deposit -= money
        print("인출 금액은 {}원 입니다. 현재 계좌 잔액은 {}원 입니다.".format(money, self.deposit))
              
    def debt(self, d_money):
        self.deposit += d_money
        self.credit_debt = d_money + self.loan
        return -int(self.credit_debt)
    
    # 인스턴스화한 변수가 삭제되는 순간 실행
    def __del__(self):
        print("계좌가 해지되었습니다. 이용해주셔서 감사합니다.")
        
acc3 = Account()
# 계좌가 개설되었습니다 출력

del acc3
# 계좌 해지~

 

 

Class 상속

- 상속 : 상위 클래스의 모든 내용을 그대로 가지고 와서 개량

- 클래스가 가지고 있는 멤버나 메소드를 상속받는 클래스가 모두 사용

- 상속을 해주는 클래스 = 부모 클래스 = 슈퍼 클래스

- 상속을 받는 클래스 = 자식 클래스 = 서브 클래스

 

1. 부모 클래스로 상속받기

- class 자식 클래스(부모 클래스)

class Stock(Account):
	pass
    
stock = Stock()
# 계좌가 개설되었습니다 출력

 

2. Overiding

- 부모로부터 상속받은 클래스의 기능들을 수정하거나 대체

class Stock(Account):

    # 새로운 기능 추가
    def trading(self, buy, sell):
        self.deposit -= buy
        self.deposit += sell
        if buy and not sell:
            print("매수 금액 : {}원. 현재 계좌 잔액 : {}원".format(buy, self.deposit))
        else:
            print("매도 금액 : {}원. 현재 계좌 잔액 : {}원".format(sell, self.deposit))

 

- __init__(self, parameter)

   -> 클래스가 객체로 생성될 때 파라미터를 설정하면 생성 시 argument를 넣어 생성할 수 있음

- 생성자에서 파라미터를 설정했다면 반드시 객체화할 때 argument 넣어야 함 (아니면 defaul 값 설정해야 함)

class Employee:
    mileage = 0
    rate = round(1/15,2)
    
    def __init__(self, first, last, salary):
        print("입사를 축하합니다.")
        self.first = first
        self.last = last
        self.salary = salary
        self.id = first.lower() + last.lower() + "@euc.com"
        self.mileage = 100_000
        
    def save_mileage(self, point):
        self.mileage += int(point + (self.salary)*self.rate)
        print("추가 포인트는 {}점, 누적 마일리지는 {}점 입니다".format(point, self.mileage))
        
        
 emp = Employee('gildong','hong', 1_000)
 emp.save_mileage(10_000)
 emp.rate

 

3. Mangling

- Employee.rate는 원래 Employee 클래스의 rate 

- emp2의 객체에서 self로 적용된 변수들은 emp2에서만 적용됨

- Employee와 전혀 다른 클래스 객체

- Employee().rate = 로 바꾸면 (객체가 아닌) 클래스 rate가 변함

class Employee:
    mileage = 0
    rate = round(1/15,2)
    
    def __init__(self, first, last, salary):
        print("입사를 축하합니다.")
        self.first = first
        self.last = last
        self.salary = salary
        self.id = first.lower() + last.lower() + "@euc.com"
        self.mileage = 100_000
        
    def save_mileage(self, point):
    	# self.rate -> Employee.rate
        self.mileage += int(point + (self.salary) * Employee.rate)
        print("추가 포인트는 {}점, 누적 마일리지는 {}점 입니다".format(point, self.mileage))
        
        
emp2 = Employee('mugae','ah',1_000)
emp2.rate=0.7
# emp2의 rate 값은 바뀌었지만 self 가 아니기 때문에 Employee 클래스의 rate 값 적용
emp2.save_mileage(10_000)

 

- Mangling : 클래스 변수에 접근할 수 없도록 설정하는 방법

- 변수명 앞에 __를 붙여서 사용

- 클래스 내에서 선언한 순간 접근, 변경 불가능

class Employee:
    mileage = 0
    rate = round(1/15,2)
    
    def __init__(self, first, last, salary):
        print("입사를 축하합니다.")
        self.first = first
        self.last = last
        self.salary = salary
        self.id = first.lower() + last.lower() + "@euc.com"
        self.mileage = 100_000
        self.__rate = round(1/15,2)
        
    def save_mileage(self, point):
        self.mileage += int(point + (self.salary)*self.__rate)
        print("추가 포인트는 {}점, 누적 마일리지는 {}점 입니다".format(point, self.mileage))
        
emp = Employee('gildong','hong', 1_000)
emp.rate = 0.7
emp.__rate = 0.7
Employee.rate = 0.7
Emplyee.__rate = 0.7
# 모두 0.7이라고 뜨지만 
emp.save_mileage(10_000)
# 실행하면 결과 값의 rate는 0.07

상속 받을 때 슈퍼 클래스 __init__에서 생성자 모두 다시 써줘야함