본문 바로가기
study/python

파이썬 클래스(class) - 캡슐화, 상속, 메서드 오버라이딩

by kuah_ 2022. 6. 9.

 

 

 

 

캡슐화(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(intint# 어노테이션
    def product(self, x, y):                                    
        return x * y
 
    # 2
    @dispatch(intintint)
    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
 
= SampleC()
print(c.product(34)) # 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) 객체 생성
= Permanent("이순신")
p.pay_calc(3000000200000)
= Temporary("홍길동")
t.pay_calc(1500080)
= Alba("알바")
a.pay_calc(20000,160)
cs

 

 

 

 

댓글