파이썬의 클래스와 Java의 클래스를 비교해가면서 알아보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class Test : __num = 5 def __init__ (self) : pass def get_num (self) : return self.__num def set_num (self, num) : self.__num = num test = Test() print(test.get_num())
위의 파이썬 소스는 아래의 Java 소스와 같다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public class Test { private int num = 5 ; public Test() {} public int getNum() { return num; } public void setNum(int num) { this.num = num; } } class TestMain { public static void main(String[] args) { Test test = new Test(); System.out.println(test.getNum()); //5 // System.out.println(test.num); //컴파일 에러 - num has private access } }
파이썬 class의 유연성 1 2 3 4 test.test = "테스트" print(test.test) test.f = lambda : print("함수 확인" ) test.f()
사용해야할 때는 위와 같이 사용하고 난 후, 지워야할 때는 del
을 이용해서 지워주면 된다.
클래스 상속 type 1 2 3 print(type(test)) print(type(Test)) print(type(int))
인스턴스는 클래스를 상속 받고, 클래스는 type을 상속 받는다.
그러면 type이 최상위일까 생각을 하였는데 type 코드를 보면 class type(object):
으로 쓰여져 있는 것을 볼 수 있다. 최상위 객체는 object 이다.
Override 파이썬에서 오버라이딩은 Annotation이 필요없다.
Overloading 파이썬은 오버로딩을 지원하지 않는다.
사용하기 위해서는 별도의 라이브러리를 써야한다.
1 2 3 4 5 6 class A : def first (self, f=None) : if f is not None : print 'first met' , f else : print 'first method'
위와 같이 하는 것도 하나의 방도이다.
Pratice 클래스에 대해서 이해하기 위해 실습을 하나 진행
자바에서 공부했던 클래스를 파이썬으로 구현해보자.
https://github.com/TaeJuneJoung/Java/tree/master/src/Chater5
Customer과 VIPCustomer을 구현해보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 class Customer : __cutomerID = 10000 __customerName = None __customerGrade = None __bonusPoint = 0 __bonusRatio = 0.0 """ Constructor """ def __init__ (self) : self.setCustomerGrade("SILVER" ) self.setbonusRatio(0.01 ) self.setCustomerID(self.getCustomerID() + 10 ) """ Method """ def calcPricer (self, price) : self.__bonusPoint += int(price * self.__bonusRatio) return price def showCustomerInfo (self) : return f'{self.getCustomerName()} 님의 등급은 {self.getCustomerGrade()} 이며, 적립된 보너스 포인트는 {self.getBonusPoint()} 점 입니다.' """ Getter & Setter """ def getCustomerID (self) : return self.__cutomerID def setCustomerID (self, customerID) : self.__customerID = customerID def getCustomerName (self) : return self.__customerName def setCustomerName (self, customerName) : self.__customerName = customerName def getCustomerGrade (self) : return self.__customerGrade def setCustomerGrade (self, customerGrade) : self.__customerGrade = customerGrade def getBonusPoint (self) : return self.__bonusPoint def setBonusPoint (self, bonusPoint) : self.__bonusPoint = bonusPoint def getbonusRatio (self) : return self.__bonusRatio def setbonusRatio (self, bonusRatio) : self.__bonusRatio = bonusRatio from Customer import Customerclass VIPCustomer (Customer) : __agentID = 1 __saleRatio = 0.0 """ Constructor """ def __init__ (self) : self.setCustomerGrade('VIP' ) self.setbonusRatio(0.05 ) self.setSaleRatio(0.1 ) """ Method """ def calcPricer (self, price) : self.setBonusPoint(int(price * self.getbonusRatio())) return int(price - price * self.getSaleRatio()) """ Getter & Setter """ def getAgentID (self) : return self.__agentID def setAgentID (self, agentID) : if agentID > 0 and type(agentID) == int: self.__agentID = agentID else : print("컨설턴트ID는 숫자며, 자연수여야 합니다." ) def getSaleRatio (self) : return self.__saleRatio def setSaleRatio (self, saleRatio) : if saleRatio >= 0.0 and saleRatio < 1.0 : self.__saleRatio = saleRatio else : print("할인율 오류가 발생하였습니다." ) from Customer import Customerfrom VIPCustomer import VIPCustomercustomerLee = Customer() customerLee.setCustomerName("이순신" ) customerKim = VIPCustomer() customerKim.setCustomerName("김유신" ) print(customerLee.showCustomerInfo()) print(customerKim.showCustomerInfo()) priceLee = customerLee.calcPricer(10000 ) priceKim = customerKim.calcPricer(10000 ) print(f'{customerLee.getCustomerName()} 님의 지불하실 금액은 {priceLee} 원 입니다.' ) print(customerLee.showCustomerInfo()) print(f'{customerKim.getCustomerName()} 님의 지불하실 금액은 {priceKim} 원 입니다.' ) print(customerKim.showCustomerInfo())
isinstance / issubclass 위의 코드를 이용하여 확인해보자.
isinstance 1 2 3 4 5 6 7 isinstance(object, type) print(isinstance(Customer, VIPCustomer)) print(isinstance(customerLee, Customer)) print(isinstance(customerKim, Customer)) print(isinstance(customerLee, VIPCustomer)) print(isinstance(customerKim, VIPCustomer))
issubclass 1 2 3 issubclass(sub type, super type) print(issubclass(VIPCustomer, Customer)) print(issubclass(Customer, VIPCustomer))