캡슐화(encapsulation)
- 접근을 제한하여 객체의 세부 내용을 외부로부터 감추는 기법
- 특정 변수명을 알려주지 않아 직접 참조하지 못하도록 하고, 변수에 값을 할당하거나 값을 얻어내는 기법
- 변수 앞부분에 __(언더바 두 개)를 붙이면 외부에서 접근 불가능한 private 변수가 됨
- 변수를 외부에서 접근할 수 있는 공용 인터페이스 : getter, setter
- 메서드명 앞쪽에 get, set을 표시해주는 것이 좋음
상속(inheritance)
- 클래스 간 계층적 관계 구성
- 코드 재사용성 향상, 다형성의 문법적 토대
- class 자식클래스명(부모클래스명) 형식으로 자식 클래스 선언. 자식이 부모를 지정.
- 자식 클래스는 부모 클래스의 멤버를 상속받지만, 생성자는 제외됨
- 자식클래스 생성자 내부에서 super().__init()__(매개변수) 형태로 부모클래스 생성자를 강제로 호출.
- super는 파이썬에서 제공되는 클래스
메서드 오버라이딩(method override)
- 부모 클래스에서 상속받은 메서드를 자식 클래스에서 내용을 수정하거나 확장하는 것
- 즉, 자식 클래스에서 같은 이름의 메서드의 내용을 변경하여 재정의 하는 것
- 다형성 : 하나의 참조변수로 여러 타입의 객체를 참조할 수 있는 것 (같은 이름으로 다양한 형태의 기능 호출 가능)
참조변수들끼리의 할당 이후에 발생하는 것. 상속 관계에서만 가능.
- 상속관계에서의 메서드 재정의를 통해 메서드의 다형성(polymorphism)이 구현됨
- 부모와 자식 객체를 각각 생성한 후 부모 클래스의 참조변수에 자식 객체의 참조변수를 할당하면
부모 객체의 참조변수를 이용하여 해당 자식 객체의 멤버를 호출할 수 있음.
- 여러 클래스의 객체를 생성하고 변수에 할당하면 같은 이름의 메서드를 호출하여 다른 기능을 실행
메소드 오버로딩(method overloading)
- 한 개의 클래스 내에서 이름이 동일한 메소드를 여러 개 정의하는 것
- 매개변수의 갯수와 형식을 다르게 지정하여 구분
- 파이썬에서 정식으로 지원하고 있지 않아 오류 발생
- 파이썬에서는 def 메소드명(self, *변수명) 형식으로 Arbitrary Argument List를 활용하여 오버로딩처럼 구현 가능
인수를 여러개 넣으면 리스트로 반환해줌.
- multipledispatch 라이브러리를 설치하여 오버로딩을 구현할 수도 있음 (아래 예시)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # cmd > pip install multipledispatch로 라이브러리 설치 from multipledispatch import dispatch class SampleC : # 1 @dispatch(int, int) # 어노테이션 def product(self, x, y): return x * y # 2 @dispatch(int, int, int) def product(self, x, y, z): return x * y * z # 3 @dispatch(float, float, float) def product(self, x, y, z): return x * y * z c = SampleC() print(c.product(3, 4)) # 1번 메소드 실행 | cs |
Q. 클래스 3개를 생성하고, 부모클래스에서 생성자를 상속받고, 메소드 오버라이드를 하여 아래의 조건을 만족하는 코드를 구현.
부모 클래스 : Employee. 생성자와 pay_calc 메서드를 가짐
자식 클래스 1 : Permanent. 급여 = 기본급 + 상여금
자식 클래스 2 : Temporary. 급여 = 작업시간 * 시급
자식 클래스 3 : Alba. 급여 = 작업시간 * 시급 + 수당. 160시간 이상 근무 했을 때는 근무 수당 시급 * 8시간 추가.
A.
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 | # (1) 부모클래스 class Employee: name = None; pay = 0 def __init__(self, name): # 생성자 self.name = name def pay_calc(self): # 메서드 pass # (2) 자식클래스 : 정규직 class Permanent(Employee): # Employee 클래스 상속받음 def __init__(self, name): super().__init__(name) # 부모 생성자 호출 def pay_calc(self, base, bonus): # 메소드 오버라이드 self.pay = base + bonus # 급여 = 기본급+상여금 print('총 수령액 : ', format(self.pay, '3,d'),'원') # (3) 자식클래스 : 임시직 class Temporary(Employee): def __init__(self, name): super().__init__(name) def pay_calc(self, tpay, time): self.pay = tpay * time print('총 수령액 : ', format(self.pay, '3,d'),'원') # (3) 자식클래스 : 알바 class Alba(Employee): def __init__(self, name): super().__init__(name) def pay_calc(self, tpay, time): if time >= 160 : self.pay = tpay * time + (tpay * 8) # 급여 = 작업시간*시급 +(수당) elif time < 160 : self.pay = tpay * time # 급여 = 작업시간*시급 print('총 수령액 : ', format(self.pay, '3,d'),'원') # (4) 객체 생성 p = Permanent("이순신") p.pay_calc(3000000, 200000) t = Temporary("홍길동") t.pay_calc(15000, 80) a = Alba("알바") a.pay_calc(20000,160) | cs |
'study > python' 카테고리의 다른 글
파이썬 데이터베이스 - MySQL 연동하는 법과 SQL문 활용 (0) | 2022.06.13 |
---|---|
파이썬 데이터베이스 - sqlite3 설치와 SQL문 (0) | 2022.06.13 |
파이썬 클래스(class) - 클래스 멤버 (0) | 2022.06.07 |
파이썬 함수(function) 생성, 호출 예제 (0) | 2022.06.02 |
파이썬 셋(set) 예제 (0) | 2022.06.02 |
댓글