# 클래스 - 상속

### 코드

{% 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 %}

### 검색 키워드

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://codebook.horang.it/readme/undefined-5.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
