> For the complete documentation index, see [llms.txt](https://codebook.horang.it/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://codebook.horang.it/readme/undefined-5.md).

# 클래스 - 상속

### 코드

{% code title="부모 클래스 선언 (기본 설계도)" %}

```
약속, (부모클래스명)
    약속, __준비__
        자신.(속성) = (값)
    
    약속, (매개변수) (기능명)  # 부모기능(메서드) 정의
        (실행할 코드)
        (반환할 데이터) 반환하기
```

{% endcode %}

{% code title="자식 클래스 선언 (상속받기/물려받기)" %}

```
약속, (자식클래스명)(부모클래스명)
    약속, __준비__ (매개변수)
        상위.__준비__        # 부모의 준비 과정 실행
        자신.(새속성) = (매개변수)
```

{% endcode %}

{% code title="자식 클래스 활용하기" %}

```
변수 = 새 (자식클래스명)(인자)  # 인스턴스 생성
변수.(기능명)                 # 부모 또는 자식의 기능 호출
```

{% endcode %}

***

### 설명

* **상속**: 이미 잘 만들어진 클래스(부모)의 기능을 그대로 이어받아 새로운 클래스(자식)를 만드는 것입니다. 중복되는 코드를 줄여줍니다.
* **상위(super)**: 자식 클래스 안에서 부모 클래스의 영역을 가리키는 말입니다. 부모의 초기화 설정(`__준비__`)이나 약속을 가져올 때 사용합니다.
* **코드 재사용**: 자식 클래스(`저금통계좌`)는 직접 만들지 않은 `입금하기`, `출금하기` 기능을 부모(`계좌`)에게 물려받아 자기 것처럼 사용할 수 있습니다.

***

### 주의사항

* **상속 선언**: `약속, 자식(부모)`처럼 반드시 괄호 안에 부모 클래스 이름을 써주어야 상속이 이루어집니다.
* **준비의 연결**: 자식 클래스에서 `__준비__`를 정의했다면, 부모가 정해둔 기본 변수(`자신.금액`)를 사용할 수 있도록 `상위.__준비__`를 꼭 호출해야 합니다.

***

### 파이썬 대응 코드

```
# 부모 클래스: 계좌
class Account:
    def __init__(self):
        self.balance = 0 

    # 입금하기 속성(메소드) 정의
    def deposit(self, amount):
        self.balance += amount
        print(f"{amount}원이 입금되어 총 {self.balance}원 입니다.")
    
    # 출금하기 속성(메소드) 정의
    def withdraw(self, amount):
        if self.balance >= amount:
            self.balance -= amount
            print(f"{amount}원이 출금되어 총 {self.balance}원 입니다.")
        else:
            print("잔액이 부족합니다.")

# 자식 클래스: 저금통계좌 (Account를 상속받음)
class PiggyBank(Account):
    def __init__(self):
        super().__init__() # 부모의 생성자 호출
    
    # 자식 클래스의 용돈받기 속성(메소드) 정의
    def receive_allowance(self, allowance):
        self.deposit(allowance) # 부모의 기능(입금하기)을 내 것처럼 사용
        return self.balance # 자신.금액 반환하기

# --- 실행 부분 ---
my_account = PiggyBank() # 내계좌 = 새 저금통계좌
my_account.deposit(3000) # 내계좌.(3000)원 입금하기
my_account.withdraw(5000) # 내계좌.(5000)원 출금하기
print(my_account.receive_allowance(2000)) # 내계좌.(2000)원 용돈받기 보여주기
```

***

### 예시

{% code title="예시 코드" %}

```
# 부모 클래스: 모든 계좌의 공통 기능을 정의
클래스, 계좌
    # 인스턴스가 만들어질 때 처음 실행되는 약속
    약속, __준비__
        자신.금액 = 0  # 모든 계좌는 처음에 0원으로 시작

    # 금액을 더하는 기능
    약속, (입금액)원 입금하기
        자신.금액 += 입금액
        입금액 + "원이 입금되어 총 " + 자신.금액 + "원 입니다." 보여주기
    
    # 금액을 빼는 기능 (잔액 확인 절차 포함)
    약속, (출금액)원 출금하기
        만약 자신.금액 >= 출금액 이면
            자신.금액 -= 출금액
            출금액 + "원이 출금되어 총 " + 자신.금액 + "원 입니다." 보여주기
        아니면
            "잔액이 부족합니다." 보여주기

# 자식 클래스: '계좌'의 기능을 물려받아 새로운 기능을 추가
클래스, 저금통계좌(계좌)
    # 저금통은 처음에 돈을 넣고 시작할 수 있도록 인자를 받음
    약속, __준비__
        상위.__준비__          # 부모(계좌)의 준비 과정을 먼저 실행
    
    # 저금통만의 특별한 약속
    약속, (용돈)원 용돈받기
        자신.(용돈)원 입금하기  # 부모에게 물려받은 '입금하기' 기능을 사용
        자신.금액 반환하기      # 현재 잔액을 결과값으로 돌려줌

# --- 실행 부분 ---
# 새로운 저금통 인스턴스를 만듦
내계좌 = 새 저금통계좌

# 부모에게 물려받은 입금 기능을 사용 (결과: 3000원)
내계좌.(3000)원 입금하기

# 부모에게 물려받은 출금 기능을 사용 (결과: 잔액부족)
내계좌.(5000)원 출금하기

# 자식이 새로 만든 기능을 사용하고, 반환된 값을 보여줌 (결과: 5000원 출력)
내계좌.(2000)원 용돈받기 보여주기
```

{% endcode %}

{% code title="예시 코드의 출력" %}

```
3000원이 입금되어 총 3000원 입니다.
잔액이 부족합니다.
2000원이 입금되어 총 5000원 입니다.
5000
```

{% endcode %}

### 검색 키워드

클래스, 상속, 부모 클래스, 자식 클래스, 상위, 자신, 인스턴스, 메서드, 속성, 객체지향
