# Understanding Inheritance of classes

**1️⃣** 클래스 상속의 정의 (Definition of Class Inheritance)  
**2️⃣** 클래스 상속의 사용 (Usage of Class Inheritance)  
**3️⃣** 클래스의 생성자 사용 (Using Class Constructors)  
**4️⃣** 부모 클래스 정의 (Defining Super Classes)  
**5️⃣** 자식 클래스 정의 (Defining Sub Classes)  
**6️⃣** 클래스 상속의 사용 (Applying Class Inheritance)  
**7️⃣** 메소드 오버라이딩 (Method Overriding)  
**8️⃣** 부모 메서드 호출 (Calling Parent Methods)

---

## **1️⃣** 클래스 상속의 정의  
(Definition of Class Inheritance)

**<mark>클래스는 상속을 통해 부모 클래스의 속성을 모두 가지고 올 수 있다.<br>부모 클래스를 superclass라고 하고, 자식 클래스를 subclass라고 한다.<br>메소드 오버라이딩 기법을 통해 메서드를 자식 클래스에서 재정의 할 수 있다.</mark>**

클래스의 상속이란 기존의 클래스의 속성과 메서드를 새로운 클래스가 물려받아 이를 재정의 및 재사용 하는 것을 뜻한다. 이를 통해 코드 재사용성과 확장성을 높일 수 있다.

---

## **2️⃣** 클래스 상속의 사용  
(Usage of Class Inheritance)

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1721015207458/68f8ccc7-de84-468f-8f2e-1b7b1e9d2c44.png align="center")

부모 클래스 (Parent Class): `Country`

```python
class Korea(Country): #물려 받고 싶은 클라스를 괄호()안에 쓴다.
    pass #country에 없는 메소드는 이곳에 추가하여 기존의 클래스를 재사용 
```

**자식 클래스 (Child Classes):** `Korea`, `US`

기존 클래스 `Country`의 속성을 물려받아 이를 재정의 및 재사용한다.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1721024170964/59ec9425-a2da-4a52-8b58-95bad11712aa.png align="center")

---

## **3️⃣** 클래스의 생성자 사용  
(Using Class Constructors)

생성자(constructor)란 객체가 생성될 때 자동으로 호출되는 메서드를 의미한다. 주로 초기값을 설정할때 생성자를 사용한다. 파이썬 메서드명으로 `__init__`를 사용하면 이 메서드는 생성자가 된다. `__init__` 메서드의 init 앞뒤로 붙은 `__`는 밑줄(`_`) 2개를 붙여 쓴 것이다.

```python
class Korea(Country): #물려 받고 싶은 클라스를 괄호()안에 쓴다.

    def __init__(self): #파라미터가 없을시엔 self만 써도 OK
        print("생성자가 수행되었습니다.")
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1721015692723/3ad057c2-966c-4be9-944d-5c4375df7a25.png align="center")

💡생성자가 parameter 개수를 맞추지 못할경우 아래와 같은에러가 발생한다.  
💡생성자 parameter 규칙을 맞추며 클래스를 객체화해야 한다. (2번째)

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1721023375815/de073602-1def-4b7f-af95-2ebae65b87cb.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1721023557493/0c5c06fc-cd39-46b4-9414-5d28603b6922.png align="center")

---

## **4️⃣** 부모 클래스 정의  
(Defining super Classes)

Country 클래스의 정의

```python
class Country: #super class definition

    name = '국가명'
    population = '인구'
    capital = '수도'

    def show(self): #Country는 show라는 메소드를 가지고있다.
        print('국가 클래스의 메소드입니다.') #show 메소드의 역할은 문자 display
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1721023682949/2fb4127f-0aeb-45ac-88c0-6a3442b85bf3.png align="center")

---

## **5️⃣** 자식 클래스 정의  
(Defining Sub Classes)

Country 클래스를 상속하여 Korea 클래스 만들기

```python
class Korea(Country): #클래스를 사용할땐 첫글자를 대문자로 입력하여 함수와 구분

    def __init__(self,name): #Korea 클라스가 Country를 상속받았기 때문에 생성자가
#만들어졌다. 매개변수는 name이다. 아래에 언급된 대한민국이 여기로 넘어온다.
        self.name = name

    def show_name(self):
        print('국가 이름은 :', self.name)
```

---

## **6️⃣** 클래스 상속의 사용  
(Applying Class Inheritance)

```python
a = Korea('대한민국') #대한민국이라는 인자값은 생성자로 넘어가게된다.
a.show #이 메소드는 3.부모 클래스 정의되었기 때문에 "국가 ~입니다."가 결과값으로 뜸
국가 클래스의 메소드입니다.
a.show_name() #5.자식클래스에서 이미 정의된 메소드이다.
국가 이름은: 대한민국
a.capital #자식클래스에서 따로 정의하지 않았기때문에 결과는 그대로이다.
'수도'
a.name #자식클래스에서 '대한민국' 인스턴트 변수로 정의하였기 때문에 결과는 대한민국
대한민국
a.population() #자식클래스 확인후 변수가없다면 부모클래스의 객체를 따라간다.
'인구'
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1721023587679/479b3444-9307-4e13-9708-91403c27a3d7.png align="center")

---

## **7️⃣** 메소드 오버라이딩  
(Method Overriding)

부모 클래스의 메서드를 재사용하는 것을 뜻한다. 즉 부모클래스에서 이미 정의된 메소드를 조금 고쳐쓰고 싶을때 사용한다.

✅ **부모 클래스의 메서드를 재사용**

```python
class Korea(Country):

    def __init__(self, name, population, capital)
        self.name = name
        self.population = population
        self.capital = capital

    def show(self): #부모클래스에서 물려받은 show더라도 기존의 클래스는 무효처리
        print( #아래의 메소드가 유효한 메소드로 재정의 되었다.
          """
          국가의 이름은 {} 입니다.
          국가의 인구는 {} 입니다.
          국가의 수도는 {} 입니다.
          """.format(self.name, self.population, self.capital)
        )
```

✅ **메소드 오버라이딩의 사용**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1721025001399/5c982bee-9789-44bc-8a87-7c70012f9086.png align="center")

```python
a = Korea ('대한민국', 50000000, '서울') #파라미터 3 위의 def init보면 파라미터 3개
a.show() #재정의한 메소드가 수행되었다.

    국가의 이름은 대한민국 입니다.
    국가의 인구는 5000000 입니다.
    국가의 수도는 서울 입니다.
```

---

## **8️⃣** 부모 메서드 호출  
(Calling super Methods)

super() 키워드를 사용해서 부모 메서드를 호출할 수 있다.

```python
class Korea(Country):
    ...생갹
    def show(self): #메소드 오버라이딩시 부모클래스의 기능도 사용하고 싶을때 사용
        super().show() #spuer는 부모클래스를 뜻함 .이후로 country의 메소드사용가
        print(
          """        
          국가의 이름은 {} 입니다.
          국가의 인구는 {} 입니다.
          국가의 수도는 {} 입니다.
          """.format(self.name, self.population, self.capital)
        )
```

---

QUIZ

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1721025089922/c0dda780-6fc2-4988-84da-ecac0173404b.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1721025114232/2218ef28-4e27-427b-bd3b-05b958d3b138.png align="center")
